cGroups (Control Groups) adalah fitur kernel Linux yang memungkinkan Anda untuk mengelola dan mengontrol resource system seperti CPU, memori, I/O, dan jumlah task yang dapat dijalankan.
Jika Anda sering menggunakan Kubernetes, mungkin Anda sudah mengenal fitur cGroups karena fitur ini digunakan untuk mengontrol penggunaan resource pada service pod. Namun, dalam panduan ini, kita akan mengimplementasikan cGroups untuk mengontrol penggunaan resource pada user Linux.
Prequites #
Periksa apakah cGroups v2 didukung oleh sistem operasi.
# grep cgroup /proc/filesystems
nodev cgroup
nodev cgroup2Output dari perintah diatas menunjukan jika sistem operasi yang digunakan mendukung cgroup v1 dan v2.
Selanjutnya, tambahkan systemd.unified_cgroup_hierarchy=1" pada baris GRUB_CMDLINE_LINUX di dalam file /etc/default/grub.
GRUB_TIMEOUT=1
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL="serial console"
GRUB_SERIAL_COMMAND="serial --speed=115200"
GRUB_CMDLINE_LINUX="crashkernel=auto biosdevname=0 net.ifnames=0 console=ttyS0,115200 rhgb scsi_mod.scan=sync systemd.unified_cgroup_hierarchy=1"
GRUB_DISABLE_RECOVERY="true"
GRUB_GFXPAYLOAD_LINUX=auto
GRUB_ENABLE_BLSCFG=trueUpdate konfigurasi GRUB dengan menjalankan perintah berikut.
grub2-mkconfig -o /boot/efi/EFI/rocky/grub.cfgLalu reboot server untuk menerapkan perubahan.
rebootSetelah server di-reboot, cek untuk memastikan cgroupv2 telah aktif.
# stat -fc %T /sys/fs/cgroup
cgroup2fs Using systemd #
Berikut adalah cara untuk mengonfigurasi resource menggunakan cgroups-v2 dan systemd.
Buat file cgroups.service lalu tambahkan baris berikut.
nano /etc/systemd/system/cgroup.service[Unit]
Description=Move processes of users to their cgroups
[Service]
ExecStart=/usr/local/bin/cgroup.sh
[Install]
WantedBy=multi-user.targetSelanjutnya buat file cgroup.sh lalu tambahkan baris berikut.
nano /usr/local/bin/cgroup.sh#!/bin/bash
pids=$(ls /proc | grep [0-9])
cgroupusers=$(cat /opt/cgroups/cgroupusers)
declare -A users
for uid in $cgroupusers; do
uids[$uid]=1
done
while sleep 5; do
newpids=$(ls /proc | grep [0-9])
diff=$(grep -Fxv "${pids[*]}" <(printf '%s\n' ${newpids[@]}))
for pid in ${diff[@]}; do
if [ -d /proc/$pid ]; then
uid=$(ps -o uid= -p $pid | awk '{$1=$1;print}')
if [ ${uids[$uid]} ]; then
echo $pid >> "/sys/fs/cgroup/"$uid".slice/cgroup.procs"
fi
fi
done
pids=$newpids
doneAtur permission file cgroup.sh supaya dapat dieksekusi.
chmod 755 /usr/local/bin/cgroup.shTentukan user yang akan disetting cgroups lalu cek uid user dengan perintah.
# id web1
uid=1000(web1) gid=1000(web1) groups=1000(web1)Kemudian tambahkan uid user ke dalam file /opt/cgroups/cgroupusers.
mkdir -p /opt/cgroups
nano /opt/cgroups/cgroupusers1000Lalu buat file dengan format $uid.slice seperti contoh berikut.
nano /etc/systemd/system/1000.slice[Unit]
Description=User Slice
[Slice]
CPUQuota=30%
IOReadBandwidthMax=/ 20M
IOWriteBandwidthMax=/ 20M
IOReadIOPSMax=/ 1024
IOWriteIOPSMax=/ 1024
MemoryMax=256M
MemoryHigh=128M
TasksMax=30
[Install]
WantedBy=multi-user.targetRestart service cgroup dan 1000.slice.
systemctl daemon-reload
systemctl enable --now cgroup 1000.sliceUsing /sys/fs/cgroup #
Buat folder Example di dalam path /sys/fs/cgroup.
mkdir /sys/fs/cgroup/Example/Sebagai contoh, kita akan mencoba membatasi penggunaan CPU untuk service mariadbd.
# pidof mariadbd
845Untuk membatasi penggunaan CPU hingga 30%.
echo "30000 100000" > /sys/fs/cgroup/Example/cpu.statLalu tambahkan PID mariadbd ke dalam file cgroup.procs.
echo "845" > /sys/fs/cgroup/Example/cgroup.procsVerifikasi bahwa mariadbd telah berjalan pada cgroup yang ditentukan.
# cat /proc/845/cgroup
0::/Example