Þegar umhverfisbreyta flýtir ferlinu um 40 sinnum

Í dag viljum við tala um nokkrar af nýjustu uppfærslunum á Sherlock kerfinu [þetta er afkastamikill þyrping við Stanford háskóla - u.þ.b. trans.], sem flýtir verulega fyrir skráningu skráa í möppur með miklum fjölda færslum.

Ólíkt venjulegum greinum er þetta meira innherjaskýrsla um hvernig við vinnum reglulega að Sherlock til að halda því í gangi sem best fyrir notendur okkar. Við vonumst til að birta fleiri svona greinar í framtíðinni.

Það tekur tíma að skrá margar skrár

Þetta byrjaði allt með tækniaðstoðarspurningu frá notanda. Hann greindi frá því vandamáli að framkvæmdin ls tekur nokkrar mínútur í möppu með yfir 15 færslum í $SCRATCH [möppu fyrir tímabundnar skrár - u.þ.b. braut].

Þúsundir skráa í einni möppu eru venjulega álag á skráarkerfið og er örugglega ekki mælt með því. Notandinn vissi þetta og viðurkenndi að þetta væri ekki gott en nefndi að skráningin væri 1000 sinnum hraðari á fartölvu hans en Sherlock. Auðvitað bitnaði þetta á okkur. Svo við skoðuðum dýpra.

Vegna þess að þetta lítur vel út

Við skoðuðum hvað það gerir í raun og veru ls þegar skráning er skráð og hvers vegna ferlið tekur svona langan tíma. Á flestum nútíma dreifingum ls sjálfgefið keyrir það sem ls --color=auto, vegna þess að allir hafa gaman af litunum.

En fallegir litir eru á verði: fyrir hverja skrá ls verður að afla upplýsinga um skráargerðina, heimildir hennar, fána, aukna eiginleika og þess háttar til að velja viðeigandi lit.

Ein einföld lausn á vandamálinu er að slökkva algjörlega á lit í ls, en ímyndaðu þér hneykslun notenda. Undir engum kringumstæðum ættir þú að taka litaúttakið í burtu, við erum ekki skrímsli.

Svo við skoðuðum dýpra. ls litafærslur með umhverfisbreytu LS_COLORS, sem sett er dircolors(1) byggt á stillingarskrá dir_colors(5). Já, keyrslan les stillingarskrána til að búa til umhverfisbreytu, sem síðan notar (og ef þú veist ekki um skrár dyr (gera), þá dir_colors mun virka, Þrátt fyrir allt).

Við skulum skoða nánar

Til að ákvarða hvaða litasamsetning veldur hægaganginum bjuggum við til tilraunaumhverfi:

$ 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 sekúndur fyrir 10 skrár, ekki mjög gott.

Við the vegur, við þurfum fána --color=always: þó hann snúi sér til ls --color=autoEn ls skynjar þegar það er ekki tengt við útstöð (t.d. með pípu eða með úttakstilvísun) og slekkur á litun ef stillt er á auto. Snjall gaur.

Svo hvað tekur svona langan tíma? Við skoðuðum með 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
[...]

Vá: 10 kall lstat(), 10 kall getxattr() (sem allt mistakast vegna þess að umhverfi okkar hefur ekki eiginleikana sem ég er að leita að), 10 kall capget().

Vissulega er hægt að hagræða þessu.

Eiginleiki hæfileika? Neibb

Farið eftir ráðleggingum galla fyrir 10 árum síðan, við reyndum að slökkva á eigindaskoðun getu:

$ 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

Vá, allt að 8 sekúndur af hröðun! Við losnuðum við öll þessi dýru símtöl getxattr(), og áskoranir capget() hvarf líka, frábært.

En það eru samt þessi pirrandi símtöl lstat(), Samt…

Hversu mörg blóm þarftu?

Þess vegna skoðuðum við nánar LS_COLORS.

Fyrst slökktum við einfaldlega á þessari breytu:

$ 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

Hvað!?! Enn 13 sekúndur?

Það kemur í ljós að þegar umhverfið breytist LS_COLORS aðeins einn af þáttum þess er ekki skilgreindur eða vantar <type>=color:, það notar innbyggða gagnagrunninn sjálfgefið og notar samt liti. Svo ef þú vilt slökkva á litun fyrir ákveðna skráartegund þarftu að hnekkja henni með <type>=: eða <type> 00 í skrá DIR_COLORS.

Eftir mikla reynslu og villu, þrengdum við leitina niður í þetta:

EXEC 00
SETUID 00
SETGID 00
CAPABILITY 00

sem er skrifað sem

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

Þetta þýðir: ekki lita skrár eftir eiginleikum. getu, en smátt og smátt setuid/setgid, hvorki af executability flag.

Við flýtum ls

Og ef þú gerir ekki neitt af þessum eftirliti, þá hringir lstat() hverfa, og nú er það allt annað mál:

$ 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 sekúndur á lista yfir 10 skrár, met.

Að setja upp Sherlock

Frá 13 sekúndum með sjálfgefnum stillingum í 0,3 sekúndur með minniháttar breytingum LS_COLORS þýðir 40-falda hröðun vegna fjarveru setuid / setgid og litaðar keyrsluskrár. Ekki svo mikið tap.

Auðvitað er þetta nú stillt í Sherlock fyrir hvern notanda.

En ef þú vilt skila lituninni geturðu einfaldlega farið aftur í sjálfgefnar stillingar:

$ unset LS_COLORS

En þá á möppum með fullt af skrám, vertu viss um að brugga kaffi á meðan það er í gangi ls.

Heimild: www.habr.com

Bæta við athugasemd