نصب cgroups همراه با چند مثال

خرید بک لینک

در ابتدا برای اینکه ابزار 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 دوازده ماژول در هسته بنام زیر سیستم در آن وجود دارد:

  1. blkio، می توان محدودیتهای خواندن و نوشتن برروی دستگاه های بلوک ایجاد کرد.
  2. cpuacct، برای تولید گزارش مربوط به منابع cpu در گروه کنترل استفاده میشود.
  3. cpu، برای کنترل دسترسی فرایند به cpu در گروه کنترل استفاده میشود.
  4. cpuset، تقسیم وظایف در هستههای cpu، در گروه کنترل را انجام میدهد.
  5. devices، اجازه دسترسی به دستگاهها در گروه کنترل را میدهد.
  6. freezer، اجرای کار را در گروه کنترل متوقف و یا مجددا از سر میگیرد.
  7. hugetlb، پشتیبانی از حافظه صفحه بزرگ (tlb) برای گروههای کنترل را فعال میکند.
  8. memory، توزیع حافظه را برای فرایند در گروه کنترل را مدیریت میکند.
  9. net_cls، بسته های شبکه را با یک بر چسب ویژه برای شناسایی بسته هایی که توسط یک کار خاص در گروه کنترل ایجاد می شوند، نشان میدهد.
  10. net_prio، برای ایجاد پویایی اولویت های ترافیکی در گروه کنترل استفاده میشود.
  11. net_event، اجازه دسترسی به گروههای کنترل را به pert_events میدهد.

هر زیر سیستم یک دایرکتوری با فایلهای کنترل دارد که تنظیمات در آن ذخیره میشوند. فایلهای کنترل در زیر آورده شده است:

  1. cgroup.clone_children اجازه میدهد تنظیمات را از گروههای کنترل والیدین به گروههای فرزند انتقال داد.
  2. tasks : شامل لیستی از id یاpid های فرایند که به این گروه کنترلی مربوط است. بنابراین اگر فرایندی را به این گروه کنترلی اختصاص دهید فقط باید عدد فرایند خود را (pid) در فایل tasks وارد کنید.
  1. .cgroup.procs : شبیه فایل tasks است که فقط شاملid های نخ گروه است. زمانی مفید است که برنامه کاربردی چند نخی باشد.
  1. cgroup.event_conttol : زمانی استفاده میکنید که یک فرایندی با وضعیتی خارج از شرایط حافظه و یا چیزهای مشابه آن ، روبرو شود و بخواهید اطلاع پیدا کنید
  2. .release_agent حاوی دستوراتی است که در صورت فعال کردن notify_on_release؛ قابل اجرا است. این درخواست برای زمانی که میخواهیم یک گروه کنترل خالی به طور خودکار حذف شود.
  3. notify_on_release حاوی یک متغیر بولی (0 یا 1)، فعال یا غیر فعال برای اجرای دستور lease_agent است.

به طور مثال فایلهای در زیر سیستم 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 تاريخ: چهارشنبه 15 اسفند 1397 ساعت: 12:22

صفحه بندی