diff --git a/test_runner/performance/test_pageserver_startup_many_tenants.py b/test_runner/performance/test_pageserver_startup_many_tenants.py index 03fd5aee75..149af88ffd 100644 --- a/test_runner/performance/test_pageserver_startup_many_tenants.py +++ b/test_runner/performance/test_pageserver_startup_many_tenants.py @@ -1,20 +1,19 @@ -import asyncio -from pathlib import Path import queue import shutil import subprocess import threading +from pathlib import Path from typing import List, Optional + from fixtures.neon_fixtures import ( NeonEnv, NeonEnvBuilder, PgBin, last_flush_lsn_upload, ) -from fixtures.types import TenantId -from fixtures.remote_storage import LocalFsStorage, RemoteStorageKind -from fixtures.log_helper import log from fixtures.pageserver.utils import wait_until_tenant_active +from fixtures.remote_storage import LocalFsStorage, RemoteStorageKind +from fixtures.types import TenantId def duplicate_tenant( @@ -59,6 +58,24 @@ def test_pageserver_startup_many_tenants(neon_env_builder: NeonEnvBuilder, pg_bi TEST_OUTPUT=/mnt/many_tenants NEON_BIN=$PWD/target/release DEFAULT_PG_VERSION=15 ./scripts/pytest --preserve-database-files --timeout=0 ./test_runner/performance/test_pageserver_startup_many_tenants.py + Then + + export NEON_REPO_DIR=/mnt/many_tenants/test_pageserver_startup_many_tenants/repo + + # edit $NEON_REPO_DIR/pageserver_1/pageserver.toml to use metric collection, + # with intervals from prod: + # + # metric_collection_endpoint = "https://127.0.0.1:6666" + # metric_collection_interval: 10min + # cached_metric_collection_interval: 0s + + # run a fake metric collection endpoint in some other terminal using + # python3 -m http.server 6666 + + # then start pageserver + ./target/release/neon_local start + + """ neon_env_builder.enable_pageserver_remote_storage(RemoteStorageKind.LOCAL_FS) @@ -71,7 +88,6 @@ def test_pageserver_startup_many_tenants(neon_env_builder: NeonEnvBuilder, pg_bi # cleanup initial tenant env.pageserver.tenant_detach(env.initial_tenant) - # create our template tenant tenant_config_mgmt_api = { "gc_period": "0s", @@ -89,7 +105,7 @@ def test_pageserver_startup_many_tenants(neon_env_builder: NeonEnvBuilder, pg_bi template_tenant, template_timeline = env.neon_cli.create_tenant(conf=tenant_config_cli) ep = env.endpoints.create_start("main", tenant_id=template_tenant) ep.safe_psql("create table foo(b text)") - for i in range(0, 8): + for _i in range(0, 8): ep.safe_psql("insert into foo(b) values ('some text')") last_flush_lsn_upload(env, ep, template_tenant, template_timeline) ep.stop_and_destroy() @@ -117,9 +133,20 @@ def test_pageserver_startup_many_tenants(neon_env_builder: NeonEnvBuilder, pg_bi for w in workers: w.join() + # for evaluation, use the same background loop periods as in prod + benchmark_tenant_config = {k: v for k, v in tenant_config_mgmt_api.items()} + del benchmark_tenant_config["compaction_period"] + del benchmark_tenant_config["gc_period"] + benchmark_tenant_config["eviction_policy"] = { + "kind": "LayerAccessThreshold", + "period": "10m", + # don't do evictions + "threshold": "1000d", + } + assert ps_http.tenant_list() == [] for tenant in new_tenants: - env.pageserver.tenant_attach(tenant, config=tenant_config_mgmt_api) + env.pageserver.tenant_attach(tenant, config=benchmark_tenant_config) for tenant in new_tenants: wait_until_tenant_active(ps_http, tenant)