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,
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 zuls --color=auto
, awerls
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 sinnauto
. 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
$ 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.
, weder vun
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