| earlyoom(1) | General Commands Manual | earlyoom(1) |
نام (NAME)
earlyoom - دیمن رسیدگی زودهنگام به کمبود حافظه (Early OOM)
خلاصه دستور (SYNOPSIS)
earlyoom [OPTION]...
توضیحات (DESCRIPTION)
قابلیت oom-killer معمولاً شهرت چندان خوبی در میان کاربران لینوکس ندارد. ممکن است کاربر مجبور شود دقایق طولانی در برابر سیستمی که هیچ پاسخی نمیدهد بنشیند، به صدای خرخر دیسک گوش دهد و در نهایت با تمام شدن صبر و حوصله، دکمه ریست را فشار دهد تا سریعاً به کارهای خود بازگردد.
برنامهٔ earlyoom میزان حافظهٔ در دسترس و سواپ آزاد را تا ۱۰ بار در ثانیه بررسی میکند (در صورتی که حافظهٔ آزاد زیادی وجود داشته باشد با تناوب کمتری این کار را انجام میدهد). اگر هر دوی حافظه و سواپ (در صورت وجود) به زیر ۱۰٪ برسند، بزرگترین فرایند (دارای بالاترین oom_score) را خاتمه میدهد.
مقادیر درصدی از طریق آرگومانهای خط فرمان قابل تنظیم هستند.
اگر هنگام تلاش برای خاتمه دادن به یک فرایند خطایی رخ دهد، earlyoom به مدت ۱ ثانیه به خواب میرود تا از پر شدن لاگها به دلیل خطاهای مکرر جلوگیری شود.
گزینهها (OPTIONS)
-m PERCENT[,KILL_PERCENT]
حداقل حافظهٔ در دسترس را برابر با PERCENT درصد از user mem total تنظیم میکند (پیشفرض ۱۰٪).
مقدار user mem total که در نسخهٔ ۱.۸ earlyoom معرفی شد، حافظهٔ قابلدسترسی توسط فضای کاربری است (MemAvailable+AnonPages همانطور که در /proc/meminfo گزارش شده است). هنگامی که دیسک رم tmpfs پر میشود، user mem total متناسب با آن کاهش مییابد.
با استفاده از درصدی از user mem total در مقایسه با کل حافظه، حداقل حافظهٔ تعیینشده همواره میتواند با خاتمه دادن به فرایندها به دست آید، حتی زمانی که tmpfs بخش بزرگی از حافظه را پر کرده باشد.
برنامهٔ earlyoom زمانی که هر دوی حافظهٔ در دسترس و سواپ آزاد زیر تنظیمات PERCENT مربوط به خود برسند، سیگنال SIGTERM ارسال میکند.
این برنامه هنگامی که هر دو به زیر تنظیم KILL_PERCENT مربوط به خود برسند (پیشفرض PERCENT/2)، سیگنال SIGKILL ارسال میکند.
اگر میخواهید همیشه از SIGKILL استفاده شود، مقدار یکسانی را برای PERCENT و KILL_PERCENT در نظر بگیرید.
مثالها:
-
earlyoom # sets PERCENT=10, KILL_PERCENT=5 earlyoom -m 30 # sets PERCENT=30, KILL_PERCENT=15 earlyoom -m 20,18 # sets PERCENT=20, KILL_PERCENT=18
-s PERCENT[,KILL_PERCENT]
حداقل سواپ آزاد را برابر با PERCENT درصد از کل تنظیم میکند (پیشفرض ۱۰٪). اگر برابر یا کمتر از KILL_PERCENT باشد (پیشفرض PERCENT/2)، سیگنال SIGKILL و در غیر این صورت SIGTERM ارسال میکند.
میتوانید از -s 100 استفاده کنید تا earlyoom در عمل مصرف سواپ را نادیده بگیرد: فرایندها به محض اینکه حافظهٔ در دسترس به زیر حداقلِ پیکربندیشده سقوط کند خاتمه مییابند، صرفنظر از اینکه چه مقدار فضای سواپ آزاد است.
اگر میخواهید همیشه از SIGKILL استفاده شود، مقدار یکسانی را برای PERCENT و KILL_PERCENT در نظر بگیرید.
-M SIZE[,KILL_SIZE]
بهعنوان جایگزینی برای تعیین درصد کل حافظه، -M حداقل حافظهٔ در دسترس را به میزان SIZE کیبیبایت (KiB) تنظیم میکند. این مقدار در داخل برنامه به درصدی از mem total که در زمان راهاندازی گزارش شده است تبدیل میشود. از user mem total برای محاسبهٔ زمان راهاندازی استفاده نمیشود، زیرا باعث میشد نتیجه به اینکه tmpfs در آن لحظه چقدر پر است وابسته شود.
اگر هر دو گزینهٔ -M و -m را ارسال کنید، مقدار کمتر استفاده میشود. مثال: رزرو ۱۰٪ از رم، اما حداکثر ۱ گیبیبایت (GiB):
-
earlyoom -m 10 -M 1048576
برنامهٔ earlyoom در صورتی که مقدار برابر یا کمتر از KILL_SIZE باشد (پیشفرض SIZE/2) سیگنال SIGKILL ارسال میکند، در غیر این صورت SIGTERM.
-S SIZE[,KILL_SIZE]
بهعنوان جایگزینی برای تعیین درصدی از کل سواپ، -S حداقل سواپ آزاد را به میزان SIZE کیبیبایت (KiB) تنظیم میکند. این مقدار در داخل برنامه به درصد تبدیل میشود. اگر هر دو گزینهٔ -S و -s را ارسال کنید، مقدار کمتر استفاده میشود.
در صورتی که مقدار برابر یا کمتر از KILL_SIZE باشد (پیشفرض SIZE/2) سیگنال SIGKILL و در غیر این صورت SIGTERM ارسال میکند.
-k
در نسخهٔ ۱.۲ earlyoom حذف شده است؛ جهت سازگاری نادیده گرفته میشود.
-i
در نسخهٔ ۱.۷ earlyoom حذف شده است؛ جهت سازگاری نادیده گرفته میشود.
-d, –debug
فعالسازی پیامهای اشکالزدایی.
-v
چاپ اطلاعات نسخه و خروج.
-r INTERVAL
زمان بین چاپ گزارشهای دورهای حافظه، بر حسب ثانیه (پیشفرض ۱.۰). یک گزارش حافظه به این صورت است:
-
mem avail: 21790 of 23909 MiB (91.14%), swap free: 0 of 0 MiB ( 0.00%)
برای چاپ گزارش در هر ساعت آن را روی ۳۶۰۰، برای چاپ روزی یکبار روی ۸۶۴۰۰ و غیره تنظیم کنید. برای غیرفعال کردن چاپ گزارشهای دورهای حافظه، آن را روی ۰ قرار دهید. پایش حافظهٔ آزاد و خاتمه دادن به فرایندها در شرایط کمبود حافظه، مستقل از این گزینه و با یک نرخ نظرسنجی انطباقی اجرا میشود که صرفاً به حافظهٔ آزاد بستگی دارد. به دلیل این نرخ نظرسنجی انطباقی، هنگامی که حافظهٔ آزاد زیادی وجود دارد، بازهٔ زمانی واقعی ممکن است تا ۱ ثانیه طولانیتر از مقدار تنظیمشده باشد.
-p
افزایش اولویت earlyoom: تنظیم niceness برنامهٔ earlyoom روی -20 و oom_score_adj روی -100.
هنگامی که earlyoom از طریق سرویس پیشفرض systemd اجرا میشود، سوییچ -p کار نمیکند. برای دستیابی به همان اثر، سه خط زیر را در sudo systemctl edit earlyoom وارد کنید:
-
[Service] OOMScoreAdjust=-100 Nice=-20
-n
فعالسازی اعلانها از طریق d-bus.
برای مشاهدهٔ واقعی اعلانها در نشست گرافیکی (GUI) خود، باید برنامهٔ systembus-notify با کاربر شما در حال اجرا باشد.
-N /PATH/TO/SCRIPT
اجرای اسکریپت دادهشده پس از خاتمه دادن به هر فرایند. باید یک مسیر مطلق باشد.
درون اسکریپت، اطلاعات مربوط به فرایند خاتمهیافته را میتوان از طریق متغیرهای محیطی زیر دریافت کرد:
-
EARLYOOM_PID Process PID EARLYOOM_NAME Process name truncated to 16 bytes (as reported in /proc/PID/comm) EARLYOOM_CMDLINE Process cmdline truncated to 256 bytes (as reported in /proc/PID/cmdline) EARLYOOM_UID UID of the user running the process
هشدار: متغیر EARLYOOM_NAME میتواند شامل فاصله، خط جدید، نویسههای ویژه باشد و توسط کاربر کنترل میشود، یا حتی میتواند خالی باشد! اطمینان حاصل کنید که اسکریپت اعلان شما میتواند این موارد را مدیریت کند!
-P /PATH/TO/SCRIPT
اجرای اسکریپت مشخصشده پیش از خاتمه دادن به هر فرایند. باید یک مسیر مطلق باشد.
توضیحات -N را ببینید؛ رفتار این گزینه دقیقاً مشابه است، به جز اینکه پیش از خاتمه یافتن فرایند اجرا میشود.
توجه داشته باشید که تاخیر کوتاهی (۲۰۰ میلیثانیه) در خاتمه دادن به قربانیِ انتخابشده وجود دارد تا فرصتی برای ایجاد این برنامه و انجام کاری معنادار فراهم شود. برنامهٔ فراخوانیشده باید بسیار سریع باشد تا قبل از خاتمه یافتن فرایندِ در حال اجرا، اطلاعات را از آن جمعآوری کند.
هرگونه تاخیری از این دست، و منابع اضافی مصرفشده توسط فرایند ایجادشده، همواره هزینهای تحمیل کرده و سیستمی را که خود دچار کمبود منابع است بیشتر تحت فشار قرار میدهد. بنابراین، فرایند فراخوانیشده باید تا حد امکان سبک و سریع باشد.
-g
خاتمه دادن به تمامی فرایندهایی که شناسه گروه فرایند (PGID) یکسانی با فرایندِ دارای مصرف بیش از حد حافظه دارند.
برای مثال، با فعال بودن این پرچم، اگر یکی از زیرفرایندهای یک برنامه حافظهٔ بسیار زیادی مصرف کند، کل برنامه خاتمه داده میشود (البته تا زمانی که همه آنها PGID یکسانی داشته باشند).
زمانی این پرچم را فعال کنید که پاکسازی کامل «کل برنامه» مطلوبتر باشد و مطمئن باشید که برنامه تمام فرایندهای خود را در یک PGID قرار میدهد.
توجه داشته باشید که برخی از محیطهای رومیزی (بهعنوان مثال GNOME) تمام برنامههای رومیزی را در همان گروه فرایند gnome-shell قرار میدهند. در صورت فعال بودن این پرچم، ممکن است earlyoom تمام این فرایندها از جمله gnome-shell را خاتمه دهد.
حتماً از قبل نحوه رفتار محیط خود را بررسی کنید. از دستور
-
pstree -gT
برای نمایش تمام فرایندها به همراه PGID درون براکت استفاده کنید.
--prefer REGEX
اولویت دادن به خاتمه فرایندهایی که نام comm آنها با REGEX مطابقت دارد (مقدار ۳۰۰ را به oom_score اضافه میکند).
نام comm همان رشتهٔ موجود در /proc/pid/comm است. این نام ۱۵ بایت اول نام فرایند است. نامهای طولانیتر به ۱۵ بایت کوتاه میشوند.
نام comm همان چیزی است که برنامههای top، pstree و ps -e نیز نشان میدهند. از هر یک از این ابزارها برای یافتن نام مناسب comm استفاده کنید.
مثال: میخواهید با gnome-control-center که طولانیتر از ۱۵ بایت است تطبیق دهید:
-
earlyoom --prefer '^gnome-control-c$'
--avoid REGEX
اجتناب از خاتمه دادن به فرایندهایی که نام comm آنها با REGEX مطابقت دارد (مقدار ۳۰۰ را از oom_score کسر میکند).
--ignore REGEX
نادیده گرفتن فرایندهایی که نام comm آنها با REGEX مطابقت دارد.
برخلاف گزینهٔ --avoid، این گزینه هرگونه امکان خاتمه دادن به فرایندهای مطابقتیافته را که ممکن بود به دلیل کسب oom_score بالا رخ دهد، بهکلی غیرفعال میکند.
از این گزینه با احتیاط استفاده کنید، زیرا هنگامی که earlyoom تصمیم به توقف فرایندها میگیرد، ممکن است فرایندهای دیگری به جای فرایندهای نادیدهگرفتهشده قربانی شوند.
--sort-by-rss
یافتن فرایند با بیشترین مقدار rss (پیشفرض oom_score است).
--dryrun
اجرای آزمایشی (هیچ فرایندی خاتمه داده نمیشود).
--syslog
استفاده از syslog بهجای جریانهای استاندارد.
معمولاً به این گزینه نیازی نیست، زیرا systemd لاگبرداری تمام خروجیها را مدیریت میکند.
گزینهٔ --syslog ممکن است برای سیستمهای تعبیهشدهٔ حداقلی که فاقد systemd هستند مفید باشد. برای مشاهدهٔ اطلاعات بیشتر به https://github.com/rfjakob/earlyoom/pull/292 مراجعه کنید.
-h, --help
نمایش این متن راهنما.
وضعیت خروج (EXIT STATUS)
0: اجرای موفقیتآمیز برنامه.
1: سایر خطاها - برای جزئیات به پیام خطا مراجعه کنید.
2: تداخل در گزینهها.
4: عدم امکان رفتن به دایرکتوری /proc.
5: عدم امکان باز کردن proc.
7: عدم امکان باز کردن /proc/sysrq-trigger.
13: گزینههای ناشناخته.
14: پارامترهای نادرست برای سایر گزینهها.
15: پارامترهای نادرست برای آستانهٔ حافظه.
16: پارامترهای نادرست برای آستانهٔ سواپ.
102: عدم امکان باز کردن /proc/meminfo.
103: عدم امکان خواندن /proc/meminfo.
104: عدم امکان یافتن مدخل مشخص در /proc/meminfo.
105: عدم امکان تبدیل عدد هنگام تجزیهٔ محتویات /proc/meminfo.
چرا OOM-Killer هسته فعال نمیشود؟ (WHY NOT TRIGGER THE KERNEL OOM KILLER?)
برنامهٔ earlyoom از دستور echo f > /proc/sysrq-trigger استفاده نمیکند، زیرا توسعهدهندگان مرورگر کروم با تنظیم بسیار بالای oom_score_adj، مرورگر خود را همواره به اولین قربانی (بیگناه!) تبدیل کردهاند. در عوض، earlyoom خودش با خواندن و بررسی /proc/*/status (در واقع /proc/*/statm که حاوی همان اطلاعات است اما تجزیهٔ برنامهنویسی آن سادهتر است) وضعیت را تشخیص میدهد.
علاوه بر این، در هستههای جدیدتر (روی 4.0.5 آزمایش شده)، فعال کردن دستی oom-killer هسته ممکن است اصلاً کار نکند؛ یعنی ممکن است فقط مقداری حافظهٔ گرافیکی را آزاد کند (که بلافاصله مجدداً تخصیص داده میشود) و در واقع هیچ فرایندی را خاتمه ندهد.
میزان مصرف حافظه (MEMORY USAGE)
حدود ۲ مبیبایت (MiB) VmRSS. تمامی حافظه با استفاده از mlockall() قفل میشود تا اطمینان حاصل شود که earlyoom در شرایط کمبود حافظه دچار افت سرعت نمیشود.
گزارش باگها (BUGS)
اگر در زمان راهاندازی earlyoom مقدار کل سواپ صفر باشد، هرگونه مقدار -S (حرف بزرگ «S») نادیده گرفته شده، یک هشدار چاپ میشود و درصدهای پیشفرض سواپ به کار میروند.
برای فرایندهایی که با --prefer مطابقت دارند، مقادیر منفی oom_score_adj لحاظ نمیشوند و فرایند یک oom_score مؤثر حداقل ۳۰۰ دریافت میکند. برای جزئیات بیشتر به https://github.com/rfjakob/earlyoom/issues/159 مراجعه کنید.
نویسندگان (AUTHORS)
نویسندهٔ earlyoom آقای Jakob Unterwurzacher ⟨jakobunt@gmail.com⟩ است.
این صفحهٔ راهنما توسط Yangfl ⟨mmyangfl@gmail.com⟩ برای پروژهٔ دبیان نوشته شده است (و ممکن است توسط دیگران نیز استفاده شود).
همچنین ببینید (SEE ALSO)
nohang(8)