تُعدّ OOM canary ميزة تجريبية وهي معطّلة افتراضيًا. وقد يتغيّر سلوكها
بين إصدارات ClickHouse إلى أن يكتمل التحقق منها في بيئات الإنتاج.
نظرة عامة
cgroup للذاكرة، يُنهي قاتل نفاد الذاكرة (OOM) في Linux عملية باستخدام SIGKILL — وغالبًا ما تكون أكبر مستهلك للذاكرة، والتي
تكون في المضيف المخصص هي clickhouse-server نفسه. وبذلك يُفقد الخادوم بالكامل
بدلًا من منحه فرصة للتعافي.
يغيّر كاناري OOM الجهة التي تموت أولًا. فهو يشغّل عملية فرعية صغيرة تضحية
تجعل نفسها الهدف الأكثر ترجيحًا لـ OOM، بحيث تقتلها
النواة بدلًا من الخادوم. ثم يكتشف الخادوم هذا التوقف، ويتأكد من أنه كان حدث OOM،
ويخفف ضغط الذاكرة لكي يتمكن من الاستمرار.
لا يرفع الكناري أي memory limit، وليس بديلًا عن
الحدود الصحيحة (انظر memory overcommit و
max_server_memory_usage). بل هو خط الدفاع الأخير الذي يبادل مقدارًا صغيرًا
وثابتًا من الذاكرة بفرصة النجاة من ارتفاع مفاجئ في استهلاك الذاكرة.
كيف يعمل
clickhouse oom-canary منفصلة. يضبط قيمة
oom_score_adj الخاصة به على الحد الأقصى (1000) لكي تستهدفه النواة أولًا، ثم
يخصّص oom_canary_size بايت (100 ميغابايت افتراضيًا)، ويلمسها، ويُجري عليها mlock لكي
تكون مجموعة الصفحات المقيمة الخاصة به فعلية. ويُنهي تلقائيًا إذا توقّف الخادم.
في الخادم، يراقب خيط مراقبة الكناري (عبر pidfd) ويتفاعل عند
موته:
- إذا قُتل بواسطة
SIGKILLمع وجود مؤشر OOM من cgroup → تُشغَّل استجابة OOM، ثم يُعاد تشغيل كناري جديد. - إذا قُتل من دون وجود مؤشر OOM (على سبيل المثال،
kill -9يدوي)، أو خرج بسبب فشل عابر → تُعاد عملية التشغيل فقط، من دون استجابة. - عند فشل دائم في الإعداد، أو عند إيقاف الخادم → يعطّل الكناري نفسه.
oom_kill في memory.events.local ضمن cgroup v2.
وقد صُمِّم عمدًا ليكون محليًا على مستوى cgroup: إذ يمكن للعدادات الهرمية أو على مستوى المضيف
أن تزداد بسبب عمليات غير ذات صلة، ما قد يؤدي إلى إطلاق استجابات خاطئة.
عند تأكيد حدوث OOM، تُنفَّذ هذه الخطوات المستقلة ضمن الاستجابة: تسجيل رسالة FATAL،
وتنقية ساحات المُخصِّص (jemalloc)، ومحاولة إلغاء جميع
الاستعلامات الجارية بأفضل جهد ممكن، وإلغاء جميع عمليات الدمج وعمليات mutation، ووضع حدث في
system.crash_log. لا تُفرَّغ سجلات النظام تفريغًا متزامنًا،
لأن فرض عمليات I/O تحت ضغط الذاكرة قد يزيد الأمور سوءًا.
المتطلبات
- Linux ≥ 5.3. تمتلك أداة المراقبة العملية الكناري عبر
pidfd_open؛ وفي الإصدارات الأقدم من النواة تُعطِّل العملية الكناري نفسها عند بدء التشغيل. ويكون ذلك بلا تأثير على المنصات غير Linux. cgroup v2معmemory.events.localمن أجل استجابة OOM. وبدونه تظل العملية الكناري تُعاد تشغيلها بعدSIGKILL، لكنها لا تستطيع تأكيد وقوع OOM، لذلك لا تُنفَّذ الاستجابة مطلقًا (ويُسجَّل تحذير عند بدء التشغيل).- صلاحية
mlock(اختيارية). يتطلّب قفل ذاكرة العملية الكناريCAP_IPC_LOCKأو قيمةRLIMIT_MEMLOCKكافية؛ وإذا فشل ذلك، تسجّل العملية الكناري تحذيرًا، وقد تُرحَّل ذاكرتها إلى swap، مما يضعفها كهدف لـ OOM.
التهيئة
الرصد
system.crash_log حيث تكون قيمة signal = 9 ويتضمن
signal_description إشارة إلى OOM Canary: