TĂ€na tahame rÀÀkida mĂ”ningatest viimastest Sherlocki sĂŒsteemi vĂ€rskendustest [see on Stanfordi ĂŒlikooli suure jĂ”udlusega klaster â tlk.], mis kiirendavad oluliselt failide loetlemist suure arvuga kataloogides.
Erinevalt tavalistest artiklitest, on see pigem siseaudit, kuidas kaupluse regulaarne töö toimub, et hoida see meie kasutajatele parimas vormis. Loodame tulevikus avaldada rohkem selliseid artikleid.
Paljude failide loetlemine vÔtab aega.
KĂ”ik algas kasutajalt saadud kĂŒsimusest tehnilisest toest. Ta teatas probleemist, et tegevus ls vĂ”tab mitu minutit kataloogis, kus on ĂŒle 15 000 kirje $SCRATCH [ajutiste failide kataloog â tlk.].
Tuhanded failid ĂŒhes kataloogis loovad tavaliselt failisĂŒsteemile probleeme ja seda ei soovitata. Kasutaja teadis seda ja tunnustas, et see pole hea, kuid mĂ€rkis, et tema sĂŒlearvuti loetleb neid 1000 korda kiiremini kui Sherlock. Muidugi, see lĂ€ks meile korda. SeetĂ”ttu uurisime sĂŒgavamalt.
Sest ls nÀeb hea vÀlja.
Uurisime, mida tegelikult teeb ls katalooge loetledes ja miks see protsess vÔtab nii kaua aega. Enamikus kaasaegsetes distributsioonides ls kasutatakse vaikimisi ls --color=auto, sest kÔik armastavad vÀrve.
Aga ilusate vĂ€rvide hind on see, et iga faili ls peab saama teavet faili tĂŒĂŒbi, selle Ă”iguste, lipu, laiendatud atribuutide jne kohta, et valida vastav vĂ€rv.
Ăks lihtne lahendus probleemile on ĂŒldse vĂ€rvi lĂŒlitamine ls-is, kuid kujutage ette kasutajate Ă€rritust. Me ei tohi mingil juhul vĂ€rvilist vĂ€ljundit Ă€ra vĂ”tta, me ei ole koletised.
SeetĂ”ttu uurisime sĂŒgavamalt. ls vĂ€rvib kirjeid lĂ€bi keskkonnamuutuja LS_COLORS, mille mÀÀrab dircolors(1) konfiguratsioonifaili pĂ”hjal. dir_colors(5). Jah,kĂ€ivitatav fail loeb konfiguratsioonifaili, et luua keskkonnamuutuja, mida seejĂ€rel kasutab ls door , hoolimata kĂ”igest). Uurime lĂ€hemalt.
Kuna mÀÀrata, milline vĂ€rvimisreĆŸiim pĂ”hjustab aeglustumist, lĂ”ime katsekeskkonna:
$ mkdir $SCRATCH/dont $ touch $SCRATCH/dont/{1..10000} # Ă€ra proovi seda kodus! $ time ls --color=always $SCRATCH/dont | wc -l 10000reaal 0m12.758s kasutaja 0m0.104s sĂŒsteemi 0m0.699s
$ mkdir $SCRATCH/dont
$ touch $SCRATCH/dont/{1..10000} # don't try this at home!
$ time ls --color=always $SCRATCH/dont | wc -l
10000
real 0m12.758s
user 0m0.104s
sys 0m0.699s12,7 sekundit 10 000 faili jaoks, mitte just hÀsti.
ĂkskĂ”ik, kas on vaja lippu
--color=always: kuigi see pöördubls --color=auto, kuidlstuvastatakse, kui see ei ole terminaliga ĂŒhendatud (nĂ€iteks kanali kaudu vĂ”i vĂ€ljundi suunamisega) ja keelab vĂ€rvimise, kui on seatud vÀÀrtusauto. Nutikas poiss.
Mis siis tegelikult nii palju aega vÔtab? Me vaatasime strace:
$ strace -c ls --color=always $SCRATCH/dont | wc -l
10000
% aeg sekundid kasut. / kĂ”ne kĂ”ned vead sĂŒsteemi kĂ”ne
------ ----------- ----------- --------- --------- ----------------
44.21 0.186617 19 10000 lstat
42.60 0.179807 18 10000 10000 getxattr
12.19 0.051438 5 10000 capget
0.71 0.003002 38 80 getdents
0.07 0.000305 10 30 mmap
0.05 0.000217 12 18 mprotect
0.03 0.000135 14 10 read
0.03 0.000123 11 11 open
0.02 0.000082 6 14 close
[...] Vau: 10 000 kÔnet lstat(), 10 000 kÔnet getxattr() (mis kÔik ebaÔnnestuvad, kuna meie keskkonnas ei ole atribuute, mida ls otsib), 10 000 kÔnet capget().
Seda saab kindlasti optimeerida.
Atribuut capabilities? Ei
JĂ€rgides nĂ”uandeid , ĂŒritasime vĂ€lja lĂŒlitada atribuudi kontrolli :
$ eval $(dircolors -b | sed s/ca=[^:]*:/ca=:)
$ time strace -c ls --color=always $SCRATCH/dont | wc -l
10000
% aeg sekundid kasut. / kĂ”ne kĂ”ned vead sĂŒsteemi kĂ”ne
------ ----------- ----------- --------- --------- ----------------
98.95 0.423443 42 10000 lstat
0.78 0.003353 42 80 getdents
0.04 0.000188 10 18 mprotect
0.04 0.000181 6 30 mmap
0.02 0.000085 9 10 read
0.02 0.000084 28 3 mremap
0.02 0.000077 7 11 open
0.02 0.000066 5 14 close
[...]
------ ----------- ----------- --------- --------- ----------------
100.00 0.427920 10221 6 kokku
reaalne 0m8.160s
kasutaja 0m0.115s
sĂŒsteem 0m0.961s Vau, kiirus 8 sekundi peale! Oleme vabanenud kĂ”igist nendest kallistest kĂ”nedest getxattr(), ja kĂ”ned capget() ka kadusid, suurepĂ€rane.
Kuid need tĂŒĂŒtud kĂ”ned on siiski alles lstat(), kuigi...
Kui palju vÀrve on vaja?
SeetÔttu vaatasime lÀhemalt LS_COLORS.
Esialgu lĂŒlitasime selle muutujast vĂ€lja:
$ echo $LS_COLORS rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00; $ unset LS_COLORS $ echo $LS_COLORS $ time ls --color=always $SCRATCH/dont | wc -l 10000 real 0m13.037s user 0m0.077s sys 0m1.092s
Mis!?! JĂ€lle 13 sekundit?
Selgub, et kui keskkonnamuutuja LS_COLORS ei ole mÀÀratud vĂ”i kui selle ainus element puudub =color:, siis kasutab see vaikimisi sisseehitatud andmebaasi ja kasutab ikkagi vĂ€rve. Seega, kui soovite teatud failitĂŒĂŒbi jaoks vĂ€rvimise vĂ€lja lĂŒlitada, peate selle ĂŒmber mÀÀrama =: vĂ”i 00 failis DIR_COLORS.
PĂ€rast paljusid katsetusi kitsendasime otsingut sellele:
EXEC 00
SETUID 00
SETGID 00
CAPABILITY 00mis kirjutatakse kui
LS_COLORS='ex=00:su=00:sg=00:ca=00:' See tÀhendab: Àra vÀrvi faile mitte omaduse , vaid bittide , ega .
Kiirendame ls
Ja kui neid kontrollimisi ei tehta, siis kutsed lstat() kaovad ja nĂŒĂŒd on asi hoopis teine:
$ export LS_COLORS='ex=00:su=00:sg=00:ca=00:'
$ time strace -c ls --color=always $SCRATCH/dont | wc -l
10000
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
63.02 0.002865 36 80 getdents
8.10 0.000368 12 30 mmap
5.72 0.000260 14 18 mprotect
3.72 0.000169 15 11 open
2.79 0.000127 13 10 read
[...]
------ ----------- ----------- --------- --------- ----------------
100.00 0.004546 221 6 total
real 0m0.337s
user 0m0.032s
sys 0m0.029s0,3 sekundit 10 000 faili nimekirjas, rekord.
Seadistame Sherlocki
Vaikeseadete juures 13 sekundilt kuni 0,3 sekundini vÀikese hÀÀlestusega LS_COLORS tÀhendab 40-kordset kiirendust puudumise tÔttu setuid / setgid ja vÀrviliste tÀidetud failide. Pole nii suur kadu.
Loomulikult, nĂŒĂŒd on see seadistatud Sherlockis iga kasutaja jaoks.
Aga kui soovite vÀrvikoodi taastada, vÔite lihtsalt naasta vaike seadete juurde:
$ unset LS_COLORS Kuid siis, kui kataloogides on palju faile, valmistage kindlasti kohvi, kuni see töötab. ls.
Allikas: habr.com
