كلُّ اتّصالٍ يكلّف ذاكرةً سواءٌ أكان يعمل أم ينتظر. ورفعُ الحدّ على خادمٍ بلغ سقف ذاكرته سلفًا يحوّل خطأَ قاعدةِ بياناتٍ إلى جهازٍ يبدّل إلى القرص، وذلك أسوأ.

انظر ما هو متّصل

SHOW PROCESSLIST;
SHOW STATUS LIKE 'Threads_connected';
SHOW VARIABLES LIKE 'max_connections';
  • صفوفٌ كثيرة في Sleep — اتّصالاتٌ فُتحت ولم تُغلق قطّ. مشكلةُ تطبيقٍ لا مشكلةُ قاعدة بيانات.
  • صفوفٌ كثيرة تُنفّذ الاستعلام نفسه — استعلامٌ بطيءٌ واحد، يصل أسرع ممّا ينتهي. أصلح الاستعلام.
  • صفوفٌ في Locked تطول — معاملةٌ واحدة تمسك قفلًا وكلُّ شيءٍ يصطفّ خلفها.

اتّصالاتٌ لا تُغلَق أبدًا

سكربتٌ يفتح اتّصالًا في كلّ دورةٍ من الحلقة، أو حوضُ اتّصالاتٍ دائمة أكبر ممّا يسمح به الخادم، سيستنفد الحدَّ مهما رفعتَه.

SHOW VARIABLES LIKE 'wait_timeout';
-- default is often 28800: eight hours of holding a sleeping connection

وخفضُ wait_timeout إلى بضع دقائق يستردّ الاتّصالات المهجورة. وهو شبكةُ أمانٍ لتسرّبٍ لا دواءٌ له.

متى يكون رفعُه صوابًا

إن كانت الاتّصالاتُ كلُّها تؤدّي عملًا حقيقيًّا وعند الخادم ذاكرةٌ فائضة فالحدُّ منخفضٌ حقًّا.

SET GLOBAL max_connections = 300;
-- and in my.cnf so it survives a restart
احسب الذاكرة لكلّ اتّصالٍ أوّلًا. فثلاثمائة اتّصالٍ باثني عشر ميغابايت لكلٍّ منها 3.6 جيغابايت قبل أن تخزّن قاعدةُ البيانات صفًّا واحدًا.
وقفزةٌ مفاجئة في الاتّصالات في وقتٍ ثابت مهمّةُ جدولةٍ لا ازدحام. وقائمةُ العمليّات أثناء القفزة تسمّيها في سطرٍ واحد.