Her bağlantı, iş yapıyor da olsa bekliyor da olsa bellek harcar. Bellek tavanına çoktan dayanmış bir sunucuda sınırı yükseltmek, bir veritabanı hatasını takasa düşen bir makineye çevirir - ki bu daha kötüdür.
Neyin bağlı olduğuna bakın
SHOW PROCESSLIST;
SHOW STATUS LIKE 'Threads_connected';
SHOW VARIABLES LIKE 'max_connections';
- Sleep durumunda çok sayıda satır - açılmış ve hiç kapatılmamış bağlantılar. Bu bir uygulama sorunudur, veritabanı sorunu değil.
- AYNI sorguyu çalıştıran çok sayıda satır - bitmesinden daha hızlı gelen tek bir yavaş sorgu. Sorguyu düzeltin.
- Uzun süren Locked satırları - bir kilidi tutan tek bir işlem ve arkasında kuyruğa giren her şey.
Hiç kapatılmayan bağlantılar
Döngünün her turunda bir bağlantı açan bir betik ya da sunucunun izin verdiğinden büyük bir kalıcı bağlantı havuzu, sınır ne kadar yüksek olursa olsun onu tüketir.
SHOW VARIABLES LIKE 'wait_timeout';
-- default is often 28800: eight hours of holding a sleeping connection
wait_timeout'u birkaç dakikaya düşürmek terk edilmiş bağlantıları geri kazandırır. Bu bir sızıntının altına gerilmiş bir ağdır, ilaç değil.
Onu yükseltmenin DOĞRU olduğu durum
Bağlantıların hepsi gerçek bir iş yapıyorsa ve sunucunun artan belleği varsa, sınır gerçekten fazla düşüktür.
SET GLOBAL max_connections = 300;
-- and in my.cnf so it survives a restart
Önce bağlantı başına belleği hesaplayın. Her biri 12 MB olan 300 bağlantı, veritabanı tek bir satırı bile önbelleğe almadan 3,6 GB eder.
Sabit bir saatte bağlantılarda görülen ani sıçrama trafik değil, bir zamanlanmış görevdir. Sıçrama sırasındaki süreç listesi onu tek satırda adıyla söyler.
