Е, както знаете, GNU & Linux са страхотни. Защо? Защото можем да ползваме контролни групи (CGroups)! Тази публикация:
- ще ви научи как да защитите критичните системни процеси както за паметта, така и за процесора.
- и предоставя видео наръчник за въвеждане на cgroups на работещ сървър.
- показва примерно внедряване на CGroups или SystemD slices.
Как да държите всичко под контрол
Можете да използвате CGroups, за да ограничите количеството ресурси, което е разрешено за процес или група от процеси. Да, така е. След като сте поставили даден процес в CGroups, можете спокойно да забравите за недостиг на изчислителни мощности.
В CloudSigma обичамe CGroups. Всъщност ги обичаме толкова много, че ги използваме навсякъде. Използваме CGroups за нашите чаши за кафе! Шегата настрана, използваме ги, за да ограничим наличните ресурси за процесите, които се изпълняват на нашите сървъри. По този начин ги държим под контрол.
Не по-малко важно е, че ги използваме, за да гарантираме ресурсите нужни на най-важните подсистеми на нашите физически хостове, което води до стабилност на клиентските виртуални машини.
Например, нашата системна част разполага само с 4 GiB! Повече от достатъчно за всяка GNU & Linux система да работи, нали? А в началото беше само 640 kiB… 🙁
Как да направим това? Например, как можем да гарантираме ресурси за нашата DRBD сторидж система?
Лесно! Ние просто ограничаваме всичко. И оставяме достатъчно ресурси за дистрибутирания сторидж CGroup, което в същото време има свои собствени ограничени.
Ако не знаете как да правите CGroups, позволете ми да ви науча на основите в този блог пост…
Има различни видове CGroups. Имаме памет CGroups, CPU CGroups, Block устройство CGroups и т.н.
Наблюдавайте ме как ограничавам процес в работеща система в този видеоклип:
Започваме
Първо инсталирайте инструментите, от които се нуждаете, за да манипулирате CGroups. Така е много по-лесно.
Аз съм потребител на Funtoo/Gentoo и Fedora, така че примерите са в контекста на тези операционни системи, но са също така постижими във всички Linux дистрибуции:
# Funtoo/Gentoo su -c 'emerge libCGroup' # Fedora su -c 'yum -y install libCGroup-tools'
Вече сме готови да създадем няколко CGroups.
Да кажем, че имате потребител в сървъра си, който използва много повече памет, отколкото бихте искали. Да предположим, че името му е Благоварт. Да кажем, че е използвал много повече памет, отколкото ви се иска и желаете да ограничите паметта и изчислителните мощности, които той използва.
Затова създаваме CGroups за процесора и паметта:
# become root su - # create blagovart's CGroup cgcreate -g cpu,memory:blagovart
Тази команда ще създаде директория в: /sys/fs/CGroup/cpu/blagovart и /sys/fs/CGroup/memory/blagovart. Принципно можем да постигнем това просто с mkdir, но е по-добре да използвате инструментите, предоставени от libCGroup. Те се грижат за някои от изисканията за работа на CGroups.
Така създадохме CGroups паметта и процесора на Благоварт. Сега нека създадем контейнер за неговия скрипт:
cgcreate -g cpu,memory:blagovart/litecoin-mining
И да поставим скрипта тук:
cgclassify -g cpu,memory:blagovart/litecoin-mining $( pidof my-litecoin-mining-script )
Сега неговият скрипт е готов, но все още не сме създали ограниченията. Нека определим някои лимити:
# Set memory to 1 GiB cgset -r memory.limit_in_bytes=1G blagovart/litecoin-mining # Set CPU priority to ~10% (1024 is 100% priority) cgset -r cpu.shares=102 blagovart/litecoin-mining
И ето, вече Благоварт няма да използва всички ресурси и останалите потребители ще бъдат по-щастливи!
Сега можем да направим това в цялата система.
SystemD Slices
Ако използвате SystemD система като Fedora, трябва да прочетете за slices. Човек може лесно да конфигурира ограничения в slices, също както ограниченията на груповите процеси и на ресурсите.
Пример:
# constraint users' memory usage to 256 MiB systemctl set-property user.slice MemoryLimit=256M # constraint system's memory usage to 512 MiB systemctl set-property system.slice MemoryLimit=512M
Готово! Това вече е постоянно. Тъй като има промени, за да бъдат приложени ще трябва да рестартирате системата.
Тази команда ще създаде следните файлове:
/etc/systemd/system/system.slice.d/50-MemoryLimit.conf /etc/systemd/system/user.slice.d/50-MemoryLimit.conf
Ако искате настройките да изчезнат просто ги изтрийте и рестартирайте.
За системи, които частично използват SystemD, като Ubuntu 14.04 или за такива, които не го използват, като Funtoo, имате други опции.
Една от тях използва следния код:
# /etc/cgconfig.conf group litecoin-mining { cpu { } memory { } } group blagovart/litecoin-mining { cpu { cpu.shares = 102; } memory { memory.limit_in_bytes = 1G; } }
Недостатък е, че все още не поставям скрипта в CGroups. Това просто създава CGroup структура, към която да закача процеси. В този случай просто мога да направя следното:
cgclassify -g cpu,memory:blagovart/litecoin-mining $( pidof my-litecoin-mining-script )
И след това идва ред на Ubuntu. Доколкото знам, Ubuntu 14.04, най-новият LTS към момента на писане, има проблеми със SystemD. Ще е нужен алтернативен подход като init скрипт :
# /etc/init/cgroups-myCGroups description "My CGroups Init" author "Renich Bon Ciric " start on started CGroup-lite console log pre-start script # create main CGroups cgcreate -g cpu,memory:blagovart # set memory to 1 GiB cgset -r memory.limit_in_bytes=1G blagovart/litecoin-mining # set CPU priority to ~10% (1024 is 100% priority) cgset -r cpu.shares=102 blagovart/litecoin-mining end script
И това е! Сега имате конфигурирани CGroups. Както виждате, лесно е да се работи с тях, но е много по-добре да имате система, съвместима със SystemD, благодарение на slices.
CGroups е страхотен ресурс от ядрото на Linux. Можете да го използвате навсякъде, където искате да контролирате използването на ресурси. Например, имаме библиотека CGroups, наречена: cgroupspy, която можете свободно да използвате от Python, за да направите каквото желаете със CGroups. Както обикновено, нашият лиценз няма как да бъде по-безплатен:
References
- https://www.kernel.org/doc/Documentation/cgroup-v1/cgroups.txt
- https://www.kernel.org/doc/Documentation/cgroup-v1/memory.txt
- http://www.freedesktop.org/software/systemd/man/systemd.slice.html
- http://www.freedesktop.org/software/systemd/man/systemd.resource-control.html
- https://wiki.archlinux.org/index.php/Cgroups
- Наръчник за използване на CGroups в облака - юли 10, 2017
- Бъдещето на Cloud Storage (и какво не е наред с настоящето) - юли 10, 2017