From f0b1b57ae2606b0648f7cdfbb017e4635ebde83d Mon Sep 17 00:00:00 2001 From: "2569718930@qq.com" <2569718930@qq.com> Date: Sat, 13 Jun 2026 01:59:28 +0800 Subject: [PATCH] Tune production concurrency for small VPS --- docker-compose.yml | 6 +++--- tests/test_deployment_runtime_config.py | 8 ++++---- tests/test_web_observability.py | 4 ++-- web/services/city_api.py | 8 ++++---- web/services/scan_terminal_config.py | 2 +- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 9da15e2b..43816c37 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -101,8 +101,8 @@ services: environment: POLYWEATHER_REDIS_URL: ${POLYWEATHER_REDIS_URL:-redis://polyweather_redis:6379/0} POLYWEATHER_COLLECTOR_PATCH_ENDPOINT: '' - POLYWEATHER_CITY_DETAIL_BATCH_CONCURRENCY: ${POLYWEATHER_CITY_DETAIL_BATCH_CONCURRENCY:-3} - POLYWEATHER_CITY_DETAIL_BATCH_GLOBAL_CONCURRENCY: ${POLYWEATHER_CITY_DETAIL_BATCH_GLOBAL_CONCURRENCY:-2} + POLYWEATHER_CITY_DETAIL_BATCH_CONCURRENCY: ${POLYWEATHER_CITY_DETAIL_BATCH_CONCURRENCY:-2} + POLYWEATHER_CITY_DETAIL_BATCH_GLOBAL_CONCURRENCY: ${POLYWEATHER_CITY_DETAIL_BATCH_GLOBAL_CONCURRENCY:-1} POLYWEATHER_CITY_DETAIL_BATCH_QUEUE_WAIT_MS: ${POLYWEATHER_CITY_DETAIL_BATCH_QUEUE_WAIT_MS:-3000} POLYWEATHER_CITY_DETAIL_BATCH_PARTIAL_TIMEOUT_MS: ${POLYWEATHER_CITY_DETAIL_BATCH_PARTIAL_TIMEOUT_MS:-8000} POLYWEATHER_OBSERVATION_COLLECTOR_AMOS_SEC: ${POLYWEATHER_OBSERVATION_COLLECTOR_AMOS_SEC:-60} @@ -114,7 +114,7 @@ services: POLYWEATHER_OBSERVATION_COLLECTOR_MADIS_SEC: ${POLYWEATHER_OBSERVATION_COLLECTOR_MADIS_SEC:-300} POLYWEATHER_OBSERVATION_COLLECTOR_TICK_SEC: ${POLYWEATHER_OBSERVATION_COLLECTOR_TICK_SEC:-30} POLYWEATHER_SCAN_TERMINAL_BUILD_TIMEOUT_SEC: '30' - POLYWEATHER_SCAN_TERMINAL_MAX_WORKERS: '8' + POLYWEATHER_SCAN_TERMINAL_MAX_WORKERS: ${POLYWEATHER_SCAN_TERMINAL_MAX_WORKERS:-2} POLYWEATHER_SCAN_TERMINAL_PREWARM_ENABLED: 'false' POLYWEATHER_SERVICE_ROLE: web UVICORN_WORKERS: ${UVICORN_WORKERS:-2} diff --git a/tests/test_deployment_runtime_config.py b/tests/test_deployment_runtime_config.py index c938eb7c..1f65bcd4 100644 --- a/tests/test_deployment_runtime_config.py +++ b/tests/test_deployment_runtime_config.py @@ -93,13 +93,13 @@ def test_docker_compose_isolates_collector_from_web_and_bot_services(): assert "POLYWEATHER_SCAN_TERMINAL_PREWARM_ENABLED: 'false'" in bot_block assert "POLYWEATHER_SCAN_TERMINAL_PREWARM_ENABLED: 'false'" in web_block assert "POLYWEATHER_SCAN_TERMINAL_BUILD_TIMEOUT_SEC: '30'" in web_block - assert "POLYWEATHER_SCAN_TERMINAL_MAX_WORKERS: '8'" in web_block + assert "POLYWEATHER_SCAN_TERMINAL_MAX_WORKERS: ${POLYWEATHER_SCAN_TERMINAL_MAX_WORKERS:-2}" in web_block assert "POLYWEATHER_SCAN_TERMINAL_PREWARM_ENABLED: 'false'" in collector_block assert "POLYWEATHER_OBSERVATION_COLLECTOR_ENABLED: 'false'" in bot_block assert "POLYWEATHER_OBSERVATION_COLLECTOR_ENABLED: 'false'" in web_block assert "POLYWEATHER_OBSERVATION_COLLECTOR_ENABLED: 'true'" in collector_block - assert "POLYWEATHER_CITY_DETAIL_BATCH_CONCURRENCY: ${POLYWEATHER_CITY_DETAIL_BATCH_CONCURRENCY:-3}" in web_block - assert "POLYWEATHER_CITY_DETAIL_BATCH_GLOBAL_CONCURRENCY: ${POLYWEATHER_CITY_DETAIL_BATCH_GLOBAL_CONCURRENCY:-2}" in web_block + assert "POLYWEATHER_CITY_DETAIL_BATCH_CONCURRENCY: ${POLYWEATHER_CITY_DETAIL_BATCH_CONCURRENCY:-2}" in web_block + assert "POLYWEATHER_CITY_DETAIL_BATCH_GLOBAL_CONCURRENCY: ${POLYWEATHER_CITY_DETAIL_BATCH_GLOBAL_CONCURRENCY:-1}" in web_block assert "POLYWEATHER_CITY_DETAIL_BATCH_QUEUE_WAIT_MS: ${POLYWEATHER_CITY_DETAIL_BATCH_QUEUE_WAIT_MS:-3000}" in web_block assert "POLYWEATHER_CITY_DETAIL_BATCH_PARTIAL_TIMEOUT_MS: ${POLYWEATHER_CITY_DETAIL_BATCH_PARTIAL_TIMEOUT_MS:-8000}" in web_block assert "UVICORN_WORKERS: ${UVICORN_WORKERS:-2}" in web_block @@ -128,7 +128,7 @@ def test_scan_terminal_backend_timeout_returns_before_next_proxy_abort(): assert 'POLYWEATHER_SCAN_TERMINAL_PROXY_TIMEOUT_MS || "35000"' in route_source assert '"POLYWEATHER_SCAN_TERMINAL_BUILD_TIMEOUT_SEC",\n 30,' in config_source - assert '"POLYWEATHER_SCAN_TERMINAL_MAX_WORKERS",\n 8,' in config_source + assert '"POLYWEATHER_SCAN_TERMINAL_MAX_WORKERS",\n 2,' in config_source assert ( '"POLYWEATHER_SCAN_TERMINAL_PREWARM_PAYLOAD_TIMEOUT_SEC",\n 30,' in config_source diff --git a/tests/test_web_observability.py b/tests/test_web_observability.py index ad09ec85..3f12d2e5 100644 --- a/tests/test_web_observability.py +++ b/tests/test_web_observability.py @@ -1063,8 +1063,8 @@ def test_city_detail_batch_partial_timeout_default_stays_below_proxy_budget(monk monkeypatch.delenv("POLYWEATHER_CITY_DETAIL_BATCH_GLOBAL_CONCURRENCY", raising=False) monkeypatch.delenv("POLYWEATHER_CITY_DETAIL_BATCH_QUEUE_WAIT_MS", raising=False) - assert city_api._city_detail_batch_concurrency() == 3 - assert city_api._city_detail_batch_global_concurrency() == 2 + assert city_api._city_detail_batch_concurrency() == 2 + assert city_api._city_detail_batch_global_concurrency() == 1 assert city_api._city_detail_batch_queue_wait_seconds() == 3.0 assert city_api._city_detail_batch_partial_timeout_seconds() == 8.0 diff --git a/web/services/city_api.py b/web/services/city_api.py index e676c072..deb2fcb4 100644 --- a/web/services/city_api.py +++ b/web/services/city_api.py @@ -987,17 +987,17 @@ async def _build_city_detail_batch_item_async( def _city_detail_batch_concurrency() -> int: try: - value = int(os.getenv("POLYWEATHER_CITY_DETAIL_BATCH_CONCURRENCY", "3") or "3") + value = int(os.getenv("POLYWEATHER_CITY_DETAIL_BATCH_CONCURRENCY", "2") or "2") except ValueError: - value = 3 + value = 2 return max(1, min(4, value)) def _city_detail_batch_global_concurrency() -> int: try: - value = int(os.getenv("POLYWEATHER_CITY_DETAIL_BATCH_GLOBAL_CONCURRENCY", "2") or "2") + value = int(os.getenv("POLYWEATHER_CITY_DETAIL_BATCH_GLOBAL_CONCURRENCY", "1") or "1") except ValueError: - value = 2 + value = 1 return max(1, min(4, value)) diff --git a/web/services/scan_terminal_config.py b/web/services/scan_terminal_config.py index 8560f9ca..d83a77a7 100644 --- a/web/services/scan_terminal_config.py +++ b/web/services/scan_terminal_config.py @@ -43,7 +43,7 @@ SCAN_TERMINAL_PREWARM_PAYLOAD_TIMEOUT_SEC = _env_int( ) SCAN_TERMINAL_MAX_WORKERS = _env_int( "POLYWEATHER_SCAN_TERMINAL_MAX_WORKERS", - 8, + 2, min_value=1, max_value=12, )