Linux operatsioonisüsteem kasutab plaanurit: erinevus redaktsioonide vahel
Resümee puudub |
|||
| (ei näidata sama kasutaja 39 vahepealset redaktsiooni) | |||
| 6. rida: | 6. rida: | ||
* scheduler - eesti keeles plaanur |
* scheduler - eesti keeles plaanur |
||
| + | * 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=== |
||
| 19. rida: | 27. rida: | ||
* plaanimise mõistmine aitab hallata süsteemi jõudlust |
* plaanimise mõistmine aitab hallata süsteemi jõudlust |
||
* plaanimise mõistmine aitab süsteemi monitoorida |
* 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 |
Linux operatsioonisüsteemis saavad protsessid olla neljas-viies erinevas olekus |
||
| 26. rida: | 36. rida: | ||
* ... |
* ... |
||
* zombie |
* 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 |
||
| + | |||
| + | <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=== |
||
| + | ====Protsesside vaatlemine==== |
||
| + | |||
| + | Töötavate protsesside plaanuri esitamine |
||
| + | |||
| + | <pre> |
||
| + | 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 |
||
| + | </pre> |
||
| + | |||
| + | ====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 |
||
| + | |||
| + | <pre> |
||
| + | 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 & |
||
| + | ... |
||
| + | |||
| + | |||
| + | </pre> |
||
| + | |||
| + | Kui katse alguses arvuti eriti midagi ei tee, on runqueue'd tühjad, kõigil neljal protsessoril |
||
| + | |||
| + | <pre> |
||
| + | 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 |****************************************| |
||
| + | ... |
||
| + | </pre> |
||
| + | |||
| + | kus |
||
| + | |||
| + | * sekundi jooksul 99 korda küsitud vastuseks on runqueue sisuks tühi |
||
| + | |||
| + | Kui seejärel arvutis algavad tegevused, paistab |
||
| + | |||
| + | <pre> |
||
| + | 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 |****************************************| |
||
| + | </pre> |
||
| + | |||
| + | * 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 |
||
| + | |||
| + | <pre> |
||
| + | 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 |* | |
||
| + | ... |
||
| + | </pre> |
||
| + | |||
| + | * 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 |
||
| + | |||
| + | <pre> |
||
| + | 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 |* | |
||
| + | ... |
||
| + | </pre> |
||
| + | |||
| + | 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 |
||
| + | |||
| + | <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 compose konteinerite paigutamine cgroup seiskohast ühte komplekti |
||
| + | |||
| + | <pre> |
||
TODO |
TODO |
||
| + | </pre> |
||
| + | |||
| + | ====Podman==== |
||
| + | |||
| + | TODO |
||
| + | |||
| + | ====system service unit - nginx==== |
||
| + | |||
| + | cgroup abil cpu limiidi sättimine - plaanuri mõjutamine |
||
| + | |||
| + | <pre> |
||
| + | 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:~# |
||
| + | </pre> |
||
| + | |||
| + | ====Proxmox PVE==== |
||
| + | |||
| + | Proxmox puhul on analoogne seadistus |
||
| + | |||
| + | [[Fail:20260628-plaanur-01.png|800px]] |
||
| + | |||
| + | virtuaalse arvuti .scope juures |
||
| + | |||
| + | <pre> |
||
| + | 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 |
||
| + | </pre> |
||
===Kasulikud lisamaterjalid=== |
===Kasulikud lisamaterjalid=== |
||
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
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