Wann eng Ëmfeldvariabel de Prozess ëm 40 Mol beschleunegt

Haut wëlle mir iwwer e puer vun de leschten Updates vum Sherlock System schwätzen [dëst ass en High-Performance-Cluster op der Stanford University - ca. trans.], wat d'Lëscht vun Dateien an Verzeichnisser mat enger grousser Unzuel vun Entréen wesentlech beschleunegt.

Am Géigesaz zu reguläre Artikelen ass dëst méi en Insider Bericht iwwer wéi mir regelméisseg op Sherlock schaffen fir et op seng Bescht ze halen fir eis Benotzer. Mir hoffen méi Artikelen wéi dëst an Zukunft ze publizéieren.

Vill Dateien opzemaachen brauch Zäit

Et huet alles ugefaang mat enger technescher Support Fro vun engem Benotzer. Hien huet de Problem gemellt datt d'Ausféierung ls hëlt e puer Minutten an engem Verzeechnes mat iwwer 15 Entréen an $SCRATCH [Verzeechnes fir temporär Dateien - ca. laan].

Dausende vu Fichieren an engem Verzeechnes stellen normalerweis eng Belaaschtung fir de Dateiesystem an ass definitiv net recommandéiert. De Benotzer wousst dëst an huet zouginn datt et net gutt war, awer ernimmt datt d'Lëscht 1000 Mol méi séier op sengem Laptop war wéi Sherlock. Natierlech huet dat eis schueden. Also hu mir méi déif gekuckt.

Well et gesäit gutt aus

Mir hunn gekuckt wat et eigentlech mécht ls wann Dir e Verzeechnes oplëscht, a firwat de Prozess sou laang dauert. Op déi meescht modern Verdeelungen ls par défaut leeft et als ls --color=auto, well jidderee gär d'Faarwen.

Mee schéin Faarwen kommen zu engem Präis: fir all Dossier ls muss Informatiounen iwwer den Dateityp, seng Permissiounen, Fändelen, erweidert Attributer an dergläiche kréien fir déi entspriechend Faarf ze wielen.

Eng einfach Léisung fir de Problem ass d'Faarf an ls ganz auszeschalten, awer stellt Iech d'Urgence vun de Benotzer vir. Ënner kengen Ëmstänn sollt Dir d'Faarfoutput ewechhuelen, mir sinn keng Monsteren.

Also hu mir méi déif gekuckt. ls Faarwen Entréen via Ëmwelt Variabel LS_COLORS, déi gesat ass dircolors(1) baséiert op Configuratiounsdatei dir_colors(5)... Jo, den ausführbar liest d'Konfiguratiounsdatei fir eng Ëmfeldvariabel ze kreéieren, déi dann benotzt (a wann Dir net iwwer Dateien wësst by (do), dann dir_colors wäert schaffen, Trotz allem).

Loosst eis méi no kucken

Fir ze bestëmmen wéi eng Faarfschema de Verlängerung verursaacht, hu mir en experimentellen Ëmfeld erstallt:

$ 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 Sekonnen fir 10 Fichieren, net ganz gutt.

Mir brauchen iwwregens e Fändel --color=always: obwuel hien dréit zu ls --color=auto, awer ls detektéiert wann et net mat engem Terminal verbonnen ass (z.B. duerch Päif oder mat Ausgangsvirleedung) an deaktivéiert d'Faarwen wann se agestallt sinn auto. Clever Guy.

Also wat dauert sou laang? Mir hu gekuckt mat 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 Uriff lstat(), 10 Uriff getxattr() (déi all versoen well eis Ëmwelt net d'Attributer huet no no sicht), 10 Uruff capget().

Sécher kann dëst optimiséiert ginn.

Fäegkeeten Attribut? Nee

No Rotschléi Feeler vun virun 10 Joer, hu mir probéiert d'Attributkontrolle auszeschalten Kënnen:

$ 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, bis zu 8 Sekonnen Beschleunegung! Mir hunn all déi deier Uriff lass gelooss getxattr(), an Erausfuerderungen capget() och verschwonnen, super.

Awer et ginn nach ëmmer dës lästeg Uriff lstat(), Och wann...

Wéi vill Blummen brauch Dir?

Dofir hu mir eis méi genee gekuckt LS_COLORS.

Als éischt hu mir dës Variabel einfach deaktivéiert:

$ 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

Waat!?! Nach 13 Sekonnen?

Et stellt sech eraus, datt wann d'Ëmwelt variabel LS_COLORS nëmmen een vun hiren Elementer ass net definéiert oder fehlt <type>=color:, et benotzt déi agebauter Datebank par défaut a benotzt nach ëmmer Faarwen. Also wann Dir d'Faarwen fir e bestëmmten Dateityp deaktivéiere wëllt, musst Dir et iwwerschreiden <type>=: oder <type> 00 am Fichier DIR_COLORS.

No vill Versuch a Feeler hu mir eis Sich op dëst verklengert:

EXEC 00
SETUID 00
SETGID 00
CAPABILITY 00

déi geschriwwe gëtt als

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

Dëst bedeit: Faarf Dateien net no Attribut. Kënnen, awer lues a lues setuid/setgid, weder vun Ausféierbarkeet Fändel.

Mir beschleunegen ls

A wann Dir keng vun dësen Kontrollen maacht, da rifft lstat() verschwannen, an elo ass et eng ganz aner Saach:

$ 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 Sekonnen op enger Lëscht vun 10 Dateien, e Rekord.

Opriichten Sherlock

Vun 13 Sekonnen mat Standardastellungen op 0,3 Sekonnen mat klengen Upassungen LS_COLORS heescht eng 40-fache Beschleunegung wéinst der Verontreiung setuid / setgid a faarweg ausführbar Dateien. Net esou e grousse Verloscht.

Natierlech ass dëst elo am Sherlock fir all Benotzer konfiguréiert.

Awer wann Dir d'Faarwen zréck wëllt, kënnt Dir einfach op d'Standardastellungen zréckkommen:

$ unset LS_COLORS

Awer dann op Verzeichnisser mat vill Dateien, gitt sécher Kaffi ze brauen wärend et leeft ls.

Source: will.com

Setzt e Commentaire