Linux plokkseadme kasutamine

Allikas: Imre kasutab arvutit
Mine navigeerimisribaleMine otsikasti

Sissejuhatus

TODO

Tööpõhimõte

Väited

  • tavaliselt on arvutis töötaval tavakasutaja protsessil vajadus tegeleda andmesalvestusega (kirjutada ja lugeda)
  • protsess iseenesest loeb ja kirjutab andmeid ja seejuures protsess ei tegele otseselt ühe või teise füüsilisele plokkseadmele endale iseloomuliku kvaliteediga (nt 4 kBait ploki kirjutumisega või sügavusega 6 command queue kasutamisega (see on tema juurest mitu kihiti allapoole jääva abstraktisioonikihi teema)) - nt protsess tegeleb video faili lugemisega ja pildi esitamisega ekraanile - protsessi jaoks on oluline, et allolev storage lahendus varustab teda ühtlaselt andmetega piisavas tempos (et pildi näitamine ei takerduks)
  • andmed läbivad mitu kihti prosessi juurest füüsilisele andmekandjale jõudmisel, nt
 protsess -> failisüsteem -> iscsi kliendipoole plokkseade -> võrk -> iscsi serveris asuv füüsiline raid lülitus -> füüsiline plokkseade

Plokkseadme kasutamisel ilmnevad selliseid kvaliteedid

  • iops (input-output operatsioonide arv sekundis) kiirus - nö madalamas kihis toimetades füüsilise plokkseadme suhtlemine koosneb elementaarsetest tegevustest, nt mingi ühe korraga piiratud andmete mahu tüki (ploki) kirjutamine - nt 4 MBait suurust faili kirjutatakse 5 tegevusena: fail jagatakse kirjutamise kihis 5 tükiks: 1. üks MBait, 2. üks MBait, 3. üks MBait, 4. pool MBait ja 5. pool Mbait ('iostat -x -m 5' väljundis r/s ja w/s)
  • plokkseadmega tegelemisel kasutatava ühe pöördumise tüki ehk ploki suurus - tavaliselt 4 kBait kuni 2 MBait ('iostat -x -m 5' väljundis wareq-sz ja rareq-sz)
  • plokkseadmega seotud command queue'de arv - tavaliselt hdd ja sata-ssd ketaste puhul on see üks tükk; nvme ketta puhul tuhended tükid
  • tükkidega tegelemisel lisandub selline võimalus, et andmete liikumisel läbi erinevate salvestuskihide on võimlik süsteemil ühendada väiksemaid tükke kokku suuremateks (sõltuvalt asjaoludest on see võimalik või siis ei ole, nt random-write vs sequential-write) - ('iostat -x -m 5' väljundis wrqm/s ja rrqm/s)
  • ühe command queue sügavus - tavaliselt hdd ja sata-ssd ketaste puhul on see 32 ('hdparm -I /dev/sdc | grep "Queue depth"'), mis parasajagu realiseeritakse on 'iostat -x -m 5' väljundis aqu-sz väärtuseks
  • mahu liikumise kiirus - Megabaitide liikumise arv sekundis - see on mitmete eelpool kirjeldatud asjaolude moel või teisel realiseeriumise tulemus (nt sõltub kui suure tüki suurusega iops tegelemisel tegeleda õnnestub, või millise sügavusega õnnestub command queue kasutamine) - ('iostat -x -m 5' väljundis rMB/s ja wMB/s)
  • mainitud kvaliteetide puhul tuleb eristada füüsilise plokkseadme tootja lubadust parajagu realiseeritud väärtusest: nt füüsilise ketta puhul on command queue sügavus 32 sissekannet ja see on fikseeritud arv; kui toimub kõvaketta kasutus siis sõltuvalt sellest mida arvutis töötavad protsessid parasjagu kettaga teevad saab see arv olla palju väiksem või natuke väiksem

Väited kvaliteetide omavahelise dünaamika kohta

  • kui protsess kirjutab andmeid (nt wget protsess, postgres protsess, dd protsess, scp protsess või fio protsess), siis protsess ise otseselt ei nõua omale ploki suurust, queue sügavust, iops kiirust ega mahu kopeerimise kiirust - nende omaduste väärtused kujunevad muude asjaolude tagajärjena
  • protsess saab nö julgustada storage osakonda endaga tegelema moel või teisel, nt fsync syscall ütleb, et andmed peavad jõudma kohe füüsilisele plokkseadmele välja ja kui andmeid on vähe, siis võib sellega kaasneda madalas kihis väike plokisuurus (iostat -x -m väljundis 'wareq-sz' väike arv) ning eriti kui kirjutatakse selliseid tükke olemasoleva faili erinevatele positsioonidele, st siis on tegu nn random-write operatsiooniga, tulemusena on wareq-sz väike nt 4 KBait ning ei toimu ka mergemist (wrqm/s on väike)
  • postgresqli tarkvara seadistamisel on kasutada parameeter effective_io_concurrency - julgustab protsessi tegema mitmed paralleelseid io kasutamise tegevusi
  • protsess ei saa küll otseselt öelda nt et teenindatagu-mind-command-queue-pikkusega-16, aga ta saab jälgida kuidas läheb tema andmete salvestamise ülesannetega all töötaval storage osakonnal ja siis hoida ennast rohkem või vähem tagasi järmiste ülesannete andmisega (vastavalt queue käesolev täituvus suureneb või väheneb)
  • %wrqm näitab kui suure hulga kirjutatavatest plokkidest moodustavad mergemise teel moodustatud plokid (ülejäänud on nö naturaalselt kirjutamisele jõudnud plokid

Dünaamika põhjust ja tagajärge on hea illustreerida fio programmi võimalustega, muu hulgas saab fio tööd juhtida selliste parameetritega

  • bs - nt 4k, 8k, 128k
  • iodepth - nt 2, 8, 32
  • readwrite - nt read, randread, write, randwrite (vastavalt järjestikuline kirjutamine mis on hästi mergetav, ja random kirjutamine mis on halvasti mergetav)

Need parameetrid ei ütle otseselt kuidas peab käituma iodepth osas linux kerneli storage osakond, aga fio protsess jälgib kuidas tal töötamine edeneb ja siis käigult tõstab oma tempot, on nõudlikum, leebem, kirjutab oma fio.img faili erinevatele positsioonidele. Ja privileegide loogika mõttes ei saagi tavakasutaja ega ka root kasutaja protsess öelda kerneli storage osakonnale ette nt command queue kasutamisele tulevat sügavust.

IO scheduler

Väited

  • arvuti storage io teemaga tegelemisel on asjakohane pöörata tähelepanu, milline 'io scheduler' on kasutusel
  • io scheduler ülesanne on kerneli ja plokkseadme vahel toimuvat andmevahetust ümber järjestata, liigendada jne
  • io scheduler määratakse plokkseadme jaoks (mitte operatsioonisüsteemi jaoks tervikuna)
  • kasutusel olevat scheduleri saab käigult muuta ilma andmekaota (iseasi kas seda on tark teha nö keset tööpäeva)

Nt saab küsida selliselt /dev/sde plokkseadmega tegeleva scheduleri kohta

root@rae-cf-04:~# cat /sys/block/sde/queue/scheduler 
[mq-deadline] none
  • [ ] märkide vahel on kasutusel oleva io-scheduler'i (elevator) nimi, muud esitatud väärtused on kasutamiseks saadaval (aga nt 'none' tuleks aktiveerida udev või linux-command-line abil)
  • mq ehk multiqueue väljendab asjaolu, et scheduler toetab plokkseadmega seotuses queue kasutamist
  • deadline on üks võimalikest scheduleridest; schedulerid on vajalikud pigem nö rumalate plokkseadmete puhul (nt hdd tüüpi kettad); nvme-ssd sisaldab endas niigi praktiliselt arvutit ja asjakohane on kasutada none nimelist scheduleri

virtuaalse arvuti scheduler on reegline 'none'

root@rae-pbs-01:~# cat /sys/block/vda/queue/scheduler 
[none] mq-deadline 

mdadm seadmega ei ole scheduler seotud

root@jagaja ~ $ ls -ld /sys/block/md127/queue/scheduler
ls: cannot access '/sys/block/md127/queue/scheduler': No such file or directory

iscsi seadmega on seotud scheduler 'none'

root@pve-moraal-x570:~# cat /sys/block/sdg/queue/scheduler 
none [mq-deadline] 

fiber channel fc seadmega on seotud scheduler 'none'

root@adala-pve-4:~# cat /sys/block/sdh/queue/scheduler 
[none] mq-deadline 

multipath seadmega on seotud scheduler none

root@adala-pve-4:~# dmsetup -c info | grep mpath | grep 7
mpath_vol_hdd_pve_1                        253   7 L--w    2    1      0 mpath-3600000e00d300000003008ec00070000                             

root@adala-pve-4:~# cat /sys/block/dm-7/queue/scheduler 
none [mq-deadline] 

ceph rados block device seadmega on seotud scheduler none

root@jagaja ~ $ cat /sys/block/rbd2/queue/scheduler 
[none] mq-deadline 

Mõõtmine - üksik sata-ssd ketas - randrw, 8k

Üksiku sata-ssd kettana on kasutuses selline seade

root@rae-cf-04:~# smartctl -a /dev/sde
smartctl 7.2 2020-12-30 r5155 [x86_64-linux-5.15.0-130-generic] (local build)
Copyright (C) 2002-20, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Device Model:     Micron_5400_MTFDDAK7T6TGA
Serial Number:    24504CD75CBC
LU WWN Device Id: 5 00a075 14cd75cbc
Firmware Version: D4MU802
User Capacity:    7 681 501 126 656 bytes [7,68 TB]
Sector Sizes:     512 bytes logical, 4096 bytes physical
Rotation Rate:    Solid State Device
Form Factor:      2.5 inches
TRIM Command:     Available, deterministic, zeroed
Device is:        Not in smartctl database [for details use: -P showall]
ATA Version is:   ACS-4 (minor revision not indicated)
SATA Version is:  SATA 3.3, 6.0 Gb/s (current: 6.0 Gb/s)
Local Time is:    Sun Feb  2 00:11:16 2025 EET
SMART support is: Available - device has SMART capability.
SMART support is: Enabled
...

ning seadmele on otse st ilma partitsioonitabelita moodustatud ext4 failisüsteem, enne katsetamise ära oodata lazyext4 abil failisüsteemi valmis saamine

# mkfs.ext4 /dev/sde
# mount -o init_itable=1 /dev/sde /mnt/sde
# ps aux | grep lazy
# iostat -m -x 5 /dev/sde
# umount /mnt/sde
# mount /dev/sde /mnt/sde

fio seadistusfail

root@rae-cf-04:~# cat fio.fio 
[global]
ioengine=libaio
invalidate=1
ramp_time=5
runtime=180
time_based
direct=1
group_reporting=1
per_job_logs=0
bs=8k
readwrite=randrw
size=40g
iodepth=8
end_fsync=1
# gtod_reduce=1
  
[test1-subtest1-blocksize32k]
filename=/mnt/sde/fio.img
numjobs=4

kus

  • bs=8k - väljendab, et üks fio protsess teeb linux kerneli suunal sellise iseloomuga (mahuga, liigendusega, kiirusega jne) suuruste tükkidega tegevusi (ja nagu allpool on iostat väljendist paista, millele reageerib tuum plokkseadme poole 8k suurustege päringutega pöördumistega)
  • randrw ehk juhusliku asukoha suhtes kirjutamine ja lugemine - plokkseadme jaoks kõige väljakutsuvam variant (nt järjestikulise lugemisega võrreldes) - ootus on madal mergemine
  • käivitatakse kõrvuti 4 fio protsessi
  • command queue sügavus on ühel protsessil 8 - kokku oleks ootus 32 sügavuse kasutamine

ning käivitamisel paistab

root@rae-cf-04:~# iostat -m -x 30 /dev/sde | grep ^sde
Device             r/s     rMB/s   rrqm/s  %rrqm  r_await  rareq-sz       w/s     wMB/s   wrqm/s   %wrqm  w_await wareq-sz      d/s    dMB/s   drqm/s   %drqm  d_await dareq-sz      f/s  f_await   aqu-sz  %util
.. 
sde           14877,40    116,23     0,00   0,00    1,15       8,00  14874,17    116,20     0,13    0,00    0,40      8,00     0,00     0,00     0,00    0,00     0,00     0,00     0,33     0,90    23,04  72,85
sde           20255,17    158,24     0,00   0,00    1,15       8,00  20301,07    158,60     0,20    0,00    0,41      8,00     0,00     0,00     0,00    0,00     0,00     0,00     0,40     1,75    31,66 100,00
sde           19884,87    155,35     0,00   0,00    1,17       8,00  19834,10    154,95     0,20    0,00    0,43      8,00     0,00     0,00     0,00    0,00     0,00     0,00     0,40     1,67    31,66 100,00
sde           19965,67    155,98     0,00   0,00    1,16       8,00  19978,03    156,08     0,20    0,00    0,42      8,00     0,00     0,00     0,00    0,00     0,00     0,00     0,40     1,67    31,66 100,00
sde           19872,83    155,25     0,00   0,00    1,17       8,00  19867,37    155,21     0,20    0,00    0,43      8,00     0,00     0,00     0,00    0,00     0,00     0,00     0,40     1,83    31,66 100,00
sde           19896,07    155,44     0,00   0,00    1,16       8,00  19811,03    154,77     0,20    0,00    0,43      8,00     0,00     0,00     0,00    0,00     0,00     0,00     0,40     1,67    31,63 100,00
...

kus

  • arvulised väärtused väljendavad linuxi kernelist füüsilise plokkseadme suunal toimuvat, nt wareq-sz (write average request size) väljendab, et toimub 8 kBait suuruse plokiga kirjutamine
  • wareq-sz ja rareq-sz (write ja read average request size) - kasutatava ploki suurus
  • w/s ja r/s - operatsioonide arv sekundis (tuntud kui iops)
  • wrqm/s ja rrqm/s - write ja read request merges sekundis - antud juhul seda ei toimu praktiliselt kuna fio töötab režiimil 'randrw'; aga teatud tingimuste puhul linux kernel käigult agregeerib kokku sisse tulevaid kirjutamisi suuremateks komplektideks, ja saadab need korraga füüsilisele plokkseadmele
  • w_await ja r_await - kirjutamise ja lugemisega seotud viivutus - üldiselt loetakse normaalseks alla 4 ms
  • wMB/s ja rMB/s - mahu kirjutamise ja lugemise kiirus
  • %util - kui palju ajast tegeleb ketas tööga (selle asemel et ootada korraldust töötada)
  • dXXX - discard tegevused - reeglina on nad asjakohased mingit tüüpi ssd ketastega (nvme, sata-ssd, sas-ssd jms)

ning fio tulemus

root@rae-cf-04:~# fio fio.fio 
test1-subtest1-blocksize32k: (g=0): rw=randrw, bs=(R) 8192B-8192B, (W) 8192B-8192B, (T) 8192B-8192B, ioengine=libaio, iodepth=8
...
fio-3.28
Starting 4 processes
Jobs: 4 (f=4): [m(4)][100.0%][r=160MiB/s,w=159MiB/s][r=20.5k,w=20.3k IOPS][eta 00m:00s]
test1-subtest1-blocksize32k: (groupid=0, jobs=4): err= 0: pid=3527861: Sun Feb  2 16:56:49 2025
  read: IOPS=20.0k, BW=156MiB/s (164MB/s)(27.4GiB/180003msec)
    slat (usec): min=2, max=1451, avg= 4.31, stdev= 1.47
    clat (usec): min=29, max=10491, avg=1164.30, stdev=586.50
     lat (usec): min=133, max=10495, avg=1168.66, stdev=586.53
    clat percentiles (usec):
     |  1.00th=[  506],  5.00th=[  603], 10.00th=[  668], 20.00th=[  758],
     | 30.00th=[  848], 40.00th=[  930], 50.00th=[ 1012], 60.00th=[ 1123],
     | 70.00th=[ 1237], 80.00th=[ 1434], 90.00th=[ 1811], 95.00th=[ 2245],
     | 99.00th=[ 3589], 99.50th=[ 4113], 99.90th=[ 5276], 99.95th=[ 5735],
     | 99.99th=[ 6915]
   bw (  KiB/s): min=145008, max=175856, per=100.00%, avg=159767.22, stdev=1316.03, samples=1440
   iops        : min=18126, max=21982, avg=19970.67, stdev=164.52, samples=1440
  write: IOPS=19.9k, BW=156MiB/s (163MB/s)(27.4GiB/180003msec); 0 zone resets
    slat (usec): min=2, max=816, avg= 4.58, stdev= 1.31
    clat (usec): min=22, max=9634, avg=428.15, stdev=361.20
     lat (usec): min=34, max=9638, avg=432.77, stdev=361.22
    clat percentiles (usec):
     |  1.00th=[   68],  5.00th=[  103], 10.00th=[  125], 20.00th=[  161],
     | 30.00th=[  204], 40.00th=[  253], 50.00th=[  314], 60.00th=[  396],
     | 70.00th=[  482], 80.00th=[  619], 90.00th=[  873], 95.00th=[ 1205],
     | 99.00th=[ 1778], 99.50th=[ 1991], 99.90th=[ 2409], 99.95th=[ 2671],
     | 99.99th=[ 3556]
   bw (  KiB/s): min=144264, max=178096, per=100.00%, avg=159634.44, stdev=1459.21, samples=1440
   iops        : min=18033, max=22262, avg=19954.07, stdev=182.41, samples=1440
  lat (usec)   : 50=0.13%, 100=2.22%, 250=17.18%, 500=16.75%, 750=16.37%
  lat (usec)   : 1000=17.86%
  lat (msec)   : 2=25.57%, 4=3.62%, 10=0.30%, 20=0.01%
  cpu          : usr=2.27%, sys=5.49%, ctx=7059446, majf=0, minf=233
  IO depths    : 1=0.0%, 2=0.0%, 4=0.0%, 8=100.0%, 16=0.0%, 32=0.0%, >=64=0.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.1%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     issued rwts: total=3593853,3590846,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=8

Run status group 0 (all jobs):
   READ: bw=156MiB/s (164MB/s), 156MiB/s-156MiB/s (164MB/s-164MB/s), io=27.4GiB (29.4GB), run=180003-180003msec
  WRITE: bw=156MiB/s (163MB/s), 156MiB/s-156MiB/s (163MB/s-163MB/s), io=27.4GiB (29.4GB), run=180003-180003msec

Disk stats (read/write):
  sde: ios=3697680/3695136, merge=0/36, ticks=4294611/1561045, in_queue=5855777, util=99.97%

kus

  • slat - start latency
  • clat - completion latency
  • iops - 20.0k ja 19.9 k
  • TODO

Kui fio seadistuses muuta randrw -> rw, siis hakkab toimuma tohutult mergemisi nii kirjutamise kui lugemise osas

root@rae-cf-04:~# iostat -m -x 30 /dev/sde | grep ^sde
Device            r/s     rMB/s   rrqm/s  %rrqm r_await rareq-sz     w/s     wMB/s   wrqm/s  %wrqm w_await wareq-sz     d/s     dMB/s   drqm/s  %drqm d_await   dareq-sz     f/s f_await  aqu-sz  %util
..
sde           2965,03    168,40 18590,93  86,24   10,15    58,16 2001,70    168,44 19557,10  90,72    8,47    86,17    0,00      0,00     0,00   0,00    0,00     0,00    0,40    7,58   47,05 100,00
sde           3571,37    203,45 22468,93  86,29    8,20    58,33 2413,53    203,86 23682,37  90,75    7,27    86,49    0,00      0,00     0,00   0,00    0,00     0,00    0,40    6,92   46,83 100,00
sde           3818,73    217,37 24002,17  86,27    7,55    58,29 2577,87    217,57 25273,80  90,74    6,97    86,43    0,00      0,00     0,00   0,00    0,00     0,00    0,40    6,25   46,82 100,00
sde           3860,57    220,35 24344,97  86,31    7,48    58,45 2612,20    220,45 25606,13  90,74    6,85    86,42    0,00      0,00     0,00   0,00    0,00     0,00    0,40    5,83   46,78 100,00
sde           3911,73    223,58 24707,93  86,33    7,38    58,53 2644,50    223,57 25971,50  90,76    6,76    86,57    0,00      0,00     0,00   0,00    0,00     0,00    0,40    5,58   46,72 100,00
sde           3600,83    205,72 22724,93  86,32    7,45    58,50 2438,03    205,54 23867,20  90,73    6,86    86,33    0,00      0,00     0,00   0,00    0,00     0,00    0,47    4,29   43,54  93,08
...

kus

  • tundub, et eelmises katses kasutatud 'random readwrite' st juhuslikule asukohale kirjutamine-lugemine oli nii ebamugav kerneli jaoks, et seejuures ei olnud midagi mergeda
  • tundub, et käesolevas katses kasutatud non-random ehk järjestikuline readwrite oli nii mugav kerneli jaoks, et seejuures sai rikkalikult mergeda

Väited

  • andmesalvestuse käitumine on dünaamiline - nt suurendades fio testis fio protsessi 8k väärtust nt 8M, tulemusena on iostat väljundis wareq-sz väärtus 1024 ümbruses

Mõõtmine - üksik sata-ssd ketas - randrw, 8M

fio seadistus

  • TODO

iostat väljund fio töötamise ajal

root@rae-cf-04:~# iostat -m -x 30 /dev/sde | grep ^sde
Device            r/s     rMB/s   rrqm/s  %rrqm r_await rareq-sz     w/s     wMB/s   wrqm/s  %wrqm w_await wareq-sz     d/s     dMB/s   drqm/s  %drqm d_await dareq-sz     f/s f_await  aqu-sz  %util
..
sde            203,20    205,43     3,77   1,82  100,10  1035,24  205,77    211,15     3,33   1,59  151,88  1050,81    0,00      0,00     0,00   0,00    0,00     0,00    0,33   62,50   51,61  85,63
sde            252,17    254,69     4,03   1,57  100,60  1034,25  231,30    232,32     4,43   1,88  151,72  1028,50    0,00      0,00     0,00   0,00    0,00     0,00    0,37   64,55   60,48 100,00
sde            230,50    230,90     3,93   1,68   97,58  1025,79  252,90    256,21     4,53   1,76  149,87  1037,40    0,00      0,00     0,00   0,00    0,00     0,00    0,37   63,91   60,42 100,00
sde            237,63    239,07     3,87   1,60   98,67  1030,21  241,67    246,98     4,83   1,96  152,93  1046,50    0,00      0,00     0,00   0,00    0,00     0,00    0,40   63,42   60,43 100,00
sde            233,59    236,90     3,90   1,64   98,10  1038,50  249,12    250,47     4,57   1,80  150,55  1029,57    0,00      0,00     0,00   0,00    0,00     0,00    0,40   61,58   60,44  99,97
sde            240,63    242,23     4,13   1,69   98,53  1030,81  240,53    243,40     4,57   1,86  152,83  1036,21    0,00      0,00     0,00   0,00    0,00     0,00    0,40   66,00   60,50 100,00
sde             73,03     73,89     1,23   1,66   99,25  1036,03   87,10     88,47     1,73   1,95  147,21  1040,09    0,00      0,00     0,00   0,00    0,00     0,00    0,33   39,20   20,08  33,40
...

kus

  • wareq-sz ja rareq-sz väärtused on nüüd nii 1000 kBait
  • wrqm/s ja rrqm/s väärtused on nüüd tekkinud natuke

fio käivitamise tulemus

root@rae-cf-04:~# fio fio.fio
test1-subtest1-blocksize32k: (g=0): rw=randrw, bs=(R) 8192KiB-8192KiB, (W) 8192KiB-8192KiB, (T) 8192KiB-8192KiB, ioengine=libaio, iodepth=32
...
fio-3.28
Starting 12 processes
Jobs: 12 (f=12): [m(7),F(1),m(1),F(1),m(1),F(1)][17.6%][r=568MiB/s,w=680MiB/s][r=71,w=85 IOPS][eta 14m:33s]
test1-subtest1-blocksize32k: (groupid=0, jobs=12): err= 0: pid=3280862: Sun Feb  2 00:19:17 2025
  read: IOPS=30, BW=246MiB/s (258MB/s)(43.5GiB/180515msec)
    slat (usec): min=149, max=828017, avg=194726.62, stdev=109145.26
    clat (msec): min=23, max=8072, avg=6000.98, stdev=868.08
     lat (msec): min=147, max=8243, avg=6195.44, stdev=875.35
    clat percentiles (msec):
     |  1.00th=[ 1804],  5.00th=[ 4933], 10.00th=[ 5269], 20.00th=[ 5537],
     | 30.00th=[ 5738], 40.00th=[ 5940], 50.00th=[ 6074], 60.00th=[ 6208],
     | 70.00th=[ 6342], 80.00th=[ 6611], 90.00th=[ 6879], 95.00th=[ 7080],
     | 99.00th=[ 7483], 99.50th=[ 7684], 99.90th=[ 7886], 99.95th=[ 8020],
     | 99.99th=[ 8087]
   bw (  KiB/s): min=196212, max=917799, per=100.00%, avg=316902.08, stdev=12335.72, samples=3338
   iops        : min=   12, max=  112, avg=37.72, stdev= 1.54, samples=3338
  write: IOPS=30, BW=254MiB/s (266MB/s)(44.8GiB/180515msec); 0 zone resets
    slat (usec): min=314, max=939817, avg=199242.58, stdev=108881.61
    clat (msec): min=84, max=8065, avg=6012.11, stdev=881.04
     lat (msec): min=162, max=8306, avg=6211.12, stdev=889.60
    clat percentiles (msec):
     |  1.00th=[ 1469],  5.00th=[ 4933], 10.00th=[ 5336], 20.00th=[ 5604],
     | 30.00th=[ 5805], 40.00th=[ 5940], 50.00th=[ 6074], 60.00th=[ 6208],
     | 70.00th=[ 6409], 80.00th=[ 6611], 90.00th=[ 6879], 95.00th=[ 7080],
     | 99.00th=[ 7483], 99.50th=[ 7684], 99.90th=[ 7953], 99.95th=[ 7953],
     | 99.99th=[ 8087]
   bw (  KiB/s): min=196212, max=884670, per=100.00%, avg=319582.91, stdev=12320.50, samples=3389
   iops        : min=   12, max=  107, avg=37.97, stdev= 1.53, samples=3389
  lat (msec)   : 50=0.01%, 100=0.05%, 250=0.14%, 500=0.20%, 750=0.14%
  lat (msec)   : 1000=0.13%, 2000=0.57%, >=2000=101.72%
  cpu          : usr=0.16%, sys=0.28%, ctx=29496, majf=0, minf=699
  IO depths    : 1=0.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.4%, 32=99.6%, >=64=0.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=99.9%, 8=0.0%, 16=0.0%, 32=0.1%, 64=0.0%, >=64=0.0%
     issued rwts: total=5416,5554,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=32

Run status group 0 (all jobs):
   READ: bw=246MiB/s (258MB/s), 246MiB/s-246MiB/s (258MB/s-258MB/s), io=43.5GiB (46.7GB), run=180515-180515msec
  WRITE: bw=254MiB/s (266MB/s), 254MiB/s-254MiB/s (266MB/s-266MB/s), io=44.8GiB (48.1GB), run=180515-180515msec

Disk stats (read/write):
  sde: ios=44117/45201, merge=746/839, ticks=4365191/6841827, in_queue=11211681, util=100.00%

Selgituseks warqm-sz ja rareq-sz suurus ca 1000 kBait osas, et see on seotud väärtusega

root@rae-cf-04:~# cat /sys/block/sde/queue/max_sectors_kb 
1280

kui nt seda suurendada natuke, siis muutub ka iostat väljund ('echo 2048 > /sys/block/sde/queue/max_sectors_kb'), jõudluse seisukohast ei ole see tõenäoliselt hea mõte nii üksikuid parameetreid torkima hakata.

Mõõtmine - üksik sata-ssd ketas - suur hulk pisikesi faile

Naturaalsem viis kui fio esile kutsuda rikkalikult plokkseadmele suunduvate päringute mergemist, oleks tekitada kuhugi muu plokkseadme failisüsteemi kataloogi ohtralt pisikesi faile ja neid siis kopeerida kõnealusele plokkseadmele tehtud failisüsteemi, nt

root@rae-cf-04:~# iostat -m -x 5 /dev/sde | grep ^sde
Device            r/s     rMB/s   rrqm/s  %rrqm r_await rareq-sz     w/s     wMB/s   wrqm/s  %wrqm w_await wareq-sz     d/s     dMB/s   drqm/s  %drqm d_await dareq-sz     f/s f_await  aqu-sz  %util
..
sde              0,00      0,00     0,00   0,00    0,00     0,00   76,60     48,32 12293,60  99,38    9,08   645,96    0,00      0,00     0,00   0,00    0,00     0,00    0,40    0,50    0,70  10,08
sde              0,00      0,00     0,00   0,00    0,00     0,00  357,60    233,11 59319,00  99,40    9,19   667,52    0,00      0,00     0,00   0,00    0,00     0,00    0,40    0,00    3,29  47,92
sde              0,00      0,00     0,00   0,00    0,00     0,00   51,00     31,42  7992,00  99,37   12,20   630,82    0,00      0,00     0,00   0,00    0,00     0,00    0,40    0,00    0,62   6,40
sde              0,00      0,00     0,00   0,00    0,00     0,00   29,80     19,34  4922,00  99,40    9,27   664,67    0,00      0,00     0,00   0,00    0,00     0,00    0,40    0,00    0,28   4,32
sde              0,00      0,00     0,00   0,00    0,00     0,00  242,20    156,99 40314,40  99,40    8,61   663,74    0,00      0,00     0,00   0,00    0,00     0,00    0,40    0,00    2,09  32,16
sde              0,00      0,00     0,00   0,00    0,00     0,00  397,00    257,03 65036,00  99,39    9,97   662,98    0,00      0,00     0,00   0,00    0,00     0,00    0,60    0,00    3,96  52,64
sde              0,00      0,00     0,00   0,00    0,00     0,00   16,60     10,64  2708,00  99,39   10,16   656,53    0,00      0,00     0,00   0,00    0,00     0,00    0,40    0,00    0,17   2,24
...
  • ilma et süsteem peaks kiiruses wMB/s kaotama ega isegi rakendama seejuures iops ressurssi (w/s) piirab pisikese kernelisse sisse tulevate pöördumiste mergemisest (mitukümmend tuhat tükki sekundis, st wrqm/s), tulemusena on wareq-sz suurus olemas
  • %wrqm - mergemiste protsent mis iganes kogu tegevuste hulgas on märkimisväärne (99+ %)
  • tundub, et wareq-sz kajastab selle kettale mineva reaalse pöördumise keskmist suurust, mis on koostatud mergemise tulemusel

Üks järgmine variatsioon oleks seejuures lülitada välja mergemine

root@rae-cf-04:~# echo 2 > /sys/block/sde/queue/nomerges

ning tulemus paistab nii

root@rae-cf-04:~# iostat -m -x 5 /dev/sde | grep ^sde
Device            r/s     rMB/s   rrqm/s  %rrqm r_await rareq-sz     w/s     wMB/s   wrqm/s  %wrqm w_await wareq-sz     d/s     dMB/s   drqm/s  %drqm d_await dareq-sz     f/s f_await  aqu-sz  %util
..
sde              0,00      0,00     0,00   0,00    0,00     0,00 28150,00    109,96     0,00   0,00    0,14     4,00    0,00      0,00     0,00   0,00    0,00     0,00    0,40    0,00    4,05  52,16
sde              0,00      0,00     0,00   0,00    0,00     0,00 44174,60    172,56     0,00   0,00    0,19     4,00    0,00      0,00     0,00   0,00    0,00     0,00    0,40    0,00    8,53  99,92
sde              0,00      0,00     0,00   0,00    0,00     0,00  3849,20     15,04     0,00   0,00    0,17     4,00    0,00      0,00     0,00   0,00    0,00     0,00    0,60    0,00    0,65   6,16
sde              0,00      0,00     0,00   0,00    0,00     0,00  2465,00      9,63     0,00   0,00    0,16     4,00    0,00      0,00     0,00   0,00    0,00     0,00    0,40    0,00    0,40   3,76
sde              0,00      0,00     0,00   0,00    0,00     0,00 22901,40     89,46     0,00   0,00    0,15     4,00    0,00      0,00     0,00   0,00    0,00     0,00    0,40    0,50    3,37  46,96
sde              0,00      0,00     0,00   0,00    0,00     0,00 42900,20    167,58     0,00   0,00    0,19     4,00    0,00      0,00     0,00   0,00    0,00     0,00    0,40    0,00    8,18  95,28
sde              0,00      0,00     0,00   0,00    0,00     0,00 45540,60    177,89     0,00   0,00    0,20     4,00    0,00      0,00     0,00   0,00    0,00     0,00    0,40    0,00    8,99 100,00
...

kus

  • wrqm/s on tõesti konstantselt null
  • wareq-sz väärtus on nüüd minimaalne 4 kBait
  • kopeerimise kiirus wMB/s mitusada ei ole tingimata tagasihoidlik, kuna tegu on sata-ssd kettaga, siis süsteemil on rikkalikult iops ressurssi ja nüüd tuleb selle kasutamine esile (w/s väärtus mitukümmend tuhat)

ning katse lõpus jällegi mergemine sisse lülitada

root@rae-cf-04:~# echo 0 > /sys/block/sde/queue/nomerges

Toodud katsed illustreerivad hästi kuidas ühe jõudlust tõstva omaduse välja lülitamine toob esile teise seda kompenseeriva omaduse.

Mõõtmine - mdadm

TODO

Mõõtmine - zfs

TODO

Mõõtmine - ceph rbd

TODO

Väited

  • tundub, et kui rbd kasutuskohas on mergemine isegi välja lülitatud, siis ceph osd osakonnas mergemine jms efektiivsus siiski toimub

Mõõtmine - iscsi Ubuntu LIO target

TODO

Mõõtmine - iscsi eternus hdd target

TODO

Mõõtmine - iscsi eternus sdd target

TODO

TRIM

TODO

Kasulikud lisamaterjalid

ioegine

Üldised väited

  • Linux operatsioonisüsteem (kernel ja nö kerneliga kokku puutuvad teegid) sisaldab erinevad loogilisi võimalusi plokkseadmega suhtlemiseks - neid võimalusi väljendab mitmesuguste nö lugemiste-kirjutamist syscall'ide komplektide olemasolu (nt libaio sisaldab muu hulgas syscall'i io_submit)

Väited ioengine kohta

  • iseensest määrab ioengine millist komplekti kirjutamise-lugemise syscall'isid fio kasutab
  • ioengine valikuga saab mõõtuka täpsusega matkida rakendustarkvara (nt mariadb andmebaasi vanemad versioonid kasutavad vaikimisi libaio teeke, uuemad kasutavad liburing teeke)

ioengine valikute illustratsiooniks sobib proovida nt nii

# cat fio-test.fio 
[jobname-psync]
		stonewall=1
		rw=randread
		size=9000
		bs=4090
		ioengine=psync

[jobname-libaio]
		stonewall=1
		rw=randread
		size=9000
		bs=4090
		ioengine=libaio

[jobname-sync]
		stonewall=1
		rw=randread
		size=9000
		bs=4090
		ioengine=sync

kus

  • stonewall direktiiv käseb käivitada töid järjestikuliselt

Tulemusena saab

# strace -f fio fio-test.fio 2>&1 | egrep "=4090| = 4090"
[pid 656628] pread64(3, "5\340(\3148\240\231\26\6\234j\251\362\315\351\n\200S*\7\t\345\r\25pJ%\367\v9\235\30"..., 4090, 0) = 4090
[pid 656628] pread64(3, "\250q\tH\323\255_\3055.-\260\265QZ\23\306%\353\36 r\303\23\270d\372p\316^R\30"..., 4090, 4090) = 4090

[pid 656631] io_submit(0x7ff9a897c000, 1, [{aio_data=0, aio_lio_opcode=IOCB_CMD_PREAD, aio_fildes=3, aio_buf=0x55eeaf155480, aio_nbytes=4090, aio_offset=0}]) = 1
[pid 656631] io_getevents(0x7ff9a897c000, 1, 1, [{data=0, obj=0x55eeaf16c0b8, res=4090, res2=0}], NULL) = 1
[pid 656631] io_submit(0x7ff9a897c000, 1, [{aio_data=0, aio_lio_opcode=IOCB_CMD_PREAD, aio_fildes=3, aio_buf=0x55eeaf155480, aio_nbytes=4090, aio_offset=4090}]) = 1
[pid 656631] io_getevents(0x7ff9a897c000, 1, 1, [{data=0, obj=0x55eeaf16c0b8, res=4090, res2=0}], NULL) = 1

[pid 656634] read(3, "\263\252\253X\302\2103dV\365\273u\302DJ\2\252~\fT\272\r\302\25\325\217,\v\261\27\1\20"..., 4090) = 4090
[pid 656634] read(3, "l\33\fh\354\341\3718m\203K\1777\10\35\vm\3602.a\341\2\36\r\336\217\255\22\305\312\16"..., 4090) = 4090

kus

ioengine=io_uring käitumine paistab selliselt

[jobname-psync]
		stonewall=1
		rw=randread
		size=9000
		bs=4090
		ioengine=io_uring

ning protsessi pealt kuulates, io_uring_enter() on ilmselt iseloomulikud syscall'id

..
[pid 897435] getrusage(RUSAGE_THREAD, {ru_utime={tv_sec=0, tv_usec=872}, ru_stime={tv_sec=0, tv_usec=0}, ...}) = 0
[pid 897435] openat(AT_FDCWD, "jobname-psync.0.0", O_RDONLY) = 4
[pid 897435] fadvise64(4, 0, 9000, POSIX_FADV_DONTNEED) = 0
[pid 897435] fadvise64(4, 0, 9000, POSIX_FADV_RANDOM) = 0
[pid 897435] io_uring_enter(3, 1, 0, IORING_ENTER_GETEVENTS, NULL, 0) = 1
[pid 897435] io_uring_enter(3, 0, 1, IORING_ENTER_GETEVENTS, NULL, 0) = 0
[pid 897435] io_uring_enter(3, 1, 0, IORING_ENTER_GETEVENTS, NULL, 0) = 1
[pid 897435] io_uring_enter(3, 0, 1, IORING_ENTER_GETEVENTS, NULL, 0) = 0
[pid 897435] close(4)                   = 0
[pid 897435] getrusage(RUSAGE_THREAD, {ru_utime={tv_sec=0, tv_usec=1140}, ru_stime={tv_sec=0, tv_usec=0}, ...}) = 0
[pid 897435] munmap(0x7f5362be3000, 388) = 0
...

PostgreSQL

Naturaalne kasutamine paistab selliselt. Ühes aknas öelda kasutamiseks

postgres=# insert into inimene (isikukood, eesnimi, perekonnanimi, synniaeg) values ('46705079999', 'Marta', 'Maara','1967-05-09');
INSERT 0 1

ja teises aknas öelda jälgimiseks, protsess pid=419153 tegeleb konkreetse psql ühendusega

root@trainer-01-rws:~# ps U postgres
    PID TTY      STAT   TIME COMMAND
 418770 ?        Ss     0:00 /usr/lib/postgresql/15/bin/postgres -D /var/lib/postgresql/15/main -c config_file=/etc/postgresql/15/main/postgresql.conf
 418771 ?        Ss     0:00 postgres: 15/main: checkpointer 
 418772 ?        Ss     0:00 postgres: 15/main: background writer 
 418774 ?        Ss     0:00 postgres: 15/main: walwriter 
 418775 ?        Ss     0:00 postgres: 15/main: autovacuum launcher 
 418776 ?        Ss     0:00 postgres: 15/main: logical replication launcher 
 418975 pts/22   S      0:00 -bash
 419152 pts/22   S+     0:00 /usr/lib/postgresql/15/bin/psql
 419153 ?        Ss     0:00 postgres: 15/main: postgres postgres [local] idle

root@trainer-01-rws:~# strace -p 419059 -f
strace: Process 419059 attached
epoll_wait(4, 

[{events=EPOLLIN, data={u32=1545131976, u64=111412996790216}}], 1, -1) = 1
recvfrom(7, "Q\0\0\0}insert into inimene (isikuk"..., 8192, 0, NULL, NULL) = 126
pwrite64(15, "\20\321\4\0\1\0\0\0\0@\242\2\0\0\0\0\0\0\0\0\0\0\0\0g\0\0\0\374\2\0\0"..., 8192, 10633216) = 8192
fdatasync(15)                           = 0
sendto(7, "C\0\0\0\17INSERT 0 1\0Z\0\0\0\5I", 22, 0, NULL, 0) = 22
recvfrom(7, 0x65545aab40c0, 8192, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)
epoll_wait(4, ^Cstrace: Process 419059 detached
 <detached ...>

kus

  • kasutatakse pwrite64 syscalli mis vastab psync io kasutamise komplektile ioengine seisukohalt
  • kasutatakse 8192 bait suurust plokki
  • recvfrom on võrguga tegelemise syscall
  • fsync peaks olema midagi mis nö kinnistab andmed läbi mingite puhvrite plokkseadmele ära (äkki läbi failisüsteemi kihi cache'i)
  • iodepth sügavuseks on vist 1 mis kujuneb

Asjakohane fio.fio fragment on

ioengine=psync
..
bs=8k
iodepth=1
...

MariaDB

Naturaalne kasutamine paistab selliselt. Ühes aknas öelda kasutamiseks

MariaDB [tere]> INSERT INTO inimesed VALUES ('Laa', '12', 'Kuressaare');

ja teises aknas öelda jälgimiseks, protsess pid=419153 tegeleb konkreetse psql ühendusega

..
[pid 421830] recvfrom(43, "8\0\0\0", 4, MSG_DONTWAIT, NULL, NULL) = 4
[pid 421830] recvfrom(43, "\3INSERT INTO inimesed VALUES ('L"..., 56, MSG_DONTWAIT, NULL, NULL) = 56
[pid 421830] pwrite64(14, "\326i\322\304\0\200\0\3775\0\0\200\331\2524\0\0=3\23\0\200\2559\0\200s\252\262\0\0\1"..., 512, 51712) = 512
[pid 421830] fdatasync(14)              = 0
[pid 421830] sendto(43, "\7\0\0\1\0\1\0\2\0\0\0", 11, MSG_DONTWAIT, NULL, 0) = 11
[pid 421830] recvfrom(43, 0x788bd0129a28, 4, MSG_DONTWAIT, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)
[pid 421830] poll([{fd=43, events=POLLIN|POLLPRI}], 1, 28800000 <unfinished ...>
...

Kasulikud lisamaterjalid

liburing

TODO

Kasulikud lisamaterjalid

Kasulikud lisamaterjalid