Linux operatsioonisüsteem kasutab plaanurit: erinevus redaktsioonide vahel

Allikas: Imre kasutab arvutit
Mine navigeerimisribaleMine otsikasti
 
(ei näidata sama kasutaja 18 vahepealset redaktsiooni)
8. rida: 8. rida:
 
* scheduler class - plaanuri klass
 
* scheduler class - plaanuri klass
 
* task
 
* task
  +
* hard irq
  +
* soft irq
  +
* lapic
  +
* nmi
  +
* preempt
  +
* realtime os
  +
* dynamic tick kernel (tickless kernel)
   
 
===Tööpõhimõte===
 
===Tööpõhimõte===
52. rida: 59. rida:
 
* plaanimisele ei avalda iseensest mõju
 
* plaanimisele ei avalda iseensest mõju
 
* plaanimisele avaldab mõju cgroup parameetri ... väärtus
 
* plaanimisele avaldab mõju cgroup parameetri ... väärtus
  +
  +
Joonis
  +
  +
<pre>
  +
  +
CPU
  +
______
  +
| |
  +
| | <- hard irq <- LAPIC
  +
| | kernel (scheduler)
  +
| | <----> runqueue <----> sleeping processes
  +
|______|
  +
</pre>
  +
  +
kus
  +
  +
* running protesess töötab järjestikuliselt cpu peal nii 2 - 12 millisekundit (3 GHZ protsessori puhul vastab sellele nii 10 miljonit cpu clock cycle'it)
  +
* kui scheduler paigutab protsessi protsessorile, siis ta programmeerib lapic seadme saatma hard irq signaali protsessorile mingil hetkel tulevikus nt 6 ms pärast
  +
* kui cpu saab lapic signaali siis ta lõpetab selleks korraks aktiivse protsessiga tegelemise, protsess liigub tagasi runqueue peale järgmist korda ootama ja scheduler otsib runqueue pealt cpule uut tegevust järgmiseks nt 4 millisekundiks
  +
* kunagi (aastal 2001 nt) lapic sai kord millisekundis nö lapic-metronoomilt teate otsida uut tegevust, nüüd on see dünaamiline st asjata ei toimu cpu raputust
  +
* kui arvutis on mitu protsessorit, siis on igal ühel oma runqueue
   
 
===Misc===
 
===Misc===
73. rida: 101. rida:
 
</pre>
 
</pre>
   
====runqueue vaatlemine====
+
====runqueue vaatlemine - runqlen====
  +
  +
Väited
  +
  +
* runqlen töötab nö strobo režiimis, st tehakse sekundis 99 pildistust ja pildile jääb mis parasjagu näha oli
  +
* kui süsteem on koormatud, siis kõik nö pildistused ei õnnestu
   
 
Ühes terminalis käivitatakse cpu intensiivsed tegevused, nt
 
Ühes terminalis käivitatakse cpu intensiivsed tegevused, nt
155. rida: 188. rida:
 
* nt protsessoril '3' on 15 korral saadud vastuseks runqueue pikkus 4 task'i
 
* nt protsessoril '3' on 15 korral saadud vastuseks runqueue pikkus 4 task'i
   
  +
====runqueue vaatlemine - runqlat====
Kui protsessoril ei ole tegevusi, siis runqueue tööde käitlemisega kaasneb väike latsentsus
 
  +
  +
Väited
  +
  +
* runqlat teeb täpseid mõõtmisi, st loetakse kokku kõik sekundi jooksul toimunud tegevustega seotud latsentsused
  +
  +
Kui protsessoril ei ole tegevusi, siis runqueue tööde käitlemisega kaasneb väike latentsus
   
 
<pre>
 
<pre>
212. rida: 251. rida:
   
 
* sekundi jooksul tehtud 116 mõõtmise puhul jäi runqueue töödega seotud viivitus vahemikku 65 - 131 millisekundit
 
* sekundi jooksul tehtud 116 mõõtmise puhul jäi runqueue töödega seotud viivitus vahemikku 65 - 131 millisekundit
  +
  +
====runqueue vaatlemine - runqslower====
  +
  +
300 ms pikemate latentsustega taskide esitamine
  +
  +
<pre>
  +
root@ph-minio-01:~# runqslower-libbpf 300000
  +
Tracing run queue latency higher than 300000 us
  +
TIME COMM TID LAT(us)
  +
08:38:18 openssl 5853 323734
  +
08:38:18 openssl 5883 331731
  +
08:38:18 openssl 5883 302975
  +
08:38:19 openssl 5861 303309
  +
08:38:19 openssl 5856 303740
  +
08:38:22 openssl 5884 303781
  +
08:38:22 openssl 5879 311728
  +
...
  +
</pre>
  +
  +
====Misc====
  +
  +
Interruptide vaatlemine - hard irqs
  +
  +
<pre>
  +
  +
</pre>
  +
  +
Interruptide vaatlemine - soft irqs
  +
  +
<pre>
  +
root@ph-minio-01:~# cat /proc/softirqs
  +
CPU0 CPU1 CPU2 CPU3
  +
HI: 4 3 1 1
  +
TIMER: 266186 251065 340940 264080
  +
NET_TX: 37 11 10 12
  +
NET_RX: 235897 17 38 350749
  +
BLOCK: 0 0 16614 0
  +
IRQ_POLL: 0 0 0 0
  +
TASKLET: 185 68 6 34
  +
SCHED: 319292 280974 367931 309538
  +
HRTIMER: 0 0 0 0
  +
RCU: 88553 85970 90509 105082
  +
  +
root@ph-minio-01:~# softirqs-libbpf -T 1
  +
Tracing soft irq event time... Hit Ctrl-C to end.
  +
  +
08:43:09
  +
SOFTIRQ TOTAL_usecs
  +
timer 202
  +
net_rx 49
  +
block 7
  +
sched 174
  +
rcu 42
  +
</pre>
  +
  +
käivitades võrgus tegevuse, ning .163 arvuti midagi ei taksita ja midagi ei kuula port 3001/tcp, ta vastab aktiivselt rst pakettidega
  +
  +
<pre>
  +
root@ph-minio-01:~# hping3 -S -c 400000 -i u20 -p 3001 192.168.10.163
  +
</pre>
  +
  +
paistab hping3 ütlemise arvutis ootuspäraselt softirq koormus
  +
  +
<pre>
  +
09:47:01
  +
SOFTIRQ TOTAL_usecs
  +
timer 766
  +
net_rx 152036
  +
tasklet 6801
  +
sched 911
  +
rcu 4375
  +
  +
09:47:02
  +
SOFTIRQ TOTAL_usecs
  +
timer 745
  +
net_rx 179450
  +
block 5
  +
tasklet 6523
  +
sched 745
  +
rcu 4414
  +
</pre>
  +
  +
kui aga rakendada .163 arvutis paketifilter
  +
  +
<pre>
  +
root@dh-minio-01:~# iptables -A INPUT -p tcp --dport 3001 -j DROP
  +
</pre>
  +
  +
Langeb softirq koormus oluliselt, aga mitte päris tagasi nö algusse
  +
  +
<pre>
  +
09:48:37
  +
SOFTIRQ TOTAL_usecs
  +
timer 976
  +
net_rx 14175
  +
block 2
  +
sched 478
  +
rcu 4858
  +
  +
09:48:38
  +
SOFTIRQ TOTAL_usecs
  +
timer 840
  +
net_rx 11001
  +
sched 557
  +
rcu 4796
  +
</pre>
  +
  +
Väidetavalt on põhjuseks NAPI nimeline tehnoloogia kuis rx ahel tegeleb tx ahela teatud osa nö clean-up'iga.
   
 
====Docker====
 
====Docker====

Viimane redaktsioon: 29. juuni 2026, kell 12:46

Sissejuhatus

Plaanuri (ingl. k. scheduler) ülesanne operatsioonisüsteemis on korraldada tööde (ingl. k. task) etteandmist protsessorile. Plaanimise tagajärjeks on sujuvam või vähem sujuvam süsteemi käitumine.

Mõisted

  • scheduler - eesti keeles plaanur
  • scheduler class - plaanuri klass
  • task
  • hard irq
  • soft irq
  • lapic
  • nmi
  • preempt
  • realtime os
  • dynamic tick kernel (tickless kernel)

Tööpõhimõte

Väited

  • Linux operatsioonisüsteemis puudub iseseisev plaanur deemon protsess
  • plaanimisega tegeleb kernel
  • plaanimist aitab jõustadaaitab riistvaraline komponent lapic (local advanced programmable interrupt controller)
  • lapic on uuemal ajal füüsilise protsessori kooseisus ('local ...') - teine kohal olev apic on 'i/o acpi'
  • plaanimist aitab jõustada tarkvaraline komponent systemd ja eriti cgroups
  • plaanimise mõistmine aitab hallata süsteemi jõudlust
  • plaanimise mõistmine aitab süsteemi monitoorida
  • tavaliselt uue protsessi tekkimiseks peab parent protsess olema protsessori peal töötavas olekus
  • tavaliselt uus tekkinud protsess jätkab protsessori peal töötavana (eriti harmoonilisel juhtumil töötab parent protsess üh cpu peal, ja forked child protsess hakkab tööle teise protsessori peal)

Linux operatsioonisüsteemis saavad protsessid olla neljas-viies erinevas olekus

  • running / runnable
  • sleep
  • ...
  • zombie

Plaanine toimub kahe tasemeliselt

  • plaanimise klasside järgi - tavaliselt on süsteemis kasutusel neli-viis plaanimis-klassi (ingl. k. scheduling class)
  • plaanimise klassi siseselt

Plaanimise klassid

  • stop
  • deadline
  • real-time
  • fair
  • extensible
  • idle

Väited

  • igat klassi teenindab tavaliselt oma plaanur (nt fair klassis töötab uuemal ajal eevdf)
  • iga task küljes on silt millisesse plaanimise klassi ta kuulub
  • kui kernel läheb järgmisel plaanimise ringile ta alab ülevalt ja protsessorile saadetakse töö esimesena kohatud klassist mis töid sisaldab - nt kui midagi on käivitada deadline klassist, siis üldse ei ole võimalust sellel ringil fair klassi töödel
  • plaanimisele ei avalda iseensest mõju protsessi omanik
  • plaanimisele ei avalda iseensest mõju
  • plaanimisele avaldab mõju cgroup parameetri ... väärtus

Joonis


                   CPU               
                  ______
                 |      |
                 |      |  <- hard irq <-  LAPIC
                 |      |                  kernel (scheduler)
                 |      |      <---->      runqueue            <---->    sleeping processes
                 |______|                                      

kus

  • running protesess töötab järjestikuliselt cpu peal nii 2 - 12 millisekundit (3 GHZ protsessori puhul vastab sellele nii 10 miljonit cpu clock cycle'it)
  • kui scheduler paigutab protsessi protsessorile, siis ta programmeerib lapic seadme saatma hard irq signaali protsessorile mingil hetkel tulevikus nt 6 ms pärast
  • kui cpu saab lapic signaali siis ta lõpetab selleks korraks aktiivse protsessiga tegelemise, protsess liigub tagasi runqueue peale järgmist korda ootama ja scheduler otsib runqueue pealt cpule uut tegevust järgmiseks nt 4 millisekundiks
  • kunagi (aastal 2001 nt) lapic sai kord millisekundis nö lapic-metronoomilt teate otsida uut tegevust, nüüd on see dünaamiline st asjata ei toimu cpu raputust
  • kui arvutis on mitu protsessorit, siis on igal ühel oma runqueue

Misc

Protsesside vaatlemine

Töötavate protsesside plaanuri esitamine

root@ph-minio-01:~# ps -eo pid,comm,policy,cls,pri | head -n 10
    PID COMMAND         POL CLS PRI
      1 systemd         TS   TS  19
      2 kthreadd        TS   TS  19
      3 pool_workqueue_ TS   TS  19
      4 kworker/R-kvfre TS   TS  39
      5 kworker/R-rcu_g TS   TS  39
      6 kworker/R-sync_ TS   TS  39
      7 kworker/R-slub_ TS   TS  39
      8 kworker/R-netns TS   TS  39
     11 kworker/0:0H-ev TS   TS  39

runqueue vaatlemine - runqlen

Väited

  • runqlen töötab nö strobo režiimis, st tehakse sekundis 99 pildistust ja pildile jääb mis parasjagu näha oli
  • kui süsteem on koormatud, siis kõik nö pildistused ei õnnestu

Ühes terminalis käivitatakse cpu intensiivsed tegevused, nt

root@ph-minio-01:~# cat openssl-speed-rsa.sh
timeout 40 openssl speed rsa >/dev/null 2>&1 &
timeout 40 openssl speed rsa >/dev/null 2>&1 &
timeout 40 openssl speed rsa >/dev/null 2>&1 &
...


Kui katse alguses arvuti eriti midagi ei tee, on runqueue'd tühjad, kõigil neljal protsessoril

root@ph-minio-01:~# runqlen-libbpf -C 1
Sampling run queue length... Hit Ctrl-C to end.
..
cpu = 0
     runqlen       : count     distribution
        0          : 99       |****************************************|
cpu = 1
     runqlen       : count     distribution
        0          : 99       |****************************************|
cpu = 2
     runqlen       : count     distribution
        0          : 99       |****************************************|
cpu = 3
     runqlen       : count     distribution
        0          : 99       |****************************************|
...

kus

  • sekundi jooksul 99 korda küsitud vastuseks on runqueue sisuks tühi

Kui seejärel arvutis algavad tegevused, paistab

cpu = 0
     runqlen       : count     distribution
        1          : 5        |*************                           |
        2          : 4        |**********                              |
        4          : 12       |********************************        |
        5          : 11       |*****************************           |
        6          : 15       |****************************************|
        7          : 11       |*****************************           |
        12         : 1        |**                                      |
cpu = 1
     runqlen       : count     distribution
        2          : 7        |**********                              |
        3          : 2        |**                                      |
        4          : 27       |****************************************|
        5          : 3        |****                                    |
        6          : 13       |*******************                     |
        7          : 7        |**********                              |
cpu = 2
     runqlen       : count     distribution
        2          : 4        |**********                              |
        3          : 11       |*****************************           |
        4          : 9        |************************                |
        5          : 13       |**********************************      |
        6          : 1        |**                                      |
        7          : 15       |****************************************|
        8          : 5        |*************                           |
        9          : 1        |**                                      |
cpu = 3
     runqlen       : count     distribution
        0          : 9        |************************                |
        1          : 3        |********                                |
        3          : 8        |*********************                   |
        4          : 15       |****************************************|
        5          : 6        |****************                        |
        6          : 5        |*************                           |
        7          : 15       |****************************************|
  • nt protsessoril '3' on 15 korral saadud vastuseks runqueue pikkus 4 task'i

runqueue vaatlemine - runqlat

Väited

  • runqlat teeb täpseid mõõtmisi, st loetakse kokku kõik sekundi jooksul toimunud tegevustega seotud latsentsused

Kui protsessoril ei ole tegevusi, siis runqueue tööde käitlemisega kaasneb väike latentsus

root@ph-minio-01:~# runqlat-libbpf 1
..
     usecs               : count    distribution
         0 -> 1          : 0        |                                        |
         2 -> 3          : 2        |**                                      |
         4 -> 7          : 10       |**************                          |
         8 -> 15         : 28       |****************************************|
        16 -> 31         : 6        |********                                |

     usecs               : count    distribution
         0 -> 1          : 1        |*                                       |
         2 -> 3          : 11       |*************                           |
         4 -> 7          : 15       |******************                      |
         8 -> 15         : 33       |****************************************|
        16 -> 31         : 5        |******                                  |
        32 -> 63         : 1        |*                                       |
        64 -> 127        : 1        |*                                       |
...
  • sekundi jooksul tehtud 33 mõõtmise puhul jäi runqueue töödega seotud viivitus vahemikku 8 - 15 mikrosekundit

Kui seejärel arvutis algavad tegevused, paistab

root@ph-minio-01:~# runqlat-libbpf 1
..
     usecs               : count    distribution
         0 -> 1          : 12       |**                                      |
         2 -> 3          : 69       |************                            |
         4 -> 7          : 77       |*************                           |
         8 -> 15         : 31       |*****                                   |
        16 -> 31         : 15       |**                                      |
        32 -> 63         : 15       |**                                      |
        64 -> 127        : 5        |                                        |
       128 -> 255        : 3        |                                        |
       256 -> 511        : 5        |                                        |
       512 -> 1023       : 8        |*                                       |
      1024 -> 2047       : 4        |                                        |
      2048 -> 4095       : 15       |**                                      |
      4096 -> 8191       : 9        |*                                       |
      8192 -> 16383      : 223      |****************************************|
     16384 -> 32767      : 58       |**********                              |
     32768 -> 65535      : 57       |**********                              |
     65536 -> 131071     : 116      |********************                    |
    131072 -> 262143     : 6        |*                                       |
    262144 -> 524287     : 31       |*****                                   |
    524288 -> 1048575    : 6        |*                                       |
...

kus

  • sekundi jooksul tehtud 116 mõõtmise puhul jäi runqueue töödega seotud viivitus vahemikku 65 - 131 millisekundit

runqueue vaatlemine - runqslower

300 ms pikemate latentsustega taskide esitamine

root@ph-minio-01:~# runqslower-libbpf 300000
Tracing run queue latency higher than 300000 us
TIME     COMM             TID           LAT(us)
08:38:18 openssl          5853           323734
08:38:18 openssl          5883           331731
08:38:18 openssl          5883           302975
08:38:19 openssl          5861           303309
08:38:19 openssl          5856           303740
08:38:22 openssl          5884           303781
08:38:22 openssl          5879           311728
...

Misc

Interruptide vaatlemine - hard irqs


Interruptide vaatlemine - soft irqs

root@ph-minio-01:~# cat /proc/softirqs
                    CPU0       CPU1       CPU2       CPU3
          HI:          4          3          1          1
       TIMER:     266186     251065     340940     264080
      NET_TX:         37         11         10         12
      NET_RX:     235897         17         38     350749
       BLOCK:          0          0      16614          0
    IRQ_POLL:          0          0          0          0
     TASKLET:        185         68          6         34
       SCHED:     319292     280974     367931     309538
     HRTIMER:          0          0          0          0
         RCU:      88553      85970      90509     105082

root@ph-minio-01:~# softirqs-libbpf -T 1
Tracing soft irq event time... Hit Ctrl-C to end.

08:43:09
SOFTIRQ          TOTAL_usecs
timer                    202
net_rx                    49
block                      7
sched                    174
rcu                       42

käivitades võrgus tegevuse, ning .163 arvuti midagi ei taksita ja midagi ei kuula port 3001/tcp, ta vastab aktiivselt rst pakettidega

root@ph-minio-01:~# hping3 -S -c 400000 -i u20 -p 3001 192.168.10.163

paistab hping3 ütlemise arvutis ootuspäraselt softirq koormus

09:47:01
SOFTIRQ          TOTAL_usecs
timer                    766
net_rx                152036
tasklet                 6801
sched                    911
rcu                     4375

09:47:02
SOFTIRQ          TOTAL_usecs
timer                    745
net_rx                179450
block                      5
tasklet                 6523
sched                    745
rcu                     4414

kui aga rakendada .163 arvutis paketifilter

root@dh-minio-01:~# iptables -A INPUT -p tcp --dport 3001 -j DROP

Langeb softirq koormus oluliselt, aga mitte päris tagasi nö algusse

09:48:37
SOFTIRQ          TOTAL_usecs
timer                    976
net_rx                 14175
block                      2
sched                    478
rcu                     4858

09:48:38
SOFTIRQ          TOTAL_usecs
timer                    840
net_rx                 11001
sched                    557
rcu                     4796

Väidetavalt on põhjuseks NAPI nimeline tehnoloogia kuis rx ahel tegeleb tx ahela teatud osa nö clean-up'iga.

Docker

Docker compose konteinerite paigutamine cgroup seiskohast ühte komplekti

TODO

Podman

TODO

system service unit - nginx

cgroup abil cpu limiidi sättimine - plaanuri mõjutamine

root@ph-minio-01:~# systemctl show nginx.service -p CPUQuotaPerSecUSec -p CPUWeight
CPUWeight=[not set]
CPUQuotaPerSecUSec=infinity

root@ph-minio-01:~# systemctl set-property nginx.service CPUQuota=50%

root@ph-minio-01:~# systemctl show nginx.service -p CPUQuotaPerSecUSec -p CPUWeight
CPUWeight=[not set]
CPUQuotaPerSecUSec=500ms

root@ph-minio-01:~# systemctl set-property nginx.service CPUWeight=50

root@ph-minio-01:~# systemctl set-property nginx.service CPUWeight=
root@ph-minio-01:~# systemctl set-property nginx.service CPUQuota=

root@ph-minio-01:~# cat /etc/systemd/system.control/nginx.service.d/50-CPUWeight.conf
# This is a drop-in unit file extension, created via "systemctl set-property"
# or an equivalent operation. Do not edit.
[Service]
CPUWeight=50
root@ph-minio-01:~#

Proxmox PVE

Proxmox puhul on analoogne seadistus

20260628-plaanur-01.png

virtuaalse arvuti .scope juures

root@pve-svc-02:~# systemctl status 53162.scope
● 53162.scope
     Loaded: loaded (/run/systemd/transient/53162.scope; transient)
  Transient: yes
     Active: active (running) since Sun 2026-06-28 23:25:15 EEST; 16min ago
 Invocation: 36a16058908642198721adacce543587
      Tasks: 17 (limit: 143385)
     Memory: 725.1M (peak: 801.2M)
        CPU: 43.184s
     CGroup: /qemu.slice/53162.scope
             └─1932172 /usr/bin/kvm -id 53162 -name ph-minio-01-moraal ...

Jun 28 23:25:15 pve-svc-02 systemd[1]: Started 53162.scope.
...

root@pve-svc-02:~# systemctl show 53162.scope -p CPUQuotaPerSecUSec -p CPUWeight
CPUWeight=50
CPUQuotaPerSecUSec=2s

root@pve-svc-02:~# cat /run/systemd/transient/53162.scope
# This is a transient unit file, created programmatically via the systemd API. Do not edit.
[Unit]
Before=pve-ha-lrm.service
Before=pve-guests.service

[Scope]
CPUQuota=200.00%
Slice=qemu.slice
KillMode=process
SendSIGKILL=no
TimeoutStopSec=infinity
CPUWeight=50

[Unit]
After=dbus.service

Kasulikud lisamaterjalid

  • TODO