Kada varijabla okruženja ubrza proces za 40 puta

Danas želimo da razgovaramo o nekim od najnovijih ažuriranja sistema Sherlock [ovo je klaster visokih performansi na Univerzitetu Stanford - cca. trans.], što značajno ubrzava listanje fajlova u direktorijumima sa velikim brojem unosa.

Za razliku od redovnih članaka, ovo je više insajdersko izvješće o tome kako redovito radimo na Sherlocku kako bismo ga održali na najbolji mogući način za naše korisnike. Nadamo se da ćemo u budućnosti objavljivati ​​još ovakvih članaka.

Popis mnogih fajlova zahteva vreme

Sve je počelo pitanjem tehničke podrške od strane korisnika. Prijavio je problem izvršenja ls traje nekoliko minuta u direktorijumu sa preko 15 unosa $SCRATCH [direktorij za privremene datoteke - cca. lane].

Hiljade datoteka u jednom direktoriju obično predstavljaju opterećenje za sistem datoteka i definitivno se ne preporučuje. Korisnik je to znao i priznao da to nije dobro, ali je spomenuo da je listanje bila 1000 puta brža na njegovom laptopu od Sherlocka. Naravno, ovo nas je povrijedilo. Pa smo pogledali dublje.

Jer izgleda lepo

Pogledali smo šta zapravo radi ls kada navodite imenik i zašto proces traje toliko dugo. Na većini modernih distribucija ls po defaultu radi kao ls --color=auto, jer svi vole boje.

Ali lijepe boje imaju cijenu: za svaku datoteku ls mora dobiti informacije o tipu datoteke, njegovim dozvolama, oznakama, proširenim atributima i slično kako bi odabrao odgovarajuću boju.

Jedno jednostavno rješenje problema je potpuno isključiti boju u ls-u, ali zamislite bijes korisnika. Ni pod kojim okolnostima ne smijete oduzimati rezultat u boji, mi nismo čudovišta.

Pa smo pogledali dublje. ls unose boja preko varijable okruženja LS_COLORS, koji je postavljen dircolors(1) na osnovu konfiguracionog fajla dir_colors(5)... Da, izvršna datoteka čita konfiguracijsku datoteku kako bi kreirala varijablu okruženja, koju ls zatim koristi (a ako ne znate za fajlove vrata (do), zatim dir_colors će raditi, Uprkos svemu).

Pogledajmo izbliza

Da bismo utvrdili koja shema boja uzrokuje usporavanje, kreirali smo eksperimentalno okruženje:

$ 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 sekundi za 10 fajlova, ne baš dobro.

Usput, treba nam zastava --color=always: iako se okreće ls --color=auto, ali ls otkriva kada nije spojen na terminal (npr. putem cijevi ili s preusmjeravanjem izlaza) i onemogućuje bojenje ako je postavljeno na auto. Pametan momak.

Pa šta toliko traje? Gledali smo sa 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 poziva lstat(), 10 poziva getxattr() (što sve ne uspijeva jer naše okruženje nema atribute koje traži ls), 10 poziva capget().

Ovo se sigurno može optimizirati.

Atribut sposobnosti? Ne

Sledeći savet bubica od prije 10 godina, pokušali smo onemogućiti provjeru atributa mogućnosti:

$ 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, do 8 sekundi ubrzanja! Riješili smo se svih tih skupih poziva getxattr()i izazove capget() nestao i super.

Ali i dalje ima ovih dosadnih poziva lstat(), Iako…

Koliko cvijeća vam treba?

Stoga smo malo bolje pogledali LS_COLORS.

Prvo smo jednostavno onemogućili ovu varijablu:

$ 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

Šta!?! Još 13 sekundi?

Ispostavilo se da kada je varijabla okruženja LS_COLORS samo jedan od njegovih elemenata nije definisan ili nedostaje <type>=color:, po defaultu koristi ugrađenu bazu podataka i još uvijek koristi boje. Dakle, ako želite da onemogućite kolorizaciju za određenu vrstu datoteke, morate je nadjačati sa <type>=: ili <type> 00 u fajlu DIR_COLORS.

Nakon mnogo pokušaja i grešaka, suzili smo našu pretragu na ovo:

EXEC 00
SETUID 00
SETGID 00
CAPABILITY 00

koji je napisan kao

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

To znači: ne bojite datoteke po atributima. mogućnosti, ali malo po malo setuid/setgid, ni od strane zastavicu izvršnosti.

Ubrzavamo ls

A ako ne obavite nijednu od ovih provjera, onda pozovite lstat() nestati, a sada je sasvim druga stvar:

$ 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 sekunde na listi od 10 fajlova, rekord.

Postavljanje Sherlocka

Od 13 sekundi sa zadanim postavkama do 0,3 sekunde sa manjim podešavanjima LS_COLORS znači 40-struko ubrzanje zbog odsustva setuid / setgid i obojene izvršne datoteke. Nije tako veliki gubitak.

Naravno, ovo je sada konfigurirano u Sherlocku za svakog korisnika.

Ali ako želite vratiti boju, jednostavno se možete vratiti na zadane postavke:

$ unset LS_COLORS

Ali onda u direktorijumima sa puno fajlova, obavezno skuvajte kafu dok je u toku ls.

izvor: www.habr.com

Dodajte komentar