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,
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ääntyyls --color=auto
muttals
havaitsee, kun sitä ei ole kytketty liittimeen (esim. putkella tai lähdön uudelleenohjauksella), ja poistaa värityksen käytöstä, jos se on asetettuauto
. 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
$ 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ä.
, ei myöskään
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