Quandu una variabile ambientale accelera u prucessu di 40 volte

Oghje vulemu parlà di alcune di l'ultime aghjurnamenti di u sistema Sherlock [questu hè un cluster high-performance in Stanford University - approx. trans.], chì accelerà significativamente i schedarii di lista in cartulari cù un gran numaru di entrate.

A cuntrariu di l'articuli regulari, questu hè più un rapportu di l'insider nantu à cumu travagliammu regularmente Sherlock per mantene u so megliu per i nostri utilizatori. Speremu di publicà più articuli cum'è questu in u futuru.

A lista di parechji schedari piglia tempu

Tuttu hà cuminciatu cù una quistione di supportu tecnicu da un utilizatore. Hà dettu u prublema chì l'esekzione ls dura uni pochi di minuti in un annuariu cù più di 15 000 voci $SCRATCH [directory per i fugliali tempuranee - ca. corsia].

Migliaia di fugliali in un annuariu di solitu ponenu un pesu à u sistema di fugliale è ùn sò micca cunsigliatu. L'utilizatore sapia questu è ammette chì ùn era micca bonu, ma hà dettu chì a lista era 1000 volte più veloce in u so laptop chì Sherlock. Di sicuru, questu ci hà feritu. Allora avemu vistu più profonda.

Perchè mi pare bellu

Avemu vistu ciò chì face veramente ls quandu elencu un annuariu, è perchè u prucessu dura tantu. In a maiò parte di e distribuzioni muderni ls per difettu, funziona cum'è ls --color=auto, perchè tutti piacenu i culori.

Ma belli culori venenu à un prezzu: per ogni schedariu ls deve ottene infurmazione nantu à u tipu di fugliale, i so permessi, bandiere, attributi estesi è simili per selezziunà u culore adattatu.

Una solu suluzione simplice à u prublema hè di disattivà u culore in ls in tuttu, ma imagine l'indignazione di l'utilizatori. In nisuna circustanza ùn devi caccià a pruduzzioni di culore, ùn simu micca mostri.

Allora avemu vistu più profonda. ls entrate di culori via variabile d'ambiente LS_COLORS, chì hè stabilitu dircolors(1) basatu nantu à u schedariu di cunfigurazione dir_colors(5)... Iè, l'eseguibile leghje u schedariu di cunfigurazione per creà una variabile di l'ambiente, chì ls allora usa (è sè ùn cunnosci micca i schedarii da (fà), dopu dir_colors funziunerà, Malgradu tuttu).

Fighjemu un ochju più vicinu

Per determinà quale schema di culori provoca a rallentazione, avemu creatu un ambiente sperimentale:

$ 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 seconde per 10 000 schedari, micca assai bè.

Per via, avemu bisognu di una bandiera --color=always: ancu s'ellu si volta à ls --color=auto, ma ls rileva quandu ùn hè micca cunnessu à un terminal (per esempiu, per pipe o cù redirezzione di output) è disattiva a colorazione se impostata à auto. Un tippu intelligente.

Allora chì pigghia tantu tempu? Avemu vistu cun 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
[...]

Wow: 10 chjama lstat(), 10 chjama getxattr() (chì tutti fallenu perchè u nostru ambiente ùn hà micca l'attributi chì ls cerca), 10 000 chjama capget().

Di sicuru, questu pò esse ottimisatu.

Attributu di capacità? Innò

Dopu cunsiglii bug da 10 anni fà, avemu pruvatu à disattivà a verificazione di l'attributi capacità:

$ 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

Wow, finu à 8 seconde di accelerazione! Avemu sbarazzatu di tutte quelle chjamate caru getxattr(), è sfide capget() hè sparitu ancu, grande.

Ma ci sò sempre questi chjamati fastidiosi lstat(), Ancu se…

Quanti fiori avete bisognu?

Dunque, avemu pigliatu un ochju più attentu LS_COLORS.

Prima avemu solu disattivatu sta variabile:

$ 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

Chì !?! Sempre 13 seconde?

Ci hè chì quandu a variabile di l'ambiente LS_COLORS solu unu di i so elementi ùn hè micca definitu o manca <type>=color:, usa a basa di dati integrata per difettu è usa sempre i culori. Allora s'è vo vulete disattivà a culurizazione per un certu tipu di schedariu, avete bisognu di rimpiazzà <type>=: o <type> 00 in u schedariu DIR_COLORS.

Dopu assai prove è errore, avemu ristrettu a nostra ricerca finu à questu:

EXEC 00
SETUID 00
SETGID 00
CAPABILITY 00

chì hè scrittu cum'è

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

Questu significa: ùn colore micca i schedari per attributu. capacità, ma à pocu à pocu setuid/setgid, nè da bandiera di eseguibilità.

Acceleremu ls

È s'ellu ùn fate micca alcunu di sti cuntrolli, allora chjamate lstat() sparisce, è avà hè una materia completamente diversa:

$ 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 seconde nantu à una lista di 10 000 schedari, un record.

Stallà Sherlock

Da 13 seconde cù paràmetri predeterminati à 0,3 seconde cù aghjustamenti minori LS_COLORS significa una accelerazione di 40 volte per l'assenza setuid / setgid e fugliali eseguibili culurati. Micca una perdita cusì grande.

Di sicuru, questu hè avà cunfiguratu in Sherlock per ogni utilizatore.

Ma se vulete rinvià u culore, pudete solu vultà à i paràmetri predeterminati:

$ unset LS_COLORS

Ma dopu nantu à i cartulari cù assai schedari, assicuratevi di fà u caffè mentre hè in esecuzione ls.

Source: www.habr.com

Add a comment