Meta varjabbli ambjentali tħaffef il-proċess b'40 darba

Illum irridu nitkellmu dwar xi wħud mill-aħħar aġġornamenti għas-sistema Sherlock [dan huwa cluster ta 'prestazzjoni għolja fl-Università ta' Stanford - approx. trans.], li jħaffu b'mod sinifikanti l-elenkar ta' fajls f'direttorji b'numru kbir ta' entrati.

B'differenza mill-artikoli regolari, dan huwa aktar rapport ta 'insider dwar kif naħdmu regolarment fuq Sherlock biex inżommu jaħdem bl-aħjar mod għall-utenti tagħna. Nittamaw li nippubblikaw aktar artikli bħal dan fil-futur.

Elenkar ta 'ħafna fajls jieħu ż-żmien

Kollox beda b'mistoqsija ta 'appoġġ tekniku minn utent. Huwa rrapporta l-problema li l-eżekuzzjoni ls jieħu ftit minuti f'direttorju b'aktar minn 15 entrata $SCRATCH [direttorju għal fajls temporanji - madwar. korsija].

Eluf ta 'fajls f'direttorju wieħed normalment joħolqu piż għas-sistema tal-fajls u żgur mhux rakkomandat. L-utent kien jaf dan u ammetta li ma kienx tajjeb, iżda semma li l-elenkar kien 1000 darba aktar mgħaġġel fuq il-laptop tiegħu minn Sherlock. Naturalment, dan weġġagħna. Allura ħaresna aktar fil-fond.

Għax ls tidher sabiħa

Ħarsa lejn dak li fil-fatt tagħmel ls meta jelenka direttorju, u għaliex il-proċess jieħu daqshekk twil. Fuq il-biċċa l-kbira tad-distribuzzjonijiet moderni ls b'mod awtomatiku din taħdem bħala ls --color=auto, għax kulħadd iħobb il-kuluri.

Iżda kuluri sbieħ għandhom prezz: għal kull fajl ls irid jikseb informazzjoni dwar it-tip tal-fajl, il-permessi tiegħu, il-bnadar, l-attributi estiżi u affarijiet simili sabiex jagħżel il-kulur xieraq.

Soluzzjoni waħda sempliċi għall-problema hija li tiddiżattiva l-kulur f'ls għal kollox, imma immaġina l-għajb tal-utenti. Taħt l-ebda ċirkostanza m'għandek tieħu l-output tal-kulur, aħna mhux monsters.

Allura ħaresna aktar fil-fond. ls daħliet kuluri permezz varjabbli ambjentali LS_COLORS, li huwa stabbilit dircolors(1) ibbażat fuq il-fajl tal-konfigurazzjoni dir_colors(5)... Iva, l-eżekutibbli jaqra l-fajl tal-konfigurazzjoni biex joħloq varjabbli ambjentali, li ls imbagħad juża (u jekk ma tafx dwar il-fajls bieb (do), imbagħad dir_colors se naħdem, Minkejja kollox).

Ejja nagħtu ħarsa aktar mill-qrib

Biex niddeterminaw liema skema ta’ kuluri tikkawża t-tnaqqis, ħloqna ambjent sperimentali:

$ 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 sekondi għal 10 fajl, mhux tajjeb ħafna.

Mill-mod, għandna bżonn bandiera --color=always: għalkemm idur fuq ls --color=autoImma ls jiskopri meta ma jkunx imqabbad ma' terminal (eż. permezz ta' pajp jew b'direzzjoni mill-ġdid tal-output) u tiddiżattiva l-kulur jekk issettjat għal auto. Bniedem għaqlija.

Allura x'qed jieħu daqshekk? Ħarsu ma’ 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
[...]

Ara naqra: 10 telefonata lstat(), 10 telefonata getxattr() (li kollha jonqsu għax l-ambjent tagħna m'għandux l-attributi li qed tfittex), 10 sejħa capget().

Żgur li dan jista 'jiġi ottimizzat.

Kapaċitajiet attribut? Le

Wara parir bug minn 10 snin ilu, ippruvajna tiddiżattiva l-iċċekkjar tal-attributi kapaċitajiet:

$ 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

Ara naqra, sa 8 sekondi ta 'aċċelerazzjoni! Neħles minn dawk it-telefonati kollha għaljin getxattr(), u sfidi capget() sparixxa wkoll, kbir.

Iżda għad hemm dawn is-sejħiet tedjanti lstat(), Għalkemm...

Kemm għandek bżonn fjuri?

Għalhekk, ħadna ħarsa aktar mill-qrib LS_COLORS.

L-ewwel aħna sempliċement iddiżattivajna din il-varjabbli:

$ 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

Xiex!?! Għadhom 13-il sekonda?

Jirriżulta li meta l-ambjent varjabbli LS_COLORS wieħed biss mill-elementi tiegħu mhuwiex definit jew huwa nieqes <type>=color:, juża d-database inkorporata awtomatikament u għadu juża kuluri. Mela jekk trid tiddiżattiva l-kolorizzazzjoni għal ċertu tip ta 'fajl, trid tegħlebha <type>=: jew <type> 00 fil-fajl DIR_COLORS.

Wara ħafna provi u żbalji, naqqset it-tfittxija tagħna għal dan:

EXEC 00
SETUID 00
SETGID 00
CAPABILITY 00

li huwa miktub bħala

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

Dan ifisser: tikkulurix fajls skont l-attribut. kapaċitajiet, imma ftit ftit setuid/setgid, la minn bandiera tal-eżekutibbiltà.

Aħna nħaffu ls

U jekk ma tagħmel l-ebda waħda minn dawn il-kontrolli, imbagħad iċempel lstat() jisparixxu, u issa hija kwistjoni kompletament differenti:

$ 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 sekondi fuq lista ta '10 fajl, rekord.

It-twaqqif ta' Sherlock

Minn 13-il sekonda b'settings default għal 0,3 sekondi b'aġġustamenti minuri LS_COLORS tfisser aċċelerazzjoni ta '40 darba minħabba l-assenza setuid / setgid u fajls eżekutibbli kkuluriti. Mhux telf daqshekk kbir.

Naturalment, dan issa huwa kkonfigurat fi Sherlock għal kull utent.

Imma jekk trid tirritorna l-kulur, tista 'sempliċement terġa' lura għas-settings default:

$ unset LS_COLORS

Imma mbagħad fuq direttorji b'ħafna fajls, kun żgur li tipprepara l-kafè waqt li tkun qed taħdem ls.

Sors: www.habr.com

Żid kumment