Linux operatsioonisüsteem kasutab plaanurit: erinevus redaktsioonide vahel

Allikas: Imre kasutab arvutit
Mine navigeerimisribaleMine otsikasti
213. rida: 213. 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
   
300 ms kauem kestvate latentsustega taskide esitamine
+
300 ms pikemate latentsustega taskide esitamine
   
 
<pre>
 
<pre>

Redaktsioon: 29. juuni 2026, kell 08:39

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

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

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

Ü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

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

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

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

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