As in omjouwingsfariabele it proses mei 40 kear fersnelt

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, it útfierbere item lêst it konfiguraasjetriem om in omjouwingsfariabele te meitsjen, dy't dan brûkt wurdt (en as jo net witte oer bestannen troch (do), dan dir_colors it sil wurkje, Nettsjinsteande alles).

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 nei ls --color=auto, mar ls detektearret as it net ferbûn is mei in terminal (bygelyks troch piip of mei útfieromlieding) en skeakelet kleurjen út as ynsteld op auto. 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 bug fan 10 jier lyn, wy besochten attribútkontrôle út te skeakeljen kapasiteiten:

$ 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. kapasiteiten, mar bytsje by bytsje setuid/setgid, ek net troch útfierberens flagge.

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

Add a comment