Linux operatsioonisüsteem kasutab plaanurit

Allikas: Imre kasutab arvutit
Redaktsioon seisuga 28. juuni 2026, kell 23:41 kasutajalt Imre (arutelu | kaastöö) (→‎Misc)
Mine navigeerimisribaleMine otsikasti

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

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

Docker compose konteinerite paigutamine cgroup seiskohast ühte komplekti

TODO

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 puhul on analoogne seadistus

20260628-plaanur-01.png

virtuaalse arvuti .scope juures

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