Pasitaiko atveju kai vienas procesas išnaudoja pakankamai didelį CPU kiekį taip trukdant kitiems procesams atlikti savo darbą. Vienas procesas turi laukti kol kitas pabaigs veiksmus ir tik tada pradėti savo darbą. Ši problema gali būti išsprendžiama limituojant CPU resursus pasitelkiant CPULimit programinę įrangą.
Pagrindis CPULimit tikslas yra sumažinti leidžiama CPU kiekį tuo metu kai atliekamas konkretus procesas. Limitavus nėra daroma įtaka nice reikšmei ar pirmenybių nustatymams - ribojamas konkretus CPU išnaudojimas. Taip pat, CPULimit adaptuojasi prie visos sistemos dinamiškai bei greitai.
Preliminarūs reikalavimai:
OpenVZ virtualizacijos Linux serveris naudojantis mūsų parengtus Ubuntu/Debian/CentOS operacinės sistemos šablonus.
CPULimit diegimas
Ubuntu/Debian operacinėse sistemose:
sudo apt-get install cpulimit
CentOS/Fedora operacinėse sistemoje visų pirma reikia įjungti EPEL repozitoriją:
sudo yum install epel-release
ir tada atlikti diegimą:
sudo yum install cpulimit
arba
sudo dnf install cpulimit
Naudojimas
Atlikus sėkmingą diegimą galite atlikti pavyzdinį CPU limitavimą. Visų pirma paleiskite komandą, kuri naudos didelį kiekį CPU. Susikurkite failą:
nano highcpu.sh
Ir įkelkite šį turinį:
#!/bin/bash
while :; do :; done;
Failą išsaugokite . Ši paprasta programa sukurs ciklą, kuris išnaudos maksimalų galima CPU resursą. Įgalinkite šį paleidimui:
chmod +x highcpu.sh
Ir paleiskite jį naudojant komandą:
./highcpu.sh &
Jums bus pateikiamas proceso ID numeris (PID), kaip pavyzdžiui:
[1] 1887
Ir patikrinkite, kiek resursų šis procesas išnaudoja paleisdami top komandą:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1887 root 20 0 9508 1200 1012 R 99.7 0.0 0:21.46 highcpu.sh
237 root 20 0 47564 1604 1108 S 0.7 0.0 11:51.14 rpcbind
379 root 20 0 71532 3108 1912 S 0.3 0.0 0:29.04 apache2
1 root 20 0 37396 3644 2108 S 0.0 0.0 0:09.13 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd/1+
3 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khelper/15+
72 root 20 0 133368 70296 70000 S 0.0 0.4 1:38.00 systemd-jo+
75 root 20 0 41628 1452 1004 S 0.0 0.0 0:00.38 systemd-ud+
239 message+ 20 0 42828 2044 1492 S 0.0 0.0 0:00.29 dbus-daemon
246 root 20 0 28484 1596 1292 S 0.0 0.0 0:00.51 systemd-lo+
248 root 20 0 26008 1128 892 S 0.0 0.0 0:00.60 cron
250 syslog 20 0 184624 2580 1184 S 0.0 0.0 0:31.92 rsyslogd
289 root 20 0 65448 2080 1364 S 0.0 0.0 0:17.71 sshd
318 root 20 0 89652 1280 336 S 0.0 0.0 0:00.00 saslauthd
320 root 20 0 89652 964 20 S 0.0 0.0 0:00.00 saslauthd
347 root 20 0 14996 832 640 S 0.0 0.0 0:00.00 xinetd
349 root 20 0 12780 844 708 S 0.0 0.0 0:00.00 agetty
Kaip pastebima iš top komandos atsakymo, highcpu.sh procesas išnaudoja 99.7% CPU. Kadangi yra išnaudojamas toks kiekis, nepavyktų dabar paleisti kito proceso. Po kelių minučių operacinė sistema užstrigtų. Šioje vietoje gali padėti CPULimit.
Galime apriboti šio proceso veikimas naudojant CPULimit įrankį. Šiuo atveju apribosime procesą iki 30% CPU:
cpulimit -l 30 -p 1887 &
* -l 30: apriboja procesą iki 30%;
* -p 2331: yra highcpu.sh PID.
Dabar patikrinkite CPU išnaudojimą su top komanda:
top
ir matome atsakymą:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1887 root 20 0 9508 1200 1012 R 30.7 0.0 0:21.46 highcpu.sh
237 root 20 0 47564 1604 1108 S 0.7 0.0 11:51.14 rpcbind
379 root 20 0 71532 3108 1912 S 0.3 0.0 0:29.04 apache2
1 root 20 0 37396 3644 2108 S 0.0 0.0 0:09.13 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd/1+
3 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khelper/15+
72 root 20 0 133368 70296 70000 S 0.0 0.4 1:38.00 systemd-jo+
75 root 20 0 41628 1452 1004 S 0.0 0.0 0:00.38 systemd-ud+
239 message+ 20 0 42828 2044 1492 S 0.0 0.0 0:00.29 dbus-daemon
246 root 20 0 28484 1596 1292 S 0.0 0.0 0:00.51 systemd-lo+
248 root 20 0 26008 1128 892 S 0.0 0.0 0:00.60 cron
250 syslog 20 0 184624 2580 1184 S 0.0 0.0 0:31.92 rsyslogd
289 root 20 0 65448 2080 1364 S 0.0 0.0 0:17.71 sshd
318 root 20 0 89652 1280 336 S 0.0 0.0 0:00.00 saslauthd
320 root 20 0 89652 964 20 S 0.0 0.0 0:00.00 saslauthd
347 root 20 0 14996 832 640 S 0.0 0.0 0:00.00 xinetd
349 root 20 0 12780 844 708 S 0.0 0.0 0:00.00 agetty
Kaip pastebite top komandos atsakyme, highcpu.sh yra sumažintas iki 30.7% (gali būti pastebima -3/+3% paklaida). Likę resursai gali būti naudojami kitiems procesams.
Papildomas galimas limitavimas yra naudojant vykdomosios programos failo pavadinimą. Kaip pavyzdžiui, mūsų failo highcpu.sh limitavimas būtų atliekamas naudojant šią komandą:
cpulimit -l 30 ./highcpu.sh &
Taip pat, galite pamatyti procesus, kurie veikia fone (angl. background) naudojant šią komandą:
fg
CPULimit taip pat gali būti naudojamas norint sužinoti aplikacijos elgseną kai procesui yra apribojamas CPU resursas.
