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,
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 kuls --color=auto
, kodwals
ithola uma ingaxhumekile kutheminali (isb. ngepayipi noma ngokuqondisa kabusha okukhiphayo) bese ivala umbala uma isethwe ukuzeauto
. 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
$ 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.
, noma nge
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