Kui keskkonnamuutuja kiirendab protsessi 40 korda

Täna tahame rääkida mõnest Sherlocki süsteemi viimastest uuendustest [see on Stanfordi ülikooli suure jõudlusega klaster – u. trans.], mis kiirendavad oluliselt failide loetlemist suure hulga kirjetega kataloogides.

Erinevalt tavalistest artiklitest on see pigem siseringi aruanne selle kohta, kuidas me Sherlockiga regulaarselt töötame, et see meie kasutajate jaoks parimal viisil töötaks. Loodame tulevikus avaldada rohkem selliseid artikleid.

Paljude failide loetlemine võtab aega

Kõik sai alguse kasutaja tehnilise toe küsimusest. Ta teatas hukkamise probleemist ls 15 000 kirjega kataloogis kulub paar minutit $SCRATCH [ajutiste failide kataloog - u. sõidurada].

Tuhanded failid ühes kataloogis koormavad tavaliselt failisüsteemi ja pole kindlasti soovitatav. Kasutaja teadis seda ja tunnistas, et see pole hea, kuid mainis, et loend oli tema sülearvutis 1000 korda kiirem kui Sherlock. Muidugi tegi see meile haiget. Nii et vaatasime sügavamalt.

Sest see näeb kena välja

Vaatasime, mida see tegelikult teeb ls kataloogi loetlemisel ja miks see protsess nii kaua aega võtab. Enamikel kaasaegsetel distributsioonidel ls vaikimisi töötab see kui ls --color=auto, sest värvid meeldivad kõigile.

Kuid ilusatel värvidel on oma hind: iga faili eest ls peab hankima teavet failitüübi, selle õiguste, lippude, laiendatud atribuutide jms kohta, et valida sobiv värv.

Üks lihtne lahendus probleemile on keelata värv ls-is täielikult, kuid kujutage ette kasutajate pahameelt. Mitte mingil juhul ei tohi te värviväljundit ära võtta, me pole koletised.

Nii et vaatasime sügavamalt. ls värvikirjed keskkonnamuutuja kaudu LS_COLORS, mis on määratud dircolors(1) konfiguratsioonifaili põhjal dir_colors(5)... Jah, käivitatav fail loeb konfiguratsioonifaili, et luua keskkonnamuutuja, mida ls seejärel kasutab (ja kui te failidest ei tea uks (do), seejärel dir_colors töötab, Hoolimata kõigest).

Vaatame lähemalt

Et teha kindlaks, milline värviskeem põhjustab aeglustumist, lõime eksperimentaalse keskkonna:

$ 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 eriti hea.

Muide, me vajame lippu --color=always: kuigi ta pöördub poole ls --color=autoKuid ls tuvastab, kui see pole terminaliga ühendatud (nt toru kaudu või väljundi ümbersuunamisega) ja keelab värvimise, kui see on määratud auto. Tark mees.

Mis siis nii kaua aega võtab? Vaatasime koos strace:

$ strace -c ls --color=always $SCRATCH/dont | wc -l
10000
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 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 keskkonnal pole atribuute, mida ls otsib), 10 000 kõnet capget().

Kindlasti saab seda optimeerida.

Võimaluste atribuut? Ei

Nõuannet järgides viga 10 aastat tagasi, proovisime atribuutide kontrollimist keelata võimeid:

$ eval $(dircolors -b | sed s/ca=[^:]*:/ca=:/)
$ time strace -c ls --color=always $SCRATCH/dont | wc -l
10000
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 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 total

real    0m8.160s
user    0m0.115s
sys     0m0.961s

Vau, kuni 8 sekundit kiirendust! Saime kõigist nendest kallitest kõnedest lahti getxattr()ja väljakutseid capget() kadus ka ära, suurepärane.

Aga neid tüütuid kõnesid on ikka lstat(), kuigi…

Kui palju lilli vajate?

Seetõttu vaatasime lähemalt LS_COLORS.

Esmalt keelasime selle muutuja lihtsalt 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;36:
$ unset LS_COLORS
$ echo $LS_COLORS

$  time ls --color=always $SCRATCH/dont | wc -l
10000

real    0m13.037s
user    0m0.077s
sys     0m1.092s

Mida!?! Ikka 13 sekundit?

Selgub, et kui keskkonnamuutuja LS_COLORS ainult üks selle elementidest on määratlemata või puudub <type>=color:, kasutab see vaikimisi sisseehitatud andmebaasi ja kasutab endiselt värve. Nii et kui soovite teatud failitüübi jaoks värvimise keelata, peate selle alistama <type>=: või <type> 00 failis DIR_COLORS.

Pärast palju katse-eksitusi kitsendasime otsingut järgmisele:

EXEC 00
SETUID 00
SETGID 00
CAPABILITY 00

mis on kirjutatud kui

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

See tähendab: ärge värvige faile atribuudi järgi. võimeid, aga vähehaaval setuid/setgid, ka mitte täitmisvõime lipp.

Me kiirendame ls

Ja kui te ühtegi neist kontrollidest ei tee, helistage 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 failiga loendis, rekord.

Sherlocki seadistamine

Alates 13 sekundist vaikeseadetega kuni 0,3 sekundini väikeste muudatustega LS_COLORS tähendab puudumise tõttu 40-kordset kiirendust setuid / setgid ja värvilised käivitatavad failid. Pole nii suur kaotus.

Loomulikult on see nüüd Sherlockis iga kasutaja jaoks konfigureeritud.

Kuid kui soovite värvi taastada, saate lihtsalt naasta vaikeseadetele:

$ unset LS_COLORS

Kuid kataloogides, kus on palju faile, keetke kindlasti kohvi töötamise ajal ls.

Allikas: www.habr.com

Lisa kommentaar