Hjoed wolle wy prate oer guon fan 'e lêste updates foar it Sherlock-systeem [dit is in kluster mei hege prestaasjes by Stanford University - sawat. trans.], dy't de list fan bestannen yn mappen mei in grut oantal yngongen signifikant fersnelle.
Oars as gewoane artikels, is dit mear in rapport fan insider oer hoe't wy regelmjittich oan Sherlock wurkje om it op syn bêst te hâlden foar ús brûkers. Wy hoopje yn 'e takomst mear artikels lykas dit te publisearjen.
List fan in protte bestannen nimt tiid
It begon allegear mei in fraach oer technyske stipe fan in brûker. Hy rapportearre it probleem dat de útfiering ls
nimt in pear minuten yn in map mei mear as 15 yngongen yn $SCRATCH
[map foar tydlike bestannen - sawat. lyn].
Tûzenen bestannen yn ien map foarmje normaal in lêst foar it bestânsysteem en wurdt perfoarst net oanrikkemandearre. De brûker wist dit en joech ta dat it net goed wie, mar neamde dat de fermelding 1000 kear flugger wie op syn laptop as Sherlock. Fansels hat dit ús sear dien. Sa hawwe wy djipper sjoen.
Want it sjocht der moai út
Wy hawwe sjoen wat it eins docht ls
as jo in map opnimme, en wêrom't it proses sa lang duorret. Op de measte moderne distribúsjes ls
standert rint it as ls --color=auto
, want elkenien hâldt fan de kleuren.
Mar moaie kleuren hawwe in priis: foar elk bestân ls
moat ynformaasje krije oer it bestânstype, syn tagongsrjochten, flaggen, útwreide attributen en sa om de passende kleur te selektearjen.
Ien ienfâldige oplossing foar it probleem is om kleur yn ls hielendal út te skeakeljen, mar stel jo de skande fan brûkers foar. Under gjin omstannichheden moatte jo nimme fuort de kleur útfier, wy binne gjin meunsters.
Sa hawwe wy djipper sjoen. ls
kleuren yngongen fia omjouwingsfariabele LS_COLORS
, dy't ynsteld is dircolors(1)
basearre op konfiguraasjetriem dir_colors(5)
... Ja,
Lit ús ris efkes neier sjen
Om te bepalen hokker kleurskema de fertraging feroarsaket, hawwe wy in eksperimintele omjouwing makke:
$ 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 sekonden foar 10 triemmen, net hiel goed.
Trouwens, wy hawwe in flagge nedich
--color=always
: hoewol't er keart neils --color=auto
, marls
detektearret as it net ferbûn is mei in terminal (bygelyks troch piip of mei útfieromlieding) en skeakelet kleurjen út as ynsteld opauto
. Slimme keardel.
Dus wat duorret sa lang? Wy seagen mei 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 oproppen lstat()
, 10 oproppen getxattr()
(dy't allegear mislearje om't ús omjouwing net de attributen hat wêr't ls nei siket), 10 oproppen capget()
.
Fansels kin dit optimalisearre wurde.
Mooglikheden attribút? Nee
Advys folgje
$ 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, oant 8 sekonden fan fersnelling! Wy hawwe al dy djoere oproppen kwyt getxattr()
, en útdagings capget()
ferdwûn ek, great.
Mar d'r binne noch dizze ferfelende oproppen lstat()
, Hoewol...
Hoefolle blommen hawwe jo nedich?
Dêrom hawwe wy in tichterby sjoen LS_COLORS
.
Earst hawwe wy dizze fariabele gewoan útskeakele:
$ 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
Wat!?! Noch 13 sekonden?
It docht bliken dat doe't de omjouwing fariabele LS_COLORS
mar ien fan syn eleminten is net definiearre of ûntbrekt <type>=color:
, it brûkt standert de ynboude databank en brûkt noch altyd kleuren. Dus as jo ynkleuring foar in bepaald bestânstype útskeakelje wolle, moatte jo it oerskriuwe mei <type>=:
of <type> 00
yn triem DIR_COLORS
.
Nei in protte probearje en flater, hawwe wy ús sykopdracht beheind ta dit:
EXEC 00
SETUID 00
SETGID 00
CAPABILITY 00
dy't skreaun is as
LS_COLORS='ex=00:su=00:sg=00:ca=00:'
Dit betsjut: gjin triemmen kleurje op attribút.
, ek net troch
Wy fersnelle ls
En as jo gjin ien fan dizze kontrôles dogge, ropt dan lstat()
ferdwine, en no is it in folslein oare saak:
$ 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 sekonden op in list fan 10 bestannen, in rekord.
It opsetten fan Sherlock
Fan 13 sekonden mei standertynstellingen oant 0,3 sekonden mei lytse oanpassingen LS_COLORS
betsjut in 40-fold fersnelling fanwege de ôfwêzigens setuid
/ setgid
en kleurde útfierbere triemmen. Net sa'n grut ferlies.
Fansels is dit no yn Sherlock konfigureare foar elke brûker.
Mar as jo de kleur werom wolle, kinne jo gewoan weromgean nei de standertynstellingen:
$ unset LS_COLORS
Mar dan op mappen mei in protte bestannen, wês wis dat jo kofje brouwe wylst it rint ls
.
Boarne: www.habr.com