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,
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 anageukials --color=auto
Lakinils
hutambua ikiwa haijaunganishwa kwenye terminal (k.m. kwa bomba au kwa uelekezaji upya wa pato) na kulemaza upakaji rangi ikiwa imewekwaauto
. 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
$ 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.
, wala kwa
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