frame

Sveiki apsilankę!

Jei forume lankaisi pirmą kartą, kviečiame registruotis ir prisijungti prie diskusijų.

Prisijungti Registruotis

Proceso limitavimas serveryje

iv_vytenisgiv_vytenisg Super Moderator
edited rugsėjo 24 Į Tipinės problemos
attachmentphpattachmentid345stc1d1524207709

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.


0. Preliminarūs reikalavimai:

- OpenVZ virtualizacijos Linux serveris naudojantis mūsų parengtus Ubuntu/Debian/CentOS operacinės sistemos šablonus.

1. 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


2. 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.
Pažymėtos temos:
Norėdami palikti komentarą, turite prisijungti arba registruokis.