Wakati mabadiliko ya mazingira yanaharakisha mchakato kwa mara 40

Leo tunataka kuzungumzia baadhi ya masasisho ya hivi punde kwenye mfumo wa Sherlock [hili ni kundi la utendaji wa juu katika Chuo Kikuu cha Stanford - takriban. trans.], ambayo huharakisha kwa kiasi kikubwa kuorodhesha faili katika saraka zilizo na idadi kubwa ya maingizo.

Tofauti na makala ya kawaida, hii ni zaidi ya ripoti ya mtu kutoka ndani kuhusu jinsi tunavyofanya kazi mara kwa mara kwenye Sherlock ili kuifanya ifanye kazi vizuri zaidi kwa watumiaji wetu. Tunatumai kuchapisha nakala zaidi kama hii katika siku zijazo.

Kuorodhesha faili nyingi huchukua muda

Yote ilianza na swali la msaada wa kiufundi kutoka kwa mtumiaji. Aliripoti tatizo kwamba utekelezaji ls inachukua dakika chache kwenye saraka na maingizo zaidi ya 15 $SCRATCH [saraka ya faili za muda - takriban. njia].

Maelfu ya faili kwenye saraka moja kawaida huwa mzigo kwa mfumo wa faili na haifai kabisa. Mtumiaji alijua hili na akakubali kuwa haikuwa nzuri, lakini alitaja kuwa tangazo lilikuwa haraka mara 1000 kwenye kompyuta yake ya mkononi kuliko Sherlock. Bila shaka, hili lilituumiza. Kwa hivyo tuliangalia zaidi.

Kwa sababu inaonekana nzuri

Tuliangalia ni nini hasa hufanya ls wakati wa kuorodhesha saraka, na kwa nini mchakato unachukua muda mrefu sana. Juu ya usambazaji wa kisasa zaidi ls kwa chaguo-msingi inaendesha kama ls --color=auto, kwa sababu kila mtu anapenda rangi.

Lakini rangi nzuri huja kwa bei: kwa kila faili ls lazima ipate maelezo kuhusu aina ya faili, ruhusa zake, bendera, sifa zilizopanuliwa na mengineyo ili kuchagua rangi inayofaa.

Suluhisho moja rahisi kwa shida ni kuzima rangi katika ls kabisa, lakini fikiria hasira ya watumiaji. Kwa hali yoyote usichukue pato la rangi, sisi sio monsters.

Kwa hivyo tuliangalia zaidi. ls maingizo ya rangi kupitia mabadiliko ya mazingira LS_COLORS, ambayo imewekwa dircolors(1) kulingana na faili ya usanidi dir_colors(5). Ndiyo, inayoweza kutekelezwa inasoma faili ya usanidi ili kuunda utofauti wa mazingira, ambao ls kisha hutumia (na ikiwa haujui juu ya faili mlango (fanya), kisha dir_colors itafanya kazi, Licha ya kila kitu).

Hebu tuangalie kwa karibu

Kuamua ni mpango gani wa rangi unaosababisha kushuka, tuliunda mazingira ya majaribio:

$ 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

Sekunde 12,7 kwa faili 10, sio nzuri sana.

Kwa njia, tunahitaji bendera --color=always: ingawa anageukia ls --color=autoLakini ls hutambua ikiwa haijaunganishwa kwenye terminal (k.m. kwa bomba au kwa uelekezaji upya wa pato) na kulemaza upakaji rangi ikiwa imewekwa auto. Kijana mwerevu.

Kwa hivyo ni nini kinachukua muda mrefu? Tuliangalia na 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: simu 10 lstat(), simu 10 getxattr() (ambayo yote hushindwa kwa sababu mazingira yetu hayana sifa ls inatafuta), simu 10 capget().

Hakika hii inaweza kuboreshwa.

Sifa ya uwezo? Hapana

Kufuata ushauri mdudu kutoka miaka 10 iliyopita, tulijaribu kuzima ukaguzi wa sifa uwezo:

$ 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

Lo, hadi sekunde 8 za kuongeza kasi! Tuliachana na simu hizo zote za gharama getxattr(), na changamoto capget() pia ilipotea, mkuu.

Lakini bado kuna simu hizi za kuudhi lstat(), Ingawa…

Unahitaji maua ngapi?

Kwa hiyo, tuliangalia kwa karibu LS_COLORS.

Kwanza tulizima utofauti huu:

$ 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

Nini!?! Bado sekunde 13?

Inatokea kwamba wakati mazingira ya kutofautiana LS_COLORS moja tu ya vipengele vyake haijafafanuliwa au haipo <type>=color:, hutumia hifadhidata iliyojengwa ndani kwa chaguo-msingi na bado hutumia rangi. Kwa hivyo ikiwa unataka kulemaza uwekaji rangi kwa aina fulani ya faili, unahitaji kuibatilisha nayo <type>=: au <type> 00 katika faili DIR_COLORS.

Baada ya majaribio mengi na makosa, tulipunguza utafutaji wetu hadi hii:

EXEC 00
SETUID 00
SETGID 00
CAPABILITY 00

ambayo imeandikwa kama

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

Hii inamaanisha: usipake rangi faili kwa sifa. uwezo, lakini kidogo kidogo setuid/setgid, wala kwa bendera ya utekelezaji.

Tunaongeza kasi ls

Na ikiwa hutafanya ukaguzi wowote, basi piga simu lstat() kutoweka, na sasa ni jambo tofauti kabisa:

$ 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

Sekunde 0,3 kwenye orodha ya faili 10, rekodi.

Kuanzisha Sherlock

Kutoka sekunde 13 na mipangilio chaguo-msingi hadi sekunde 0,3 na marekebisho madogo LS_COLORS inamaanisha kuongeza kasi ya mara 40 kwa sababu ya kutokuwepo setuid / setgid na faili za rangi zinazoweza kutekelezwa. Sio hasara kubwa kama hiyo.

Bila shaka, hii sasa imesanidiwa katika Sherlock kwa kila mtumiaji.

Lakini ikiwa unataka kurudisha rangi, unaweza kurudi kwa mipangilio chaguo-msingi:

$ unset LS_COLORS

Lakini basi kwenye saraka zilizo na faili nyingi, hakikisha kuwa umetengeneza kahawa wakati inaendesha ls.

Chanzo: mapenzi.com

Kuongeza maoni