Kun ympäristömuuttuja nopeuttaa prosessia 40 kertaa

Tänään haluamme puhua joistakin Sherlock-järjestelmän uusimmista päivityksistä [tämä on korkean suorituskyvyn klusteri Stanfordin yliopistossa - noin. trans.], jotka nopeuttavat huomattavasti tiedostojen listaamista hakemistoihin, joissa on suuri määrä merkintöjä.

Toisin kuin tavalliset artikkelit, tämä on enemmänkin sisäpiiriraportti siitä, kuinka työskentelemme säännöllisesti Sherlockin parissa, jotta se toimisi parhaimmillaan käyttäjillemme. Toivomme julkaisevamme lisää tällaisia ​​artikkeleita tulevaisuudessa.

Monien tiedostojen luettelointi vie aikaa

Kaikki alkoi teknisen tuen kysymyksestä käyttäjältä. Hän kertoi toteuttamisen ongelmasta ls kestää muutaman minuutin hakemistossa, jossa on yli 15 000 merkintää $SCRATCH [väliaikaisten tiedostojen hakemisto - noin. kaista].

Tuhannet tiedostot yhdessä hakemistossa ovat yleensä taakka tiedostojärjestelmälle, eikä sitä ehdottomasti suositella. Käyttäjä tiesi tämän ja myönsi, että se ei ollut hyvä, mutta mainitsi, että listaus oli 1000 kertaa nopeampi hänen kannettavassa tietokoneessaan kuin Sherlock. Tämä tietysti loukkasi meitä. Joten katsoimme syvemmälle.

Koska se näyttää kivalta

Katsoimme, mitä se todella tekee ls hakemiston luetteloinnissa ja miksi prosessi kestää niin kauan. Useimmissa nykyaikaisissa jakeluissa ls oletusarvoisesti se toimii nimellä ls --color=auto, koska kaikki pitävät väreistä.

Mutta kauniilla väreillä on hintansa: jokaisella tiedostolla ls täytyy hankkia tietoja tiedostotyypistä, sen käyttöoikeuksista, lipuista, laajennetuista attribuuteista ja vastaavista voidakseen valita oikean värin.

Yksi yksinkertainen ratkaisu ongelmaan on poistaa värit kokonaan käytöstä ls:ssä, mutta kuvittele käyttäjien suuttumus. Älä missään tapauksessa ota pois väritulostusta, emme ole hirviöitä.

Joten katsoimme syvemmälle. ls värimerkinnät ympäristömuuttujan kautta LS_COLORS, joka on asetettu dircolors(1) määritystiedoston perusteella dir_colors(5)... Joo, suoritettava tiedosto lukee asetustiedoston luodakseen ympäristömuuttujan, jota ls sitten käyttää (ja jos et tiedä tiedostoista ovi (do), sitten dir_colors se toimii, Kaikesta huolimatta).

Katsotaanpa tarkemmin

Loimme kokeellisen ympäristön määrittääksemme, mikä värimaailma aiheuttaa hidastumisen:

$ 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 sekuntia 10 000 tiedostolle, ei kovin hyvä.

Muuten, tarvitsemme lipun --color=always: vaikka hän kääntyy ls --color=automutta ls havaitsee, kun sitä ei ole kytketty liittimeen (esim. putkella tai lähdön uudelleenohjauksella), ja poistaa värityksen käytöstä, jos se on asetettu auto. Taitava kaveri.

Joten mikä kestää niin kauan? Katsoimme kanssa 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 puhelua lstat(), 10 000 puhelua getxattr() (jotka kaikki epäonnistuvat, koska ympäristöllämme ei ole ls:n etsimiä määritteitä), 10 000 puhelua capget().

Tämä voidaan varmasti optimoida.

Ominaisuudet-attribuutti? Ei

Neuvoja seuraten bugi 10 vuoden takaa, yritimme poistaa määritteiden tarkistuksen käytöstä kyvyt:

$ 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, jopa 8 sekuntia kiihdytystä! Pääsimme eroon kaikista niistä kalliista puheluista getxattr()ja haasteita capget() katosi myös, hienoa.

Mutta silti näitä ärsyttäviä puheluita tulee lstat(), Siitä huolimatta…

Kuinka monta kukkaa tarvitset?

Siksi katsoimme tarkemmin LS_COLORS.

Ensin yksinkertaisesti poistimme tämän muuttujan:

$ 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

Mitä!?! Vielä 13 sekuntia?

Osoittautuu, että kun ympäristömuuttuja LS_COLORS vain yksi sen elementeistä ei ole määritelty tai puuttuu <type>=color:, se käyttää oletuksena sisäänrakennettua tietokantaa ja käyttää silti värejä. Joten jos haluat poistaa värityksen käytöstä tietyltä tiedostotyypillä, sinun on ohitettava se <type>=: tai <type> 00 tiedostossa DIR_COLORS.

Monen yrityksen ja erehdyksen jälkeen rajasimme hakumme tähän:

EXEC 00
SETUID 00
SETGID 00
CAPABILITY 00

joka on kirjoitettu nimellä

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

Tämä tarkoittaa: älä väritä tiedostoja määritteellä. kyvyt, mutta pikkuhiljaa setuid/setgid, ei myöskään suoritettavuuden lippu.

Nopeutamme ls

Ja jos et tee mitään näistä tarkastuksista, soita lstat() katoavat, ja nyt on täysin eri asia:

$ 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 sekuntia 10 000 tiedoston luettelossa, ennätys.

Sherlockin asetukset

13 sekunnista oletusasetuksilla 0,3 sekuntiin pienin muutoksin LS_COLORS tarkoittaa 40-kertaista kiihtyvyyttä poissaolon vuoksi setuid / setgid ja värilliset suoritettavat tiedostot. Ei niin suuri menetys.

Tietenkin tämä on nyt määritetty Sherlockissa jokaiselle käyttäjälle.

Mutta jos haluat palauttaa värityksen, voit yksinkertaisesti palata oletusasetuksiin:

$ unset LS_COLORS

Mutta hakemistoissa, joissa on paljon tiedostoja, muista keittää kahvia sen ollessa käynnissä ls.

Lähde: will.com

Lisää kommentti