~/کدولاگ
→ همه‌ی مقاله‌ها

Connection Pooling بدون تله‌های پنهان

پول‌ها هزینه‌ی باز کردن اتصال را حل می‌کنند — اما یک پول با تنظیمات غلط با کمال میل دیتابیس شما را از پا درمی‌آورد. اینجا نحوه‌ی تعیین اندازه‌ی درست آن را می‌بینیم.

postgresعملکرددیتابیس

باز کردن یک اتصال دیتابیس گران است: یک دست‌دهی TCP، TLS، و احراز هویت، پیش از اجرای حتی یک کوئری. یک پول (pool) مجموعه‌ای از اتصالات زنده را نگه می‌دارد و بنا به نیاز آن‌ها را تحویل می‌دهد.

نکته‌ی خلاف‌شهود

اتصالات بیشتر به معنای throughput بیشتر نیست. Postgres به ازای هر اتصال کار واقعی انجام می‌دهد (یک پردازه‌ی backend، حافظه، حسابداری قفل‌ها). از یک نقطه به بعد، افزودن اتصالات به‌خاطر رقابت بر سر منابع همه‌چیز را کندتر می‌کند.

یک فرمول شروعِ پراستناد:

connections = (core_count * 2) + effective_spindle_count

برای اکثر دیتابیس‌های ابری روی SSD، این عدد جایی بین ۱۰ تا ۳۰ می‌افتد — خیلی کمتر از چیزی که مردم انتظار دارند.

تنظیماتی که اهمیت دارند

  • حداکثر اندازه — سقف. این را در تمام نمونه‌های اپلیکیشن جمع بزنید.
  • زمان‌سنج بیکاری — اتصالات بیکار را برگردانید تا آن‌ها را احتکار نکنید.
  • زمان‌سنج دریافت — به‌جای صف‌بندی بی‌پایان، سریع شکست بخورید.

اگر ده pod اپلیکیشن هرکدام یک پول ۲۰-اتصالی روی دیتابیسی باز کنند که فقط ۱۰۰ اتصال اجازه می‌دهد، سرور را تمام می‌کنید و خطای too many clients می‌بینید. وقتی از پول‌های سطح-اپلیکیشن فراتر رفتید، یک پولر مثل PgBouncer جلوی آن قرار دهید.