دليل الاستجابة
تجمع اتصال قاعدة البيانات مستنفد
الأعراض
- أخطاء "QueuePool limit of size … overflow" أو "too many clients already".
- /health يرد 503 لخدمة واحدة أو أكثر.
التحقق
check.sh
# How many connections does Postgres see? docker exec via_prod-identity-db psql -U "$IDENTITY_POSTGRES_USER" -d "$IDENTITY_POSTGRES_DB" -c \ "SELECT state, count(*) FROM pg_stat_activity GROUP BY state;" # Long-running queries (> 30s) docker exec via_prod-identity-db psql -U "$IDENTITY_POSTGRES_USER" -d "$IDENTITY_POSTGRES_DB" -c \ "SELECT pid, age(clock_timestamp(), query_start) AS age, state, query FROM pg_stat_activity WHERE state != 'idle' AND query_start < NOW() - INTERVAL '30s' ORDER BY age DESC LIMIT 10;" # Gunicorn worker count vs pool size — pool must be >= workers × request concurrency docker exec via_prod-orders-service env | grep -E 'GUNICORN_WORKERS|POOL_SIZE|MAX_OVERFLOW'
المعالجة
- أنهِ الاستعلامات المعلقة:cancel.sql
SELECT pg_cancel_backend(pid) FROM pg_stat_activity WHERE state != 'idle' AND query_start < NOW() - INTERVAL '5m';
- أعد تشغيل الخدمة المتأثرة لتحرير الاتصالات:
docker compose -f docker-compose.prod.yml restart <svc>. - إذا ما زال يحدث: ارفع DB_POOL_SIZE أو اخفض GUNICORN_WORKERS وأعد النشر.
ما بعد الحادث
- ابحث عن تسريب اتصال في السجل (async session بدون إغلاق).
- أضف مقياساً: pg_stat_activity count → Grafana dashboard.