Marka doorsoomaha deegaanku uu dedejiyo hawsha 40 jeer

Maanta waxaan rabnaa inaan ka hadalno qaar ka mid ah cusbooneysiinta ugu dambeysay ee nidaamka Sherlock [tani waa koox wax qabad sare leh oo ka tirsan Jaamacadda Stanford - qiyaastii. trans.], taas oo si weyn u dedejisa liiska faylalka hagayaasha leh tiro badan oo la galiyay.

Si ka duwan maqaallada caadiga ah, tani waa warbixin dheeraad ah oo ku saabsan sida aan si joogto ah uga shaqeyno Sherlock si aan ugu sii wadno sida ugu fiican isticmaalayaashayada. Waxaan rajeyneynaa inaan daabacno maqaalo badan oo sidan oo kale ah mustaqbalka.

Liistada faylal badan waxay qaadataa waqti

Dhammaantood waxay ku bilaabeen su'aal taageero farsamo oo ka timid isticmaale. Waxa uu ka warbixiyey dhibaatada uu ku hayo xukunka ls waxay ku qaadataa dhowr daqiiqo buug hage ah oo ay ku jiraan in ka badan 15 oo la soo galiyay $SCRATCH [tusaha faylasha ku meel gaadhka ah - qiyaastii. waddo].

Kumanaan faylal ah oo ku jira hal buug ayaa inta badan culays ku ah nidaamka faylka oo runtii laguma talinayo. Isticmaaluhu wuu ogaa tan oo wuxuu qirtay inaysan wanaagsanayn, laakiin wuxuu xusay in liisku 1000 jeer ka dhaqso badan yahay laptopkiisa Sherlock. Dabcan, tani way na dhaawacday. Markaa si qoto dheer ayaan u eegnay.

Sababtoo ah ls waxay u egtahay mid fiican

Waxaan eegnay waxa ay dhab ahaantii qabato ls markaad taxayso hagaha, iyo sababta hawshu u qaadanayso waqti dheer. Inta badan qaybinta casriga ah ls Sida caadiga ah waxay u socotaa sidii ls --color=auto, sababtoo ah qof kastaa wuu jecel yahay midabada.

Laakiin midabada quruxda badani waxay ku yimaadaan qiimo: fayl kasta ls waa in la helaa macluumaadka ku saabsan nooca faylka, ogolaanshihiisa, calamada, sifooyinka la dheereeyey iyo wixii la mid ah si loo doorto midabka ku habboon.

Mid ka mid ah xalalka fudud ee dhibaatada ayaa ah in la joojiyo midabka guud ahaan, laakiin qiyaas carada isticmaalayaasha. Xaaladna ma aha inaad iska saarto wax soo saarka midabka, ma nihin xayawaan.

Markaa si qoto dheer ayaan u eegnay. ls gelinta midabada iyadoo loo marayo doorsoomka deegaanka LS_COLORS, kaas oo la dhigay dircolors(1) ku salaysan faylka qaabeynta dir_colors(5). Haa, Fududeeyaha wuxuu akhriyaa faylka qaabeynta si uu u abuuro doorsoome deegaan, kaas oo ls markaa isticmaalo (iyo haddii aadan aqoonin faylalka albaabka (samayn), ka dibna dir_midab shaqayn doona, Inkastoo wax walba).

Aan si hoose u eegno

Si loo go'aamiyo nidaamka midabka keena hoos u dhaca, waxaanu abuurnay jawi tijaabo ah:

$ 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 ilbiriqsi 10 oo fayl ah, ma fiicna.

Dhanka kale, waxaan u baahanahay calan --color=always: inkastoo uu u soo jeestay ls --color=auto, laakiin ls wuxuu ogaadaa marka aan lagu xidhin terminaalka (tusaale tuubooyin ama jihaynta wax soo saarka) oo wuxuu baabi'iyaa midabaynta haddii lagu rakibo auto. Nin xariif ah.

Haddaba maxaa waqti dheer qaadanaya? Waanu eegnay 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 wicitaan lstat(), 10 wicitaan getxattr() (kuwaas oo dhamaantood guul daraystay sababtoo ah deegaankeenu ma laha sifooyinka ls ay raadinayso), 10 wicitaan capget().

Hubaal tani waa la hagaajin karaa

Sifada kartida? Maya

Talo raac cayayaanka 10 sano ka hor, waxaanu isku daynay inaanu joojino hubinta sifada Awoodaha:

$ 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, ilaa 8 ilbiriqsi oo dardargelin ah! Waxaan ka takhalusnay dhammaan wicitaannadaas qaaliga ah getxattr(), iyo caqabadaha capget() la waayay sidoo kale, weyn.

Laakiin waxaa weli jira baaqyadan dhibsada lstat(), Inkastoo…

Immisa ubax ayaad u baahan tahay?

Sidaa darteed, waxaan si qoto dheer u eegnay LS_COLORS.

Marka hore waxaanu si fudud u curyaaminay doorsoomahan:

$ 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

Waa maxay!?! Weli 13 ilbiriqsi?

Waxaa soo baxday in marka doorsoom deegaanka LS_COLORS Mid kaliya oo ka mid ah curiyeheeda ayaan la qeexin ama maqan <type>=color:, waxay u isticmaashaa kaydka ku dhex jira si caadi ah oo wali waxay isticmaashaa midabyo. Markaa haddii aad rabto inaad curyaamiso midabaynta nooc fayl gaar ah, waxaad u baahan tahay inaad ku tirtirto <type>=: ama <type> 00 faylka ku jira DIR_COLORS.

Tijaabooyin badan iyo khaladaad badan ka dib, waxaan ku soo koobnay raadintayadii sidan:

EXEC 00
SETUID 00
SETGID 00
CAPABILITY 00

oo u qoran sida

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

Tani waxay ka dhigan tahay: ha midabayn faylasha sifo. Awoodaha, laakiin xoogaa xoogaa ah setuid/setgid, midna ma aha calanka fulinta.

Waanu dedejinaynaa ls

Oo haddii aadan samayn mid ka mid ah jeegaga, markaas wac lstat() baaba'a, oo hadda waa arrin gebi ahaanba ka duwan:

$ 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 ilbiriqsi ee liiska 10 oo faylal, rikoor.

Dejinta Sherlock

Laga bilaabo 13 ilbiriqsi oo leh jaangooyo default ah ilaa 0,3 sekan oo leh hagaajin yar LS_COLORS macneheedu waa dardar 40 laabma maqnaanshaha awgeed setuid / setgid iyo faylal la fulin karo oo midab leh. Ma aha khasaare sidaas u weyn.

Dabcan, kan hadda waxaa lagu habeeyay Sherlock isticmaale kasta.

Laakiin haddii aad rabto inaad soo celiso midabaynta, waxaad si fudud ugu noqon kartaa goobaha caadiga ah:

$ unset LS_COLORS

Laakin ka dib hagaha hagayaasha leh faylal badan, iska hubi inaad kariso kafeega inta uu socdo ls.

Source: www.habr.com

Add a comment