Aujourd'hui, nous souhaitons parler de certaines des derniĂšres mises Ă jour du systĂšme Sherlock [c'est un cluster haute performance de l'UniversitĂ© de Stanford â note du traducteur], qui accĂ©lĂšrent considĂ©rablement le listing des fichiers dans des rĂ©pertoires avec un grand nombre d'entrĂ©es.
Contrairement aux articles habituels, il s'agit plutÎt d'un rapport d'insider sur le travail régulier réalisé sur Sherlock pour le maintenir en excellente condition pour nos utilisateurs. Nous espérons publier davantage de tels articles à l'avenir.
Lister de nombreux fichiers prend du temps.
Tout a commencĂ© par une demande au support technique de la part d'un utilisateur. Il a signalĂ© un problĂšme, prĂ©cisant que l'exĂ©cution ls prenait plusieurs minutes dans un rĂ©pertoire contenant plus de 15 000 entrĂ©es dans $SCRATCH [rĂ©pertoire pour fichiers temporaires â note du traducteur].
Des milliers de fichiers dans un mĂȘme rĂ©pertoire crĂ©ent gĂ©nĂ©ralement des difficultĂ©s pour le systĂšme de fichiers et cela n'est absolument pas recommandĂ©. L'utilisateur le savait et a reconnu que c'Ă©tait problĂ©matique, mais il a mentionnĂ© que sur son ordinateur portable, le listing s'effectuait 1000 fois plus vite qu'avec Sherlock. Bien sĂ»r, cela nous a interpellĂ©s. Nous avons donc enquĂȘtĂ© plus profondĂ©ment.
Parce que ls a l'air bien.
Nous avons examiné ce que fait réellement ls lors du listing d'un répertoire, et pourquoi le processus prend autant de temps. Dans la plupart des distributions modernes, ls ls est exécuté par défaut comme ls --color=auto, car tout le monde aime la couleur.
Mais ces belles couleurs ont un prix : pour chaque fichier, ls il doit obtenir des informations sur le type de fichier, ses permissions, ses drapeaux, ses attributs étendus, etc., afin de choisir la couleur appropriée.
Une des solutions simples au problÚme est de désactiver entiÚrement la couleur dans ls, mais imaginez l'indignation des utilisateurs. Il est hors de question de retirer la sortie colorée, nous ne sommes pas des monstres.
C'est pourquoi nous avons investigué plus en profondeur. ls ls colorie les entrées via la variable d'environnement LS_COLORS, qui est définie par dircolors(1) sur la base du fichier de configuration dir_colors(5). Oui,l'exécutable lit le fichier de configuration pour créer la variable d'environnement, qui est ensuite utilisée par ls door fonctionnera Examinons cela de plus prÚs.
Pour déterminer laquelle des schémas de coloration cause le ralentissement, nous avons créé un environnement expérimental :
Pour déterminer laquelle des configurations de coloration cause des ralentissements, nous avons créé un environnement expérimental :
$ mkdir $SCRATCH/dont
$ touch $SCRATCH/dont/{1..10000} # ne le faites pas chez vous !
$ time ls --color=always $SCRATCH/dont | wc -l
10000
réel 0m12.758s
utilisateur 0m0.104s
systĂšme 0m0.699s12,7 secondes pour 10 000 fichiers, ce n'est pas incroyable.
Au fait, il faut un drapeau
--color=always: mĂȘme s'il se transforme enls --color=auto, maislsil dĂ©tecte quand il n'est pas connectĂ© au terminal (par exemple, par un pipeline ou avec une redirection de sortie) et dĂ©sactive la coloration si la valeur est rĂ©glĂ©e surauto. Intelligent.
Alors quâest-ce qui prend autant de temps ? Nous avons regardĂ© avec strace:
$ strace -c ls --color=always $SCRATCH/dont | wc -l
10000
% temps secondes microsecondes/appel appels erreurs appel systĂšme
------ ----------- ----------- --------- --------- ----------------
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 000 appels lstat(), 10 000 appels getxattr() (qui échouent tous, car notre environnement n'a pas les attributs recherchés par ls), 10 000 appels capget().
Cela peut probablement ĂȘtre optimisĂ©.
Attributs de capacités ? Non.
En suivant les conseils de , nous avons essayé de désactiver la vérification des attributs :
$ eval $(dircolors -b | sed s/ca=[^:]*:/ca=:)
$ time strace -c ls --color=always $SCRATCH/dont | wc -l
10000
% temps secondes microsecondes/appel appels erreurs appel systĂšme
------ ----------- ----------- --------- --------- ----------------
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
réel 0m8.160s
utilisateur 0m0.115s
systÚme 0m0.961s Wow, réduisant à 8 secondes ! Nous nous sommes débarrassés de tous ces appels coûteux getxattr(), et les appels capget() ont également disparu, super.
Mais il reste encore ces appels ennuyeux lstat(), bien queâŠ
Combien de couleurs faut-il ?
Nous avons donc examiné cela de plus prÚs LS_COLORS.
Nous avons d'abord simplement désactivé cette variable :
$ 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: $ unset LS_COLORS $ echo $LS_COLORS $ time ls --color=always $SCRATCH/dont | wc -l 10000 real 0m13.037s user 0m0.077s sys 0m1.092s
Quoi!?! Toujours 13 secondes?
Apparemment, lorsque la variable d'environnement LS_COLORS n'est pas dĂ©finie ou qu'il manque un de ses Ă©lĂ©ments =color:, elle utilise par dĂ©faut une base de donnĂ©es intĂ©grĂ©e et utilise tout de mĂȘme des couleurs. Par consĂ©quent, si vous souhaitez dĂ©sactiver la coloration pour un type de fichier spĂ©cifique, vous devez la redĂ©finir avec :=: ou 00 dans le fichier DIR_COLORS.
AprÚs de nombreuses essais et erreurs, nous avons réduit la recherche à ceci :
EXEC 00
SETUID 00
SETGID 00
CAPABILITY 00qui est enregistré comme
LS_COLORS='ex=00:su=00:sg=00:ca=00:' Cela signifie : ne pas colorer les fichiers selon les attributs , ni par les bits , ni par .
Accélérer ls
Et si aucune de ces vérifications n'est effectuée, alors les appels lstat() disparaissent, et maintenant c'est tout autre chose :
$ 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.029s0,3 secondes pour une liste de 10 000 fichiers, un record.
Configuration de Sherlock
De 13 secondes avec les paramÚtres par défaut à 0,3 seconde avec un léger ajustement LS_COLORS cela signifie un accélération de 40 fois grùce à l'absence setuid / setgid et les fichiers exécutables coloriés. Pas une si grande perte.
Bien sûr, c'est maintenant configuré dans Sherlock pour chaque utilisateur.
Mais si vous souhaitez revenir à la coloration, vous pouvez simplement revenir aux paramÚtres par défaut :
$ unset LS_COLORS Mais alors, pour les répertoires avec un grand nombre de fichiers, il est indispensable de préparer un café pendant que cela fonctionne. ls.
Source : habr.com
