Kui keskkonnamuutuja kiirendab protsessi 40 korda

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 (ja kui sa ei tea failidest door (do), siis dir_colors , hoolimata kĂ”igest). reaktsiooniUurime 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.699s

12,7 sekundit 10 000 faili jaoks, mitte just hÀsti.

ÜkskĂ”ik, kas on vaja lippu --color=always: kuigi see pöördub ls --color=auto, kuid ls tuvastatakse, kui see ei ole terminaliga ĂŒhendatud (nĂ€iteks kanali kaudu vĂ”i vĂ€ljundi suunamisega) ja keelab vĂ€rvimise, kui on seatud vÀÀrtus auto. 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 10 aasta tagune bugi, ĂŒritasime vĂ€lja lĂŒlitada atribuudi kontrolli capabilities:

$ 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 00

mis kirjutatakse kui

LS_COLORS='ex=00:su=00:sg=00:ca=00:'

See tÀhendab: Àra vÀrvi faile mitte omaduse capabilities, vaid bittide setuid/setgid, ega tÀitmislipu poolt.

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

0,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

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster