در ابتدا برای اینکه ابزار cgroups را داشته باشیم، باید کتابخانه libcgroup را نصب کرده که توسط دستور yum و در سیستم centOS 6.4 انجام شده است. سپس برای اینکه ببینیم چه فایلهای و در کجا نصب شده، از دستور rpm استفاده شده است. آنگاه فایلها و مکان آنها بعد از نصب بسته، به عنوان خروجی خواهید دید.
$ yum install libcgroup
rpm --query --list libcgroup | less $
ls -l /cgroup $
این کتابخانه دو دایرکتوری (bin/ و cgroup/ ) برای زیر سیستم ها ایجاد میکند. همچنین فایل های پیکربندی و اسکریپتهای init و غیره را نیز ایجاد میکند. در ابتدا دایرکتوری cgroup خالی است. دستور زیر را تایپ کنید. فایل پیکربندی را مشاهده کنید.
$l ess /etc/cgconfig.conf
$ service cgconfig start
$l s -l /cgroup
هر زیر سیستم دارای فایلهای کنترل مخصوص به خود است. مثلا، برای ایجاد گروه کنترل، ما فقط یک دایرکتوری در یک زیر سیستم ایجاد میکنیم. فایلهای کنترل، به طور خودکار به این دایرکتوری اضافه میشوند. اضافه کردن فرایندها به یک گروه بسیار ساده است: شما فقط باید pid خود را به فایل کنترل وظایف اضافه کنید.
حالا دستور زیر را تایپ کنید دایرکتوریهای زیادی ایجاد میشود که هر کدام برای مدیریت همان زیر سیستم استفاده میشود. برای مثال دایرکتوری memory برای مدیریت حافظه است. یا دایرکتوری cpu برای مدیریت cpu است. در اینجا فهرستی از زیر سیستمها می بینید:
$ ls /cgroup
blki cpu,cpuacct freezer net_cls pref_event cpu cpuset hugtlb net_cls,net_prio pids cpuacct devices memory net_prio systemd
همانظور که گفته شد، مکانیسم cgroups متشکل از دو بخش هسته cgroups و زیر سیستم های cgroups است. به طور نمونه در نسخه 4.4.0.21 دوازده ماژول در هسته بنام زیر سیستم در آن وجود دارد:
هر زیر سیستم یک دایرکتوری با فایلهای کنترل دارد که تنظیمات در آن ذخیره میشوند. فایلهای کنترل در زیر آورده شده است:
به طور مثال فایلهای در زیر سیستم cpuset در زیر ملاحظه می کنید:
$ mkdir /cgroup/cpuset/group
$ ls /cgroup/cpuset/group
group.clone_children cpuset.memory_pressure cgroup.procs cpuset.memory_spread_page cpuset.cpu_exclusive cpuset.memory_spread_slab cpuset.cpus cpuset.mems cpuset.effective_cpus cpuset.sched_load_balance cpuset.effective_mems cpuset.sched_relax_domain_level cpuset.mem_exclusive notify_on_release cpuset.mem_hardwall tasks cpuset.memory_migrate
مجموع گروههای کنترل در یک زیر سیستم، سلسله مراتب نامیده می شود. حالا به یک مثالی از تولید گروه فرزند در یک سلسله مرتب گروهها می پردازیم. گروه فرزند را در گروه کنترلی blkio ایجاد میکنیم. پس باید در ابتدا در دایرکتوری cgroup/blkio وارد شویم و یک فرزندی بنام test1 ایجاد کنیم که لازم است اول یک دایرکتوری بنام test1 ایجاد شود، که دستور cgceate دایرکتوری همنامی ایجاد خواهد کرد. وقتی لیستی از محتویات دایرکتوری میگیرید، ملاحظه میشود به طور خودکار اطلاعاتی درست شبیه دایرکتوری والد درج شده که البته به جز فایل release_agent که مختص بالاترین سطح(ریشه) است.
حالا میتوانیم مجدد سلسله مراتب ببینیم. ما یک دایرکتوری بنام cgroup داریم و سپس یک زیر سیستم blkio و یک فرزندی از blkio که دارای یک گروه بنام test1 است. از ابزار lscgroup برای نمایش گروه های کنترل میتوان استفاده کرد که نشان میدهد ما یک گروه blkio داریم و یک گروه blkio:/ test1 داریم.
$ mkdir /cgroup/blkio/test1
$ cd /cgroup/blkio/test1
$ lscgroup
در حال حاضر ملاحظه میشود هیچ فرایندی در گروه ما وجود ندارد. برای اضافه کردن فرایند، باید pid خود را در فایل وظایف بنویسیم.
$ echo $$ > /cgroup/cpuset/group0/tasks
نمادهای $$، برای pid فرایندی که توسط پوسته دستور فعلی اجرا میشود، است. این فرایند به هیچ هستهی cpu متصل نیست که این تایید می توانیم با دستور زیر ببینیم:
$ cat /proc/$$/stauts |grep '_allowed'
cpus_allowed: 2
cpus_allowed_list: 0-1
mems_allowed: 00000000,00000001
mems_allowed_list: 0
در اینجا 2 هسته cpu، شماره 0 و 1، برای این فرایند قابل دسترس شده است. این فرایند را میخواهیم به هسته شماره 0 اضافه کنیم پس دستورات زیر را مینویسیم:
$ echo 0 >/cgroup/cpuset/group0/cpuset.cpus
$ cat /proc/$$/status |grep '_allowed'
cpus_allowed: 1
cpus_allowed_list: 0
mems_allowed: 00000000,00000001
mems_allowed_list: 0
گروه مثال قبل برای مدیریت حافظه را در نظر بگیرید.
$ mkdir /cgroup/memory/group0
اجرا می کنیم:
$ echo $$ > /cgroup/memory/group0/tasks
استفاده از حافظه را برای گروه کنترل 0 محدود میکنیم. لازم است وارد محدودیت گفته شده در حافظه فایل شویم:
$ echo 40M > /cgroup/memory/group0/memory.limit_in_bytes
مکانیزم cgroups دارای مدیریت جامع حافظه است. به عنوان مثال، میتوان آن را از فرایندهای بحرانی و افتادن در دام oom-killer محافظت کنیم:
$ echo 1 > /sys/fs/cgroup/memory/group0/memory.oom_control
$ cat /sys/fs/cgroup/memory/group0/memory.oom_control
oom_kill_disable 1
under_oom 0
برای مثال، اگر قرار بود ssh daemon را در یک گروه کنترل جداگانه قرار دهیم و oom-killer را برای آن گروه خاموش کنیم.
گروه کنترل را برای مدیریت دستگاهها اضافه می کنیم:
$ mkdir /cgroup/devices/group0
در ابتدا به صورت پیش فرض این گروه از دسترسی به هر دستگاه ممنوع است:
$ cat /cgroup/devices/group0/devices.list
a *:* rwm
محدودیت ایجاد می کنیم:
$ echo 'c 1:3 rmw' > /cgroup/devices/group0/devices.deny
این دستور دستگاه dev/null را به لیست گروه کنترل از دستگاههای محدود شده، اضافه میکند. خط 'c 1:3 rmw' را به فایل کنترل مینویسیم. در ابتدا نوع دستگاه؛ که در اینجا با c معین شده؛ وارد میشویم. دو نوع دیگر دستگاههای (b) بلوک و بقیه دستگاهها (a) هستند. پس ما دو نوع دستگاه اصلی و فرعی داریم. برای پیدا کردن شماره دستگاه از دستور زیر اسفاده میکنیم.
$ ls -l /dev/null
به جای مسیر dev/null هر مسییر دیگری میتوانید درنظر بگیرید:
crw-rw-rw- 1 root root 1, 3 May 30 10:49 /dev/null
سه حرف نشان دهنده مجوز های دسترسی است: -r اجازه خواندن فایل از دستگاه داده شده؛ -w اجازه نوشتن به دستگاه داده شده؛ -m مجوز ایجاد فایل دستگاه جدید. سپس اجرا می کنیم:
$ echo $$ > /cgroup/devices/group0/tasks
$ echo "test" > /dev/null
در زمان اجرای دستور سیستم خطای زیر را میدهد.
-bash: /dev/null: Operation not permitted
نمیتوان /dev/null ارتباط برقرار کرد چون دسترسی مسدود شده است. بازنویسی دسترسی:
$ echo a > /cgroup/devices/group0/devices.allow
پس از اجرای این دستور، ورودی a *.* nwm به فایل sys/fs/cgroup/devices/group0/devices.all اضافه میشود. و تمام محدودیتها لغو خواهد شد.
گناهان...ما را در سایت گناهان دنبال میکنید
برچسب: نویسنده: بازدید: 110