هل يحتاج VPS لديك إلى swap؟ وكيف تحسب حجمه
تعرّف إلى متى يحتاج VPS صغير إلى ملف swap، والحجم المناسب له، وما الذي يغيّره vm.swappiness، ومتى يكون zram خياراً أفضل.
هل يحتاج VPS لديك إلى swap؟
تُشغِّل معظم صور السحابة النظام من دون swap، وعادةً ما تكون الإجابة نعم على VPS صغير: أضف ملف swap. لا يجعل swap خادماً بسعة 1 GB يتصرف كخادم بسعة 2 GB. بل يمنح kernel مكاناً يضع فيه الصفحات المجهولة غير النشطة، ما يحافظ على فائدة ذاكرة التخزين المؤقت للصفحات، ويجعل OOM killer، أي روتين kernel الذي يختار عملية وينهيها لتحرير الذاكرة، خياراً أخيراً بدلاً من أن يكون الخيار الأول.
باختصار: على خادم يشغّل عدداً قليلاً من الخدمات طويلة التشغيل، يستحق ملف swap صغير مساحة القرص التي يستهلكها. أما على خادم تحاول فيه عملية واحدة بانتظام تخصيص ذاكرة تتجاوز سعة الجهاز بالكامل، فلن ينقذك swap، بل سيجعل الفشل أبطأ وأصعب في الملاحظة. يشرح باقي هذا الدليل كيفية التمييز بين الحالتين، كما يشرح التكلفتين اللتين لا تظهران إلا على VPS.
تحتاج كل الأوامر أدناه إلى root على خادمك، لذلك شغّلها هناك بدلاً من نسخ مخرجات خادم شخص آخر.
ما الذي يفعله swap فعلياً، وما الذي لا يفعله
تأتي ذاكرة Linux بنوعين. صفحات الملفات هي نسخ من أشياء موجودة أصلاً على القرص: برامجك وكل ملف قرأته مؤخراً. تُسمّى هذه المجموعة page cache. أما الصفحات المجهولة فهي ذاكرة لا يقابلها ملف: heap وstack، ومعظم ما تخصصه قاعدة البيانات أثناء التشغيل.
عندما توشك الذاكرة على النفاد، يجب على kernel استعادة الصفحات. من السهل استعادة صفحة ملف نظيفة، لأن النسخة الموجودة على القرص لا تزال متاحة ويمكن قراءة الصفحة منه لاحقاً. أما الصفحة المجهولة فلا يمكن ذلك، لأن نسختها الوحيدة موجودة في RAM. من دون swap، يملك kernel خيارين فقط للتعامل مع الذاكرة المجهولة: الاحتفاظ بها، أو إنهاء العملية المالكة لها.
الخادم الذي لا يستخدم swap يظل يقرأ الصفحات من القرص. لكنه يقرأ الذاكرة غير المناسبة. تحت الضغط، يقلّص kernel page cache ويطرد صفحات الملفات التي سيحتاج إليها مجدداً، بما فيها النص التنفيذي للبرامج قيد التشغيل. تعود هذه الصفحات على شكل major page faults. سترى قراءات القرص في العمود bi من vmstat، وعداد pgmajfault المتزايد في /proc/vmstat، بينما يبقى si وso عند الصفر طوال الوقت. يكون الخادم عالقاً في thrashing، بينما لا تعرض عدادات swap أي نشاط.
لا يضيف swap سعة جديدة. إذا كانت working set، أي الصفحات التي يجري الوصول إليها فعلياً، أكبر من RAM، فإن swap يحوّل إنهاء العملية بسبب نفاد الذاكرة إلى خادم بطيء جداً. قد تكون هذه المقايضة مناسبة أحياناً، لأنك تستطيع تسجيل الدخول إلى خادم بطيء وإصلاحه، بينما لا يمكنك ذلك مع قاعدة بيانات أُنهيت عمليتها. وقد تكون أسوأ في حالات أخرى، لأن الخادم البطيء يواصل الفشل في health checks مع إبقاء كل الاتصالات مفتوحة. حدّد الخيار الذي تريده قبل إضافة swap.
لماذا تُصدَر صور السحابة من دون swap؟
هذا خيار مقصود. يجب أن تقلع الصورة نفسها على كل خطة يبيعها المزوّد، لذلك ستستهلك مساحة swap ثابتة مساحة القرص بلا فائدة في الخطط الصغيرة، ولن تكون لها فائدة فعلية في الخطط الكبيرة. تعتمد سرعة swap أيضاً على وحدة التخزين الموجودة خلف guest، ولا يمكن للصورة معرفة ذلك مسبقاً. كما يحسّن منشئو الصور السلوك المتوقع، لأن تشخيص عملية تتوقف فوراً أسهل عبر مجموعة كبيرة من الخوادم من تشخيص جهاز يظل قيد التشغيل ويرد على كل طلب بعد تأخير قدره عدة ثوانٍ.
تصف هذه الأسباب أجهزة مؤقتة مخصّصة للاستبدال. أما VPS الذي تحتفظ به فهو حالة مختلفة. فأنت تصلحه بدلاً من استبداله، ولذلك يكون توقف الخدمة لبضع ثوانٍ بسبب paging أفضل عادةً من إنهائها. تعامل مع غياب swap على أنه إعداد افتراضي صُمّم لحالة استخدام تخص شخصاً آخر.
ملف swap أم قسم swap على VPS؟
استخدم ملفاً. يتطلب القسم تغيير حجم نظام الملفات الجذر النشط على قرص مقسّم مسبقاً، وهذا ينطوي على مخاطر فعلية من دون فائدة. يُنشأ الملف ويُحذف باستخدام أوامر عادية، ويمكنك تغيير حجمه لاحقاً من دون تعديل جدول الأقسام.
السرعة ليست العامل الحاسم. عند swapon، يقرأ kernel خريطة امتدادات الملف مرة واحدة، ثم يرسل عمليات الإدخال والإخراج مباشرة إلى جهاز الكتل. لذلك لا يمر كل page in وpage out عبر نظام الملفات. وعلى القرص نفسه، يكون أداء ملف swap وقسم swap متماثلاً.
هناك حدّان تجدر معرفتهما. لا تضع swap على نظام ملفات شبكي مثل NFS (نظام الملفات الشبكي). وفي btrfs، يجب تعطيل copy on write وإيقاف الضغط للملف. لذلك يأتي btrfs بأداة مساعدة خاصة لإنشاء ملف swap.
كيفية إضافة ملف swap في Ubuntu أو Debian
تحقق مما لديك قبل تغيير أي شيء.
swapon --show
free -h
findmnt -no FSTYPE /تعني النتيجة الفارغة من swapon --show عدم وجود swap إطلاقاً، وهذا هو الوضع المعتاد في صورة cloud جديدة. يطبع findmnt نوع نظام ملفات root، ويحدد ذلك كيفية إنشاء الملف. في ext4، وهو ما تستخدمه معظم صور cloud، يكون fallocate آمناً.
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfileيأتي chmod قبل mkswap عن قصد. إذا تخطيته، فسيخبرك mkswap بذلك: mkswap: /swapfile: insecure permissions 0644, fix with: chmod 0600 /swapfile. يتيح ملف swap المقروء عالمياً لكل مستخدم على الخادم قراءة الذاكرة التي أخرجتها العمليات الأخرى إلى القرص. ثم يؤكد mkswap السليم الحجم، بسطر مثل Setting up swapspace version 1, size = 2 GiB (2147479552 bytes).
في xfs أو btrfs، قد يفشل الأمر الأخير مع swapon: /swapfile: swapon failed: Invalid argument. يحدث ذلك في XFS لأن fallocate يترك extents غير مكتوبة، لذلك اكتب البايتات بدلاً من ذلك.
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progressفي btrfs، يكون السبب هو copy on write، ويضبط btrfs-progs الحالي العلامات المناسبة تلقائياً.
sudo btrfs filesystem mkswapfile --size 2g /swapfileفي كلتا الحالتين، أنهِ العملية باستخدام chmod 600، ثم mkswap عند انطباقه، وبعد ذلك swapon، ثم تحقق من النتيجة.
swapon --show
free -hيجب أن يسرد swapon --show ملف /swapfile بالنوع file وبالحجم الذي طلبته، ويجب أن يعرض free -h صفاً من النوع Swap مع استخدام شبه معدوم. ويُعد ظهور swap مستخدم بحجم صفر في إعداد جديد أمراً صحيحاً. لا ينقل kernel الصفحات إليه إلا عند وجود سبب لذلك.
اجعل الإعداد يستمر بعد إعادة التشغيل، ثم اختبر السطر فوراً.
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
sudo swapoff /swapfile
sudo swapon -a
swapon --showيقرأ swapon -a الملف /etc/fstab، لذلك يفشل السطر الخاطئ الآن وأمامك. أما الخطأ المطبعي الذي لا تختبره، فستواجهه أثناء إعادة تشغيل غير مخطط لها، عندما يعود الخادم إلى العمل من دون swap الذي كنت تظن أنه مفعّل.
لإزالة swap لاحقاً، شغّل sudo swapoff /swapfile، واحذف سطر fstab، ثم شغّل sudo rm /swapfile. يجب أن يقرأ swapoff أولاً كل صفحة أُخرجت إلى القرص ويعيدها إلى RAM، لذلك قد يفشل على خادم مشغول مع swapoff: /swapfile: swapoff failed: Cannot allocate memory. حرّر بعض الذاكرة وحاول مرة أخرى.
ما الحجم المناسب لملف swap؟
تتمثل المهمة في الاحتفاظ بالصفحات المجهولة الباردة، لذلك فإن العامل المهم هو مقدار الذاكرة المخصصة الخاملة فعلياً، وليس مقدار RAM في الخطة. لا تزداد الذاكرة الخاملة بالتناسب مع حجم الخطة، لذلك ينخفض المعامل كلما كبرت الخطط. هذه هي القاعدة التي يستخدمها هذا الدليل.
The data behind this chart
[
{
"label": "1 GB plan",
"swap_gb": 2,
"swap_x_ram": 2
},
{
"label": "2 GB plan",
"swap_gb": 2,
"swap_x_ram": 1
},
{
"label": "4 GB plan",
"swap_gb": 2,
"swap_x_ram": 0.5
},
{
"label": "8 GB plan",
"swap_gb": 4,
"swap_x_ram": 0.5
},
{
"label": "16 GB plan",
"swap_gb": 4,
"swap_x_ram": 0.25
}
]في أصغر خطة، يكون حجم swap هو 2 GB، أي ما يعادل 2 ضعف RAM، لأن الخادم بسعة 1 GB يملك هامشاً صغيراً جداً، وقد تؤدي قفزة واحدة إلى تشغيل OOM killer. عند الحد الأعلى في المخطط، يتوقف حجم الملف عند 4 GB، أي ما يعادل 0.25 ضعف RAM، لأن ترحيل هذه الكمية من البيانات على وحدة تخزين مشتركة يستغرق وقتاً طويلاً بما يكفي لجعل الخادم متوقفاً عملياً أثناء العملية. قلّل هذه الأرقام إذا كان حيز القرص المتاح لديك محدوداً، لأن الملف يستهلك مساحة قرص فعلية.
السبب التقليدي الوحيد لتعيين swap بحجم يساوي RAM أو يتجاوزه هو الإسبات، إذ يكتب صورة الذاكرة بأكملها إلى swap. لا يدخل VPS في وضع الإسبات، لذلك لا تنطبق هذه القاعدة عليك.
ماذا يغيّر vm.swappiness فعلياً؟
vm.swappiness ليست نسبة مئوية من RAM، وليست حداً معيناً. إنها التكلفة النسبية التي تعيّنها النواة لاستعادة الصفحات المجهولة مقارنة بصفحات الملفات. القيمة الافتراضية هي 60. خفّضها، فتفضّل النواة إسقاط ذاكرة التخزين المؤقت للصفحات. ارفعها، فتفضّل النواة ترحيل الذاكرة المجهولة إلى swap.
هذه مفاضلة في الاتجاهين. عند vm.swappiness = 10، تحتفظ قاعدة البيانات بقدر أكبر من تخصيصاتها في الذاكرة، وتدفع الثمن بإعادة قراءة الملفات التي أسقطتها للتو من ذاكرة التخزين المؤقت. على خادم تتمثل مهمته الفعلية في تقديم الملفات، يكون ذلك الاتجاه غير مناسب، لأن ذاكرة التخزين المؤقت للصفحات هي التي تنفّذ العمل المفيد هناك.
تعيين القيمة إلى 0 لا يعطّل swap. بل يطلب من النواة تجنّب استعادة الصفحات المجهولة حتى تقترب الذاكرة من النفاد، ما يقدّم تشغيل OOM killer بدلاً من تأخيره. إذا كنت لا تريد استخدام swap، فأزل ملف swap.
sysctl vm.swappiness
printf 'vm.swappiness = 10\n' | sudo tee /etc/sysctl.d/99-swappiness.conf
sudo sysctl --system
sysctl vm.swappinessتظل قيمة sysctl -w المباشرة سارية حتى إعادة التشغيل التالية، ثم تتوقف عن التطبيق بصمت. لذلك اكتب القيمة في الملف الموجود ضمن /etc/sysctl.d/. تقبل النوى منذ الإصدار 5.8 قيماً من 0 إلى 200. لا تكون القيم الأعلى من 100 منطقية إلا عندما يكون swap سريعاً تقريباً مثل RAM، وهذا يعني zram.
zram: swap يستهلك CPU بدلاً من القرص
zram هو جهاز كتل مضغوط موجود في RAM. استخدمه كـ swap، وعندها تُضغط الصفحة التي كان يفترض نقلها إلى القرص وتبقى في الذاكرة. لا تحدث عمليات إدخال وإخراج على القرص، ولا تُستهلك حصة القرص. لكن كل عملية إدخال صفحة إلى zram أو إخراجها منه تستهلك وقت CPU، كما تُحجز RAM للصفحات المضغوطة، فلا تعود متاحة لتطبيقاتك.
تتراوح نسب الضغط بين 2:1 و3:1 وفق الأرقام المنشورة عادةً للصفحات المجهولة، ويطبع zramctl القيمة الخاصة بك في العمودين DATA وCOMPR. قِس القيمة الفعلية بدلاً من التخطيط وفق الرقم المعتاد، لأن بعض أحمال العمل تحتوي على بيانات تكاد لا تنضغط.
sudo apt install zram-toolsعيّن ALGO=zstd وPERCENT=25 في /etc/default/zramswap، ثم أعد تشغيل الخدمة وراجع النتيجة.
sudo systemctl restart zramswap
zramctl
swapon --showPERCENT هي نسبة من إجمالي RAM، لذلك تؤدي القيمة 25 على خادم بسعة 4 GB إلى حجز ما يصل إلى 1 GB للصفحات المضغوطة. ابدأ بقيمة منخفضة، وارفعها فقط إذا أظهر zramctl أن الجهاز يمتلئ. يحدد الإعداد PRIORITY في الملف نفسه swap الذي يملؤه kernel أولاً: تكون الأولوية الأعلى هي المستخدمة أولاً، ويحصل ملف swap على القرص الذي تضيفه باستخدام swapon فقط على أولوية سالبة، لذلك يُستخدم zram أولاً ويستوعب الملف الفائض. يطبع swapon --show كلتا القيمتين في العمود PRIO. في التوزيعات التي تستخدم systemd-zram-generator بدلاً من zram-tools، توجد الإعدادات نفسها في /etc/systemd/zram-generator.conf.
يناسب zram خادماً لديه سعة CPU احتياطية ومساحة قرص قليلة. ولا يناسب الحالة التي تكون فيها سعة CPU هي المورد الذي تعاني نقصه أصلاً، لأن عملية الضغط تنافس التطبيق على الحصة نفسها.
مصدران لمشكلات swap لا يظهران إلا على VPS
المشكلة الأولى هي مساحة القرص. يستهلك ملف swap بحجم 2 GB مساحة قدرها 2 GB من خطة الاستضافة فور إنشائه، لأن المساحة يجب تخصيصها مسبقاً. ينخفض df -h / بالمقدار الكامل فوراً، ولا يستعيد هذه المساحة حتى تحذف الملف. في خطة صغيرة، تمثل هذه المساحة جزءاً ملحوظاً، كما أن امتلاء نظام الملفات الجذري يعطّل أشياء كثيرة أكثر مما أصلحه swap في أي وقت. يظهر الملف أيضاً في مخرجات du، وهذا مهم عندما تبحث عن المساحة وتجد أن df وdu يختلفان حول مكان اختفاء مساحة القرص.
المشكلة الثانية هي زمن الاستجابة. تصل عمليات الإدخال والإخراج الخاصة بـswap إلى مساحة التخزين التي يشاركها المضيف مع ضيوفه الآخرين، ولا يمكنك رؤية الحمل الناتج عنهم من داخل بيئتك. لا ترى إلا النتيجة: قد تستغرق قراءة صفحة، التي تكون سريعة عادةً، وقتاً أطول بكثير أحياناً، وتتوقف العملية التي تنتظرها حتى تصل الصفحة. هذا هو المنطق نفسه المتعلق بـزمن CPU steal على مضيف مشترك، لكنه ينطبق على قائمة انتظار القرص بدلاً من قائمة انتظار التنفيذ. قِس ذلك على خادمك، لأن أي رقم منشور لزمن الاستجابة يصف جيران مستخدم آخر.
كيف تعرف أن swap يضرّك؟
استخدام swap ليس مشكلة. المشكلة هي نشاط swap. إذا كان هناك عدة مئات من الميغابايتات في swap دون أي نشاط paging، فهذا يعني أن النظام نقل إلى swap ذاكرة لم تُلمس منذ ساعات. وهذه هي النتيجة المطلوبة.
راقب معدلات النشاط بدلاً من الإجماليات.
vmstat 1 5يمثل si وso عدد kibibytes في الثانية التي تُنقل إلى swap ومنها. في النظام السليم، تبقى هذه القيم عند الصفر أو قريبة منه، مهما كانت قيمة العمود swpd. يشير استمرار so مع ارتفاع si في الوقت نفسه إلى أن الصفحات تُكتب إلى swap ثم تُقرأ منه مباشرة، وهذا هو thrashing.
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 3 1048572 38210 4096 61440 912 1180 2210 1290 1402 2890 9 7 12 72 0تعرض هذه العينة نظاماً يواجه مشكلة. وأوضح مؤشر لا يظهر في أعمدة swap. فقيمة wa هي 72، ما يعني أن وحدة المعالجة المركزية قضت معظم وقتها في انتظار عمليات الإدخال والإخراج. وقيمة b هي 3، ما يعني وجود ثلاث عمليات محجوبة.
تجيب PSI (معلومات ضغط الانتظار) عن السؤال بصورة مباشرة أكثر.
cat /proc/pressure/memorysome avg10=8.42 avg60=5.11 avg300=2.03 total=1284729
full avg10=3.10 avg60=1.94 avg300=0.71 total=498210تعني some avg10=8.42 أنه خلال آخر 10 ثوانٍ، كانت هناك مهمة واحدة على الأقل متوقفة بانتظار الذاكرة لمدة 8.42 بالمئة من الوقت. وتحسب full الوقت الذي كانت فيه كل مهمة غير خاملة متوقفة، ولذلك فإن قيمة full المستمرة تمثل ضرراً قابلاً للقياس، لا مجرد علامة تحذير. إذا لم يكن الملف موجوداً، فإن kernel لديك يعطّل PSI افتراضياً، ويحتاج إلى psi=1 في سطر أوامر kernel.
لعرض العمليات التي تحتفظ بصفحات في swap:
sudo awk '/^Name:/{n=$2} /^VmSwap:/ && $2+0 > 0 {printf "%10d kB %s\n", $2, n}' /proc/[0-9]*/status | sort -rn | headوللتحقق مما إذا كان OOM killer قد تدخّل بالفعل:
sudo journalctl -k --grep "Out of memory"يظهر الحدث بالشكل Out of memory: Killed process 2199 (mysqld) total-vm:1275860kB, anon-rss:129252kB, file-rss:0kB, shmem-rss:0kB, UID:114 pgtables:504kB oom_score_adj:0، ويذكر سجل الخدمة في الثانية نفسها Main process exited, code=killed, status=9/KILL. إذا رأيت هذه الأسطر على نظام لا يستخدم swap، فإن إضافة swap file هي أرخص خطوة تالية يمكنك تجربتها.
عندما يكون Swap هو الحل الخاطئ
يوفّر Swap وقتاً إضافياً عند وجود ضغط مؤقت على الذاكرة أو عند التعامل مع صفحات ذاكرة غير نشطة. لكنه لا يفيد عملية تستمر في النمو حتى تتوقف، بل يجعل مراقبة هذا الفشل أصعب؛ لأن الجهاز يقضي الدقائق الإضافية في ترحيل الصفحات بدلاً من الفشل سريعاً وإعادة التشغيل.
ضع حداً للعملية بدلاً من ذلك. تقبل خدمة systemd الخيارين MemoryMax= وMemorySwapMax= في ملف drop-in، وبذلك يمكنك تحديد الذاكرة ووحدة المعالجة المركزية لخدمة باستخدام systemd من دون تغيير التطبيق. توفّر الحاويات عناصر التحكم نفسها على مستوى أعلى، ويتيح ضبطها لك منع خدمة Compose واحدة من استهلاك الخادم بالكامل. يوفّر كلا الخيارين عملية قتل مرتبطة باسم واضح في سجل يمكنك العثور عليه، بدلاً من ترك النواة تختار العملية المتضررة وفقاً لدرجتها.
نفّذ ذلك بينما يكون الخادم جديداً وهادئاً. يستغرق إنشاء ملف Swap وضبط حد واحد للذاكرة بضع دقائق، وينبغي أن يكون ذلك جزءاً من بقية العمل في الدقائق العشر الأولى على VPS جديد.
FAQ
هل تؤدي إضافة swap إلى جعل VPS بسعة 1 GB يعمل مثل VPS بسعة 2 GB؟
لا. إنّ swap أبطأ بكثير من RAM، ولا ينقل kernel إليها إلا الصفحات التي يقيّمها على أنّها غير نشطة. ما توفره هو مساحة احتياطية لارتفاعات الاستخدام، ومكان لتخزين الذاكرة التي خُصصت ثم لم تُلمس لاحقاً. إذا كان حملك يقرأ من ذاكرة ويكتب إليها بنشاط بأكثر مما يملكه الجهاز، فإنّ swap يحوّل إنهاء العملية بسبب نفاد الذاكرة إلى ترحيل مستمر للصفحات. عندها يبقى الخادم قيد التشغيل، لكنه يستجيب ببطء يجعله غير عملي. في هذه الحالة، أضف RAM أو حدّد العملية التي يزداد استهلاكها.
ما مقدار swap الذي يحتاج إليه VPS بسعة 1 GB أو 2 GB؟
تكفي 2 GB للحالتين، ولا حاجة إلى مواصلة زيادتها مع زيادة RAM بعد ذلك. تحتفظ swap بالصفحات المجهولة غير النشطة، وكمية الذاكرة غير النشطة فعلياً على الخادم لا تزداد بالطريقة نفسها التي تزداد بها RAM الإجمالية. تأتي القاعدة القديمة التي توصي بضعف RAM من وضع السبات، الذي يكتب صورة الذاكرة كاملةً إلى القرص، بينما لا يدخل VPS في وضع السبات مطلقاً. إنّ زيادة الحجم بعد 4 GB تشتري غالباً فشلاً أطول وأبطأ على مساحة تخزين تشاركها مع ضيوف آخرين.
هل يُعد ضبط vm.swappiness على 0 الطريقة الصحيحة لإيقاف استخدام swap؟
لا، ولا يؤدي هذا الإعداد ما يوحي به اسمه. vm.swappiness = 0 لا يعطّل swap. بل يطلب من kernel تجنّب استعادة الصفحات المجهولة حتى يقترب من نفاد الذاكرة، ما يجعل إنهاء العملية بسبب نفاد الذاكرة أكثر احتمالاً، لا أقل. كما أنّه يحمّل page cache كامل عمليات الاستعادة، لذلك تعود قراءات الملفات إلى القرص بوتيرة أكبر. إذا كنت تريد تعطيل swap بالكامل، شغّل sudo swapoff -a وأزل السطر الخاص بها من fstab. وإذا كنت تريد تقليل استخدامها، فجرّب vm.swappiness = 10 وقارن العمودين si وso في vmstat قبل التغيير وبعده.
هل ينبغي استخدام zram بدلاً من ملف swap؟
استخدم zram عندما تتوفر لديك سعة CPU ولا تتوفر مساحة كبيرة على القرص، واستخدم ملف swap في الحالة المعاكسة. تضغط zram الصفحات وتحتفظ بها في RAM، لذلك تتجنب عمليات الإدخال والإخراج على القرص بالكامل، لكن ذلك يستهلك CPU مع كل إدخال للصفحات وإخراج لها، كما أنّ المساحة التي تشغلها هي RAM لم تعد التطبيقات تحصل عليها. في VPS ذي الحصة المحدودة من CPU، يقع هذا الاستهلاك على المورد الذي تعاني نقصه أصلاً. من الطبيعي تشغيل الاثنين معاً: امنح zram أولوية أعلى باستخدام PRIORITY في /etc/default/zramswap، وأبقِ ملف swap على القرص أسفلها لاستيعاب التجاوز.
لماذا شغّل OOM killer عمليةً رغم أن free أظهر توفّر ذاكرة؟
يعرض free لحظة واحدة، بينما يحدث تخصيص الذاكرة في لحظة فورية. قد تُنهى عملية تطلب كتلة كبيرة بسرعة تفوق قدرة استعادة الذاكرة على تحريرها، حتى إذا بدا المتوسط مريحاً. اقرأ سجل kernel باستخدام sudo journalctl -k --grep "Out of memory"، إذ يذكر العملية التي أُنهيت وحجم ذاكرتها المقيمة في ذلك الوقت. ثم تحقق مما إذا كان الإنهاء ناتجاً عن حد cgroup لا عن الجهاز بأكمله، لأن حاوية أو وحدة systemd مضبوطة باستخدام MemoryMax= تُنهى عند بلوغ حدها الخاص، بينما لا يزال لدى المضيف ذاكرة متاحة.