Kung ang usa ka variable sa palibot nagpadali sa proseso sa 40 ka beses

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, gibasa sa executable ang configuration file aron makamugna og environment variable, nga gamiton dayon (ug kung wala ka kahibalo bahin sa mga file pultahan (buhata), unya dir_colors motrabaho, Bisan pa sa tanan).

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 sa ls --color=auto, apan ls 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 sa auto. 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 bug gikan sa 10 ka tuig na ang milabay, gisulayan namo nga i-disable ang attribute checking Kapabilidad:

$ 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. Kapabilidad, pero sa hinayhinay setuid/setgid, ni sa executability nga bandila.

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

Idugang sa usa ka comment