Karon gusto namong hisgutan ang pipila sa pinakabag-o nga mga update sa sistema sa Sherlock [kini usa ka high-performance cluster sa Stanford University - gibanabana. trans.], nga makapadali sa paglista sa mga file sa mga direktoryo nga adunay daghang mga entry.
Dili sama sa regular nga mga artikulo, kini labaw pa sa usa ka insider's report kung giunsa namon kanunay nga nagtrabaho sa Sherlock aron mapadayon kini nga molihok sa labing kaayo alang sa among mga tiggamit. Kami nanghinaut nga makamantala ug daghang mga artikulo nga sama niini sa umaabot.
Ang paglista sa daghang mga file nagkinahanglag panahon
Nagsugod ang tanan sa usa ka teknikal nga suporta nga pangutana gikan sa usa ka tiggamit. Gitaho niya ang problema nga ang pagpatay ls
nagkinahanglan og pipila ka minuto sa usa ka direktoryo nga adunay kapin sa 15 ka mga entry $SCRATCH
[direktoryo para sa temporaryo nga mga file - gibanabana. lane].
Liboan ka mga file sa usa ka direktoryo kasagarang nagpabug-at sa sistema sa file ug siguradong dili girekomenda. Ang user nahibalo niini ug miangkon nga kini dili maayo, apan naghisgot nga ang listahan mao ang 1000 ka beses nga mas paspas sa iyang laptop kay sa Sherlock. Siyempre, kini nakapasakit kanamo. Maong nagtan-aw mig lawom.
Kay nindot tan-awon si ls
Gitan-aw namon kung unsa gyud ang gibuhat niini ls
kung naglista sa usa ka direktoryo, ug ngano nga ang proseso dugay kaayo. Sa kadaghanan sa modernong mga pag-apod-apod ls
pinaagi sa default kini midagan ingon ls --color=auto
, tungod kay ang tanan ganahan sa mga kolor.
Apan ang matahum nga mga kolor moabut sa usa ka presyo: alang sa matag file ls
kinahanglang makakuha ug impormasyon bahin sa tipo sa payl, mga permiso niini, mga bandera, gipalapdan nga mga hiyas ug uban pa aron mapili ang angay nga kolor.
Usa ka yano nga solusyon sa problema mao ang pag-disable sa kolor sa ls sa tanan, apan hunahunaa ang kasuko sa mga tiggamit. Sa bisan unsang kahimtang kinahanglan nimo nga kuhaon ang kolor nga output, dili kami mga monsters.
Maong nagtan-aw mig lawom. ls
mga kolor nga entry pinaagi sa environment variable LS_COLORS
, nga gitakda dircolors(1)
base sa configuration file dir_colors(5)
. Oo,
Atong tan-awon pag-ayo
Aron mahibal-an kung unsang laraw sa kolor ang hinungdan sa paghinay, naghimo kami usa ka eksperimento nga palibot:
$ 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 segundos alang sa 10 ka mga file, dili kaayo maayo.
Pinaagi sa dalan, kinahanglan namon ang usa ka bandila
--color=always
: bisag molingi siya sals --color=auto
, apanls
nakamatikod kung wala kini konektado sa usa ka terminal (pananglitan pinaagi sa tubo o adunay pag-redirect sa output) ug gipugngan ang pagkolor kung itakda saauto
. Maalamon nga lalaki.
Busa unsa ang nagdugay? Nangita mi uban 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 ka tawag lstat()
, 10 ka tawag getxattr()
(nga ang tanan napakyas tungod kay ang atong palibot walay mga hiyas nga gipangita), 10 ka tawag capget()
.
Sigurado nga mahimo kini nga ma-optimize.
Atribut sa kapabilidad? dili
Pagsunod sa tambag
$ 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, hangtod sa 8 segundos nga pagpatulin! Among gitangtang ang tanang mahal nga mga tawag getxattr()
, ug mga hagit capget()
nawala usab, maayo.
Apan aduna gihapoy makalagot nga mga tawag lstat()
, Bisanβ¦
Pila ka bulak ang imong gikinahanglan?
Busa, among gisusi pag-ayo LS_COLORS
.
Una namong gi-disable kini nga variable:
$ 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
Unsa!?! 13 segundos pa?
Kini turns nga sa diha nga ang palibot variable LS_COLORS
usa lang sa mga elemento niini ang wala gihubit o nawala <type>=color:
, kini naggamit sa built-in nga database pinaagi sa default ug naggamit gihapon og mga kolor. Mao nga kung gusto nimo i-disable ang colorization alang sa usa ka tipo sa file, kinahanglan nimo nga i-override kini <type>=:
o <type> 00
sa file DIR_COLORS
.
Human sa daghang pagsulay ug kasaypanan, gipakunhod namo ang among pagpangita niini:
EXEC 00
SETUID 00
SETGID 00
CAPABILITY 00
nga gisulat ingon
LS_COLORS='ex=00:su=00:sg=00:ca=00:'
Kini nagpasabot: ayaw kolori ang mga file pinaagi sa attribute.
, ni sa
Nagdali mi ls
Ug kung dili nimo buhaton ang bisan unsang mga tseke, dayon tawagan lstat()
mawala, ug karon lahi na nga butang:
$ 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 segundos sa usa ka lista sa 10 ka mga file, usa ka rekord.
Pag-set up sa Sherlock
Gikan sa 13 segundos nga adunay default nga mga setting hangtod sa 0,3 segundos nga adunay gagmay nga mga pagbag-o LS_COLORS
nagpasabot ug 40 ka pilo nga pagpatulin tungod sa pagkawala setuid
/ setgid
ug mga dekolor nga executable nga mga file. Dili ingon ka dako nga kapildihan.
Siyempre, kini karon gi-configure sa Sherlock alang sa matag tiggamit.
Apan kung gusto nimo ibalik ang pagkolor, mahimo ra nimo ibalik ang mga default setting:
$ unset LS_COLORS
Apan unya sa mga direktoryo nga adunay daghang mga file, siguruha nga magtimpla og kape samtang kini nagdagan ls
.
Source: www.habr.com