Xa ukuguquguquka kokusingqongileyo kukhawulezisa inkqubo ngamaxesha angama-40

Namhlanje sifuna ukuthetha malunga nohlaziyo lwamva nje lwenkqubo yeSherlock [le liqela elisebenza kakhulu kwiYunivesithi yaseStanford - malunga. trans.], ekhawulezisa ngokuphawulekayo ukudwelisa iifayile kubalawuli abanenani elikhulu lamangeno.

Ngokungafaniyo namanqaku aqhelekileyo, le yingxelo yangaphakathi malunga nendlela esisebenza ngayo rhoqo kwi-Sherlock ukuyigcina isebenza ngokugqibeleleyo kubasebenzisi bethu. Sinethemba lokupapasha amanqaku amaninzi anjengala kwixesha elizayo.

Ukudwelisa iifayile ezininzi kuthatha ixesha

Yonke yaqala ngombuzo wenkxaso yobugcisa obuvela kumsebenzisi. Wachaza ingxaki ukuba ukubulawa ls kuthatha imizuzu embalwa kuluhlu olunongeniso olungaphezulu kwe-15 $SCRATCH [uluhlu lweefayile zethutyana - malunga. indlela].

Amawaka eefayile kulawulo olunye adla ngokubeka umthwalo kwisixokelelwano sefayile kwaye ngokuqinisekileyo ayikhuthazwa. Umsebenzisi uyayazi le nto kwaye wavuma ukuba ayilunganga, kodwa ukhankanye ukuba uluhlu lwamaxesha angama-1000 ngokukhawuleza kwilaptop yakhe kuneSherlock. Kakade ke, oku kwasikhathaza. Ngoko sajonga nzulu.

Kuba ibukeka intle.

Siye sajonga into eyenzayo ngokwenene ls xa udwelisa uvimba weefayili, kwaye kutheni inkqubo ithatha ixesha elide kangaka. Kuninzi lwangoku losasazo ls ngokungagqibekanga isebenza njenge ls --color=auto, kuba wonke umntu uyayithanda imibala.

Kodwa imibala emihle iza ngexabiso: kuyo yonke ifayile ls kufuneka bafumane ulwazi malunga nodidi lwefayile, iimvume zayo, iiflegi, iimpawu ezongeziweyo kunye nezinto ezinjalo ukuze ukhethe umbala ofanelekileyo.

Isisombululo esinye esilula kwingxaki kukukhubaza umbala kwi-ls ngokupheleleyo, kodwa khawucinge ukucaphuka kwabasebenzisi. Ngaphantsi kweemeko akufanele uthabathe imveliso yombala, asikho izilo.

Ngoko sajonga nzulu. ls amangeno anemibala ngemeko-bume eguquguqukayo LS_COLORS, ebekiweyo dircolors(1) ngokusekelwe kwifayile yoqwalaselo dir_colors(5)... Ewe, ephunyeziweyo ifunda ifayile yoqwalaselo ukwenza imo eguquguqukayo, ethi isebenzise (kwaye ukuba awuyazi malunga neefayile emnyango (yenza), emva koko dir_colors izakusebenza, Ngaphandle kwayo yonke into).

Makhe sihlolisise

Ukumisela ukuba loluphi udweliso lombala olubangela ukucotha, senze imeko yovavanyo:

$ 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

Imizuzwana eyi-12,7 yeefayile eziyi-10, ayilunganga kakhulu.

Ngendlela, sifuna iflegi --color=always: nangona ejika kuye ls --color=autokodwa ls ibhaqa xa ingaqhagamshelwanga kwi-terminal (umzekelo. ngombhobho okanye ngolawulo ngokutsha lwemveliso) kwaye ivale umbala ukuba imiselwe auto. Indoda ekrelekrele.

Yintoni ke le ithatha ixesha elide kangaka? Sajonga kunye 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 iminxeba lstat(), 10 iminxeba getxattr() (ezo zisilelayo zonke kuba indawo yethu ayinazo iimpawu ls ikhangelayo), 10 iminxeba capget().

Ngokuqinisekileyo oku kunokwandiswa.

Uphawu lwezakhono? Hayi

Ukulandela icebiso bug kwiminyaka eyi-10 eyadlulayo, sizame ukuvala ukujonga uphawu Amandla:

$ 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

Wowu, ukuya kuthi ga kwimizuzwana eyi-8 yesantya! Sahlukana nazo zonke ezo fowni zidurayo getxattr(), kunye nemingeni capget() yanyamalala nayo, kakhulu.

Kodwa kusekho le minxeba ikruqulayo lstat(), Nangona nje…

Zingaphi iintyatyambo ozifunayo?

Ngoko ke, sihlolisise ngakumbi LS_COLORS.

Okokuqala, sivele sikhubaze oku kuguquguquka:

$ 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

Intoni!?! Isekho imizuzwana eyi-13?

Kuvela ukuba xa imo engqongileyo iyaguquguquka LS_COLORS inye kuphela ielementi yayo engachazwanga okanye engekhoyo <type>=color:, isebenzisa isiseko sedatha esakhelwe-ngaphakathi ngokungagqibekanga kwaye isasebenzisa imibala. Ke ukuba ufuna ukukhubaza ukufakwa kombala kuhlobo oluthile lwefayile, kufuneka ubhale ngaphezulu ngayo <type>=: okanye <type> 00 kwifayile DIR_COLORS.

Emva kovavanyo oluninzi kunye neempazamo, sicuthe uphendlo lwethu ukuya koku:

EXEC 00
SETUID 00
SETGID 00
CAPABILITY 00

ebhalwe njenge

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

Oku kuthetha: musa ukufaka umbala kwiifayile ngophawu loyelelwano. Amandla, kodwa kancinci kancinci setuid/setgid, hayi nge iflegi yokuphunyezwa.

Sikhawuleza ls

Kwaye ukuba awukwenzi nayiphi na kwezi zitsheki, ke iminxeba lstat() inyamalala, kwaye ngoku yinto eyahlukileyo ngokupheleleyo:

$ 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 imizuzwana kuluhlu lweefayile ze-10, irekhodi.

Ukumisela i-Sherlock

Imizuzwana eyi-13 ngoseto olungagqibekanga ukuya kwimizuzwana eyi-0,3 ngokulungiswa okuncinci LS_COLORS kuthetha ukukhawuleza kwe-40 ngenxa yokungabikho setuid / setgid kunye neefayile ezisebenzisekayo ezinemibala. Hayi ilahleko enkulu kangaka.

Ewe kunjalo, oku kuqwalaselwe kwiSherlock kumsebenzisi ngamnye.

Kodwa ukuba ufuna ukubuyisela umbala, unokubuyela ngokulula kuseto olungagqibekanga:

$ unset LS_COLORS

Kodwa ke kubalawuli abaneefayile ezininzi, qiniseka ukwenza ikofu ngelixa isebenza ls.

umthombo: www.habr.com

Yongeza izimvo