لینوکس ۳۰۵؛ شب ۳۳: cgroup v2 و محدودیت حافظه/CPU
فهرست نوشته
namespace دید را جدا میکند و cgroup بودجهٔ مصرف را. امشب process ساده را در scope محدود میگذاریم و مقدار controller واقعی را میخوانیم.
این جلسه بخشی از دورهٔ لینوکس ۳۰۵ در ۶۰ شب است.
جایگاه در دوره: هدفهای 352.1 آزمون 305-300.
محیط: VM systemd با unified cgroup v2؛ فشار OOM عمدی اجرا نمیشود. cgroup v1 در واژگان آزمون باید شناخته شود، ولی نمونهٔ عملی v2 است.
stat -fc %T /sys/fs/cgroup
cat /sys/fs/cgroup/cgroup.controllers
cat /proc/self/cgroup
cgroup2fs نشانهٔ mount v2 است. مسیر معمول Linux /sys/fs/cgroup است؛ صورت plural در بعضی فهرستهای سرفصل را مسیر آمادهٔ کپی فرض نکن.
در ترمینال اول:
sudo systemd-run --unit=lpic305-cg --scope \
-p MemoryMax=128M -p CPUQuota=25% sleep 120
در ترمینال دوم:
systemctl show lpic305-cg.scope -p ControlGroup -p MemoryMax -p CPUQuotaPerSecUSec
LAB_CGROUP=$(systemctl show lpic305-cg.scope -p ControlGroup --value)
cat "/sys/fs/cgroup$LAB_CGROUP/memory.max"
cat "/sys/fs/cgroup$LAB_CGROUP/cpu.max"
cat "/sys/fs/cgroup$LAB_CGROUP/memory.events"
scope فقط هنگام اجرای sleep زنده است؛ اگر پایان یافته، مسیر را خالی فرض و به cgroup root رجوع نکن. memory.max سقف hard، memory.high throttling و cpu.max quota/period هستند. درصد quota نسبت به ظرفیت یک CPU تفسیر میشود، نه لزوماً درصد کل host چندcore.
systemd را مدیر cgroup نگه دار؛ روی hierarchy آن manual mkdir/chown گسترده انجام نده. delegation برای runtime/rootless باید محدود و معتبر باشد. swap و limits hierarchy نیز روی نتیجه اثر دارند.
آزمون و بازگشت: مقادیر controller با propertyها سازگار باشند و process زنده/محدود باشد. بعد از پایان یا stop scope همین object حذف میشود؛ daemonهای دیگر را متوقف نکن.
منبع: cgroup v2 ، systemd resource control .