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è,
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
, mals
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
$ 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.
, nè da
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