OOMD.CONF(5) oomd.conf OOMD.CONF(5)

oomd.conf, oomd.conf.d - فایلهای پیکربندی مدیریت کمبود حافظه سیستمدی (systemd-oomd)

/etc/systemd/oomd.conf
/run/systemd/oomd.conf
/usr/local/lib/systemd/oomd.conf
/usr/lib/systemd/oomd.conf
/etc/systemd/oomd.conf.d/*.conf
/run/systemd/oomd.conf.d/*.conf
/usr/local/lib/systemd/oomd.conf.d/*.conf
/usr/lib/systemd/oomd.conf.d/*.conf

این فایل‌ها پارامترهای مختلف قاتل کمبود حافظه (OOM) فضای کاربری در systemd(1) یعنی systemd-oomd.service(8) را پیکربندی می‌کنند. برای توضیحات کلی در مورد ساختار نحوی به systemd.syntax(7) مراجعه کنید.

پیکربندی پیش‌فرض در زمان کامپایل تعیین می‌شود، بنابراین پیکربندی تنها زمانی مورد نیاز است که انحراف از آن مقادیر پیش‌فرض لازم باشد. فایل پیکربندی اصلی از یکی از دایرکتوری‌های فهرست‌شده به ترتیب اولویت بارگذاری می‌شود و تنها اولین فایل یافت‌شده استفاده می‌گردد: /etc/systemd/, /run/systemd/, /usr/local/lib/systemd/ [1], /usr/lib/systemd/. نسخه ارائه‌شده توسط توزیع‌کننده (vendor) شامل ورودی‌های کامنت‌شده‌ای است که مقادیر پیش‌فرض را به عنوان راهنمای مدیر سیستم نشان می‌دهد. بازنویسی‌های محلی را نیز می‌توان با ایجاد فایل‌های تکمیلی (drop-in) مطابق توضیحات زیر انجام داد. فایل پیکربندی اصلی را نیز می‌توان برای این منظور ویرایش کرد (یا یک رونوشت در /etc/ اگر در /usr/ عرضه شده باشد)، با این حال استفاده از فایل‌های تکمیلی (drop-in) برای پیکربندی محلی نسبت به تغییر دادن فایل پیکربندی اصلی توصیه می‌شود.

علاوه بر فایل پیکربندی اصلی، قطعه‌کدهای پیکربندی تکمیلی (drop-in) از مسیرهای زیر خوانده می‌شوند: /usr/lib/systemd/*.conf.d/, /usr/local/lib/systemd/*.conf.d/, و /etc/systemd/*.conf.d/. این فایل‌های تکمیلی اولویت بالاتری دارند و فایل پیکربندی اصلی را بازنویسی (override) می‌کنند. فایل‌ها در زیردایرکتوری‌های پیکربندی *.conf.d/ صرف‌نظر از این‌که در کدام‌یک از زیردایرکتوری‌ها قرار داشته باشند، بر اساس نام فایل خود به ترتیب واژه‌نگاری (lexicographic) مرتب می‌شوند. هنگامی که چندین فایل یک گزینه مشابه را تعیین می‌کنند، برای گزینه‌هایی که تنها یک مقدار واحد را می‌پذیرند، ورودی موجود در فایلی که نام آن در آخر مرتب شده است اولویت دارد؛ و برای گزینه‌هایی که فهرستی از مقادیر را می‌پذیرند، ورودی‌ها به همان ترتیبی که در فایل‌های مرتب‌شده ظاهر می‌شوند جمع‌آوری می‌گردند.

هنگامی که بسته‌ها نیاز به سفارشی‌سازی پیکربندی داشته باشند، می‌توانند فایل‌های تکمیلی (drop-in) را در /usr/ نصب کنند. فایل‌های موجود در /etc/ برای مدیر سیستم محلی رزرو شده‌اند، که می‌تواند از این منطق برای بازنویسی فایل‌های پیکربندی نصب‌شده توسط بسته‌های توزیع‌کننده استفاده کند. برای بازنویسی قطعات تکمیلی بسته باید از فایل‌های تکمیلی استفاده شود، زیرا فایل پیکربندی اصلی اولویت پایین‌تری دارد. توصیه می‌شود نام تمام فایل‌ها در این زیردایرکتوری‌ها با یک عدد دورقمی و یک خط تیره پیشوندگذاری شود تا ترتیب‌بندی آن‌ها ساده‌تر گردد. این کار همچنین مفهومی از اولویت‌های فایل‌های تکمیلی را تعریف می‌کند تا به توزیع‌کنندگان سیستم‌عامل اجازه دهد فایل‌های تکمیلی را در یک محدوده مشخص پایین‌تر از محدوده مورد استفاده کاربران عرضه کنند. این امر خطر بازنویسی تصادفی فایل‌های تکمیلی تعریف‌شده توسط کاربران را توسط فایل‌های تکمیلی بسته‌ها کاهش می‌دهد. توصیه می‌شود از محدوده 10-40 برای فایل‌های تکمیلی در /usr/ و از محدوده 60-90 برای فایل‌های تکمیلی در /etc/ و /run/ استفاده شود، تا اطمینان حاصل گردد که فایل‌های تکمیلی محلی و گذرا بر فایل‌های تکمیلی ارائه‌شده توسط توزیع‌کننده سیستم‌عامل اولویت دارند.

برای غیرفعال کردن یک فایل پیکربندی ارائه‌شده توسط توزیع‌کننده، روش توصیه‌شده قرار دادن یک پیوند نمادین (symlink) به /dev/null در دایرکتوری پیکربندی در /etc/ با همان نام فایل پیکربندی توزیع‌کننده است.

systemd-oomd از اطلاع‌رسانی به مؤلفه‌های خارجی پیش از کشتن یک گروه کنترلی پشتیبانی می‌کند. این کار با ارسال یک اعلان از طریق varlink به تمامی سوکت‌های یافت‌شده در پوشه /run/systemd/oomd.prekill.hook/ انجام می‌شود. هر سوکت باید رابط io.systemd.oom.Prekill را پیاده‌سازی کند. این اعلان حاوی مسیر گروه کنترلی است تا قلاب (hook) بتواند تشخیص دهد کدام گروه کنترلی در حال کشته شدن است. این امر به مؤلفه‌های خارجی اجازه می‌دهد پیش از خاتمه گروه کنترلی، هرگونه پاک‌سازی یا ثبت گزارش لازم را انجام دهند. این قلاب به عنوان راهی برای جلوگیری از کشته شدن در نظر گرفته نشده است، بلکه به عنوان یک سازوکار اعلان عمل می‌کند. توجه داشته باشید که این یک گزینه نیازمند دسترسی ویژه (privileged) است، زیرا حتی در صورت داشتن مهلت زمانی، همگام بوده و کشتن را به تاخیر می‌اندازد، بنابراین با احتیاط استفاده شود. سازوکار معمولاً ارجح برای پردازش فشار حافظه، عمل بر اساس توصیه‌های سند Resource Pressure Handling[2] است که بدون نیاز به دسترسی ویژه و ناهمگام است و کشتن را به تاخیر نمی‌اندازد.

systemd-oomd از مجموعه قوانین سفارشی پشتیبانی می‌کند که شرایط و اقداماتی را برای مدیریت OOM بر مبنای هر واحد (per-unit) تعریف می‌کنند. فایل‌های مجموعه قوانین از پسوند .oomrule استفاده می‌کنند و از مسیرهای زیر بارگذاری می‌شوند: /etc/systemd/oomd/rules.d/, /run/systemd/oomd/rules.d/, /usr/local/lib/systemd/oomd/rules.d/, و /usr/lib/systemd/oomd/rules.d/. واحدها از طریق تنظیم OOMRules= در systemd.resource-control(5) از این مجموعه قوانین استفاده می‌کنند، که فهرستی جداشده با فاصله از نام‌های مجموعه قوانین (نام فایل بدون پسوند .oomrule) را می‌پذیرد.

هر فایل مجموعه قوانین شامل یک بخش "[Rule]" با گزینه‌های زیر است. حداقل یکی از گزینه‌های MemoryPressureAbove= یا SwapUsageMax= باید پیکربندی شود؛ مجموعه قوانین بدون شرط نادیده گرفته می‌شوند. اگر هر دو تنظیم شده باشند، شرایط با عملگر AND ترکیب می‌شوند، یعنی اقدام تنها زمانی فعال می‌شود که هر دو آستانه به طور همزمان فراتر رفته باشند.

MemoryPressureAbove=

آستانه فشار حافظه‌ای را تعیین می‌کند که با فراتر رفتن از آن، اقدام قانون فعال خواهد شد. فشار حافظه نشان‌دهنده کسری از زمان در یک پنجره ۱۰ ثانیه‌ای است که در آن تمام وظایف (tasks) در گروه کنترلی با تاخیر مواجه شده‌اند (PSI "full avg10"). مقداری مشخص‌شده به صورت درصد (در صورت داشتن پسوند "%")، در هزار ("‰") یا در ده‌هزار ("‱")، بین 0% تا 100% (شامل هر دو) را می‌پذیرد. در صورت عدم تنظیم، این شرط ارزیابی نمی‌شود. مقدار "100%" هرگز نمی‌تواند فراتر برود و بنابراین با یک هشدار رد می‌شود؛ مقدار "0%" شرط را با هرگونه فشار مشاهده‌شده برقرار می‌سازد، که معمولاً مفید نیست.

در نگارش 261 اضافه شد.

SwapUsageMax=

آستانه استفاده از فضای تعویض (swap) در سطح کل سیستم را تعیین می‌کند که با فراتر رفتن از آن، اقدام قانون فعال خواهد شد. مقداری مشخص‌شده به صورت درصد (در صورت داشتن پسوند "%")، در هزار ("‰") یا در ده‌هزار ("‱")، بین 0% تا 100% (شامل هر دو) را می‌پذیرد. در صورت عدم تنظیم، این شرط ارزیابی نمی‌شود. مقدار "100%" هرگز نمی‌تواند فراتر برود و بنابراین با یک هشدار رد می‌شود؛ مقدار "0%" به محض استفاده از هر مقدار فضای تعویض فعال می‌شود، که معمولاً مفید نیست.

در نگارش 261 اضافه شد.

Action=

اقدامی را که هنگام برآورده شدن شرایط قانون باید انجام شود مشخص می‌کند. یکی از مقادیر "kill-all"، "kill-by-pgscan" یا "kill-by-swap" را می‌پذیرد. این تنظیم الزامی است؛ مجموعه قوانین بدون Action= نادیده گرفته می‌شوند.
•"kill-all" سیگنال SIGKILL را به تمامی فرآیندهای موجود در سلسله‌مراتب cgroup واحد، شامل تمامی cgroupهای زیرمجموعه ارسال می‌کند.
•"kill-by-pgscan" آن cgroup زیرمجموعه‌ای را که بالاترین نرخ اخیر اسکن صفحه (بازپس‌گیری) را دارد انتخاب کرده و می‌کشد.
•"kill-by-swap" آن cgroup زیرمجموعه‌ای را که بیشترین استفاده از فضای تعویض را دارد انتخاب کرده و می‌کشد.

در نگارش 261 اضافه شد.

LastingSec=

مدت‌زمانی را تعیین می‌کند که شرایط باید پیش از انجام اقدام، به طور مداوم برقرار باشند. یک مقدار بازه زمانی می‌پذیرد؛ برای جزئیات ساختار نحوی مجاز به systemd.time(7) مراجعه کنید. مقدار پیش‌فرض 0 است، یعنی اقدام بلافاصله پس از برآورده شدن شرایط انجام می‌شود.

در نگارش 261 اضافه شد.

گزینه‌های زیر در بخش [OOM] در دسترس هستند:

SwapUsedLimit=

حد استفاده از حافظه و فضای تعویض در سیستم را پیش از آن‌که systemd-oomd اقدامی انجام دهد تعیین می‌کند. اگر کسر حافظه استفاده‌شده و کسر فضای تعویض استفاده‌شده در سیستم هر دو بیشتر از مقدار تعریف‌شده در اینجا باشند، systemd-oomd روی گروه‌های کنترلی واجد شرایط زیرمجموعه که استفاده از فضای تعویض آن‌ها بیش از ۵٪ از کل فضای تعویض است، با شروع از مواردی که بیشترین استفاده از فضای تعویض را دارند، اقدام خواهد کرد. این‌که کدام گروه‌های کنترلی نظارت می‌شوند و چه اقدامی صورت می‌گیرد بستگی به این دارد که واحد برای ManagedOOMSwap= چه چیزی را پیکربندی کرده باشد. مقداری مشخص‌شده به صورت درصد (در صورت داشتن پسوند "%")، در هزار ("‰") یا در ده‌هزار ("‱")، بین 0% تا 100% (شامل هر دو) را می‌پذیرد. مقدار پیش‌فرض 90% است.

در نگارش 247 اضافه شد.

DefaultMemoryPressureLimit=

حد فشار حافظه روی گروه کنترلی واحد را پیش از آن‌که systemd-oomd اقدامی انجام دهد تعیین می‌کند. یک واحد می‌تواند این مقدار را با ManagedOOMMemoryPressureLimit= بازنویسی کند. فشار حافظه برای این ویژگی نشان‌دهنده کسری از زمان در یک پنجره ۱۰ ثانیه‌ای است که در آن تمام وظایف در گروه کنترلی با تاخیر مواجه شده‌اند. برای هر گروه کنترلی تحت نظارت، اگر فشار حافظه روی آن گروه کنترلی برای مدتی طولانی‌تر از مدت تعیین‌شده توسط DefaultMemoryPressureDurationSec= از حد تعیین‌شده فراتر رود، systemd-oomd روی گروه‌های کنترلی واجد شرایط زیرمجموعه، با شروع از مواردی که بیشترین فعالیت بازپس‌گیری را دارند به سمت کمترین فعالیت بازپس‌گیری، اقدام خواهد کرد. این‌که کدام گروه‌های کنترلی نظارت می‌شوند و چه اقدامی صورت می‌گیرد بستگی به این دارد که واحد برای ManagedOOMMemoryPressure= چه چیزی را پیکربندی کرده باشد. کسری را می‌پذیرد که به همان روش SwapUsedLimit= در بالا مشخص می‌شود. مقدار پیش‌فرض 60% است.

در نگارش 247 اضافه شد.

DefaultMemoryPressureDurationSec=

مدت‌زمانی را تعیین می‌کند که گروه کنترلی یک واحد باید پیش از اقدام systemd-oomd از حدود فشار حافظه فراتر رفته باشد. یک واحد می‌تواند این مقدار را با ManagedOOMMemoryPressureDurationSec= بازنویسی کند. حدود فشار حافظه توسط DefaultMemoryPressureLimit= و ManagedOOMMemoryPressureLimit= تعریف می‌شوند. باید روی 0، یا حداقل 1 ثانیه تنظیم شود. در صورت عدم تنظیم یا مقدار 0، پیش‌فرض 30 ثانیه است.

در نگارش 248 اضافه شد.

PrekillHookTimeoutSec=

مدت‌زمانی را تعیین می‌کند که systemd-oomd پیش از اقدام به خاتمه گروه کنترلی، منتظر اتمام قلاب‌های پیش از کشتن (pre-kill hooks) می‌ماند. قلاب‌های پیش از کشتن با قرار دادن سوکت varlink در پوشه /run/systemd/oomd.prekill.hook/ کار می‌کنند. هر سوکت برای کارکرد اعلان باید رابط را پیاده‌سازی کند. systemd-oomd پیش از کشتن یک گروه کنترلی، برای هر سوکت کشف‌شده یک اعلان ارسال می‌کند. این مهلت زمانی در نظر گرفته شده به صورت سراسری است و نه برای هر قلاب به طور مجزا. اگر همه قلاب‌ها زودتر بازگردند، کشتن در سریع‌ترین زمان ممکن انجام می‌شود. مهلت زمانی باید حداقل ۱ ثانیه باشد. مقدار پیش‌فرض 0 است، به این معنی که systemd-oomd منتظر نخواهد ماند و هیچ اعلانی ارسال نخواهد شد.

در نگارش 260 اضافه شد.

systemd(1), systemd.resource-control(5), systemd-oomd.service(8), oomctl(1)

1.
💣💥🧨💥💥💣 لطفاً توجه داشته باشید که این فایل‌های پیکربندی باید همواره در دسترس باشند. اگر /usr/local/ یک پارتیشن جداگانه باشد، ممکن است در مراحل اولیه بوت در دسترس نباشد و نباید برای پیکربندی استفاده شود.
2.
Resource Pressure Handling
systemd 261.2