Lapho okuguquguqukayo kwendawo kusheshisa inqubo izikhathi ezingama-40

Namuhla sifuna ukukhuluma ngezinye zezibuyekezo zakamuva zohlelo lwe-Sherlock [leli yiqoqo elisebenza kahle kakhulu e-Stanford University - cishe. trans.], okusheshisa ngokuphawulekayo ukufakwa kuhlu kwamafayela ezinhlwini zemibhalo ezinenombolo enkulu yokufakiwe.

Ngokungafani nezindatshana ezijwayelekile, lona umbiko womuntu wangaphakathi wokuthi sisebenza kanjani njalo ku-Sherlock ukuze siyigcine isebenza kahle kakhulu kubasebenzisi bethu. Sithemba ukushicilela izindatshana ezengeziwe ezifana nalezi esikhathini esizayo.

Ukufaka kuhlu amafayela amaningi kuthatha isikhathi

Konke kuqale ngombuzo wosekelo oluvela kumsebenzisi. Wabika inkinga ukuthi ukubulawa ls kuthatha imizuzu embalwa ohlwini lwemibhalo olunokufakwayo okungaphezu kuka-15 $SCRATCH [uhla lwemibhalo lwamafayela esikhashana - cishe. umzila].

Izinkulungwane zamafayela kuhla lwemibhalo olulodwa ngokuvamile zibeka umthwalo ohlelweni lwefayela futhi azinconywa neze. Umsebenzisi ukwazile lokhu futhi wavuma ukuthi bekungekuhle, kodwa washo ukuthi ukufakwa kuhlu kwakushesha izikhathi eziyi-1000 kukhompyutha yakhe ephathekayo kuno-Sherlock. Yebo, lokhu kwasilimaza. Ngakho sabheka sajula.

Ngoba ngibukeka muhle

Sibheke ukuthi yenzani ngempela ls lapho kufakwa ohlwini lwemibhalo, nokuthi kungani inqubo ithatha isikhathi eside kangaka. Ekusabalazweni okuningi kwesimanje ls ngokuzenzakalelayo isebenza njenge ls --color=auto, ngoba wonke umuntu uyayithanda imibala.

Kodwa imibala emihle iza ngentengo: kuwo wonke amafayela ls kufanele ithole ulwazi olumayelana nohlobo lwefayela, izimvume zalo, amafulegi, izibaluli ezinwetshiwe nokunye okunjalo ukuze kukhethwe umbala ofanele.

Isixazululo esisodwa esilula senkinga ukukhubaza umbala ku-ls ngokuphelele, kodwa cabanga ukucasuka kwabasebenzisi. Ngaphansi kwezimo akufanele uthathe okukhiphayo kombala, asizona izilo.

Ngakho sabheka sajula. ls imibala efakiwe ngokusebenzisa imvelo variable LS_COLORS, esethiwe dircolors(1) ngokusekelwe kufayela lokumisa dir_colors(5)... Yebo, okusebenzisekayo kufunda ifayela lokumisa ukuze kwakhiwe okuguquguqukayo kwemvelo, okubese kusebenzisa (futhi uma ungazi ngamafayela ngu (yenza), bese kuba yi-dir_colors izosebenza, Naphezu kwakho konke).

Ake sibhekisise

Ukuze sinqume ukuthi yiluphi uhlelo lombala olubangela ukwehla, sidale indawo yokuhlola:

$ 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 engu-12,7 kumafayela angu-10, akukuhle kakhulu.

Ngendlela, sidinga ifulege --color=always: nakuba ephendukela ku ls --color=auto, kodwa ls ithola uma ingaxhumekile kutheminali (isb. ngepayipi noma ngokuqondisa kabusha okukhiphayo) bese ivala umbala uma isethwe ukuze auto. Insizwa ehlakaniphile.

Manje yini ethatha isikhathi eside kangaka? Sabheka ne 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
[...]

Hawu: 10 izingcingo lstat(), izingcingo eziyi-10 getxattr() (konke okuhlulekayo ngoba indawo yethu ayinazo izimfanelo ls ezifunayo), izingcingo eziyi-10 capget().

Impela lokhu kungathuthukiswa.

Isibaluli samakhono? Cha

Ukulandela iseluleko bug kusukela eminyakeni engu-10 edlule, sizame ukukhubaza ukuhlola isibaluli 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

Hawu, kufika kumasekhondi angu-8 wokusheshisa! Sahlukana nazo zonke lezo zingcingo ezibizayo getxattr(), nezinselele capget() yanyamalala futhi, kukhulu.

Kodwa zisekhona lezi zingcingo ezicasulayo lstat(), Nakuba...

Zingaki izimbali ozidingayo?

Ngakho-ke, sabhekisisa LS_COLORS.

Okokuqala simane sikhubaze lokhu okuguquguqukayo:

$ 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

Ini!?! Kuseyimizuzwana engu-13?

Kuvele ukuthi lapho imvelo variable LS_COLORS eyodwa kuphela yezakhi zayo engachazwanga noma engekho <type>=color:, isebenzisa isizindalwazi esakhelwe ngaphakathi ngokuzenzakalelayo futhi isasebenzisa imibala. Ngakho-ke uma ufuna ukukhubaza ukufaka umbala kohlobo oluthile lwefayela, udinga ukulibhala ngaphezulu ngalo <type>=: noma <type> 00 kufayela DIR_COLORS.

Ngemuva kokuzama okuningi namaphutha, sanciphisa ukusesha kwethu kwaba yilokhu:

EXEC 00
SETUID 00
SETGID 00
CAPABILITY 00

okulotshwe ngokuthi

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

Lokhu kusho ukuthi: ungafaki imibala kumafayela ngesibaluli. amandla, kodwa kancane kancane setuid/setgid, noma nge ifulege lokusebenziseka.

Siyasheshisa ls

Futhi uma ungakwenzi noma iyiphi yalezi amasheke, ke izingcingo lstat() zinyamalale, futhi manje indaba ehluke ngokuphelele:

$ 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 ohlwini lwamafayela angu-10, irekhodi.

Isetha i-Sherlock

Ukusuka kumasekhondi angu-13 anezilungiselelo ezizenzakalelayo kuye kumasekhondi angu-0,3 ngokulungiswa okuncane LS_COLORS kusho ukusheshisa okuphindwe ka-40 ngenxa yokungabikho setuid / setgid namafayela asebenzisekayo anombala. Hhayi ukulahlekelwa okukhulu kangaka.

Kunjalo, lokhu manje kulungiselelwe ku-Sherlock kumsebenzisi ngamunye.

Kodwa uma ufuna ukubuyisela umbala, ungavele ubuyele kuzilungiselelo ezizenzakalelayo:

$ unset LS_COLORS

Kodwa-ke kuma-directory anamafayela amaningi, qiniseka ukuthi wenza ikhofi ngenkathi isebenza ls.

Source: www.habr.com

Engeza amazwana