Rehefa manafaingana in-40 ny fizotran'ny fiovaovan'ny tontolo iainana

Androany dia te hiresaka momba ny sasany amin'ireo fanavaozana farany indrindra amin'ny rafitra Sherlock [ity dia cluster manana fampisehoana avo lenta ao amin'ny Stanford University - eo ho eo. trans.], izay manafaingana be ny lisitry ny rakitra ao amin'ny lahatahiry miaraka amin'ny fidirana marobe.

Tsy sahala amin'ny lahatsoratra mahazatra, ity dia tatitry ny olon-tsotra kokoa momba ny fomba fiasanay tsy tapaka amin'ny Sherlock mba hitazomana azy amin'ny tsara indrindra ho an'ny mpampiasa anay. Manantena izahay fa hamoaka lahatsoratra bebe kokoa tahaka izao amin'ny ho avy.

Mitaky fotoana ny fanaovana lisitra rakitra maro

Nanomboka tamin'ny fanontaniana fanohanana ara-teknika avy amin'ny mpampiasa iray izany. Nitatitra ny olana momba ny famonoana izy ls maka minitra vitsivitsy ao anaty lahatahiry misy fidirana 15 mahery $SCRATCH [directory ho an'ny rakitra vonjimaika - eo ho eo. lalana].

Ny rakitra an'arivony ao amin'ny lahatahiry iray dia mazΓ na mitondra enta-mavesatra ho an'ny rafi-drakitra ary azo antoka fa tsy soso-kevitra. Fantatry ny mpampiasa izany ary niaiky fa tsy tsara izany, saingy nilaza fa ny lisitra dia 1000 heny haingana kokoa amin'ny solosaina findainy noho ny Sherlock. Mazava ho azy fa nandratra anay izany. Dia nijery lalindalina kokoa izahay.

Satria ls toa tsara

Nijery ny tena ataony izahay ls rehefa mitanisa lahatahiry iray, ary nahoana no maharitra ela ny dingana. Amin'ny ankamaroan'ny fizarana maoderina ls amin'ny alΓ lan'ny default dia mandeha toy ny ls --color=auto, satria samy tia ny loko.

Fa ny loko tsara tarehy dia tonga amin'ny vidiny: ho an'ny rakitra tsirairay ls dia tsy maintsy mahazo fampahalalana momba ny karazana rakitra, ny fahazoan-dΓ lana, ny saina, ny toetra miitatra sy ny toy izany mba hisafidianana ny loko mety.

Vahaolana tsotra iray amin'ny olana dia ny fanafoanana ny loko amin'ny ls tanteraka, fa alaivo sary an-tsaina ny hatezeran'ny mpampiasa. Na ahoana na ahoana dia tsy tokony hanaisotra ny vokatra loko ianao, tsy biby goavam-be izahay.

Dia nijery lalindalina kokoa izahay. ls fampidirana loko amin'ny alΓ lan'ny fari-piainan'ny tontolo iainana LS_COLORS, izay napetraka dircolors(1) mifototra amin'ny fichier configuration dir_colors(5)... Eny, Ny executable dia mamaky ny rakitra fikirakirana mba hamoronana fari-piainana manodidina, izay ampiasain'ny ls avy eo (ary raha tsy fantatrao ny momba ny rakitra varavarana (atao), avy eo dir_colors dia handeha, Na eo aza ny zava-drehetra).

Andeha hojerentsika akaiky

Mba hamaritana izay rafitra loko mahatonga ny fihemorana, dia namorona tontolo andrana izahay:

$ 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 segondra ho an'ny rakitra 10, tsy dia tsara loatra.

Raha ny marina, mila saina isika --color=always: na dia mitodika any ls --color=auto, but ls dia mahita rehefa tsy mifandray amin'ny terminal (oh: amin'ny alalan'ny sodina na miaraka amin'ny fivoahana redirection) ary manakana ny loko raha apetraka auto. Lehilahy mahay.

Inona Γ ry no maharitra? Nijery izahay 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
[...]

Oay: antso 10 lstat(), antso 10 getxattr() (izay tsy mahomby rehetra satria tsy manana ny toetra tadiavin'ny ls ny tontolo iainantsika), antso 10 capget().

Azo antoka fa azo atao tsara izany.

Ny fahaiza-manao? tsia

Manaraka torohevitra bug avy amin'ny 10 taona lasa izay, niezaka nanafoana ny fanamarinana toetra izahay fahaiza-manao:

$ 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

Oay, hatramin'ny 8 segondra ny fanafainganana! Nesorintsika daholo ireo antso lafo vidy ireo getxattr(), ary fanamby capget() nanjavona koa, lehibe.

Saingy mbola misy ireo antso mahasosotra ireo lstat(), Na dia…

Firy ny voninkazo ilainao?

Noho izany dia nijery akaiky kokoa izahay LS_COLORS.

Voalohany dia nesorinay fotsiny ity variable ity:

$ 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

Inona!?! Mbola 13 segondra?

Hita fa rehefa miovaova ny tontolo iainana LS_COLORS iray amin'ireo singa ao aminy ihany no tsy voafaritra na tsy hita <type>=color:, mampiasa ny angon-drakitra naorina amin'ny alΓ lan'ny default izy ary mbola mampiasa loko. Ka raha te hanaisotra ny fandokoana ho an'ny karazana rakitra iray ianao dia mila manafoana izany <type>=: na <type> 00 anaty rakitra DIR_COLORS.

Taorian'ny fisedrana sy fahadisoana maro, dia nahenay ny fikarohanay ho amin'ity:

EXEC 00
SETUID 00
SETGID 00
CAPABILITY 00

izay voasoratra hoe

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

Midika izany hoe: aza mandoko ny rakitra araka ny toetra. fahaiza-manao, fa tsikelikely setuid/setgid, na amin'ny saina executability.

Manafaingana izahay ls

Ary raha tsy manao ny iray amin'ireo fanamarinana ireo ianao, dia miantsoa lstat() hanjavona, ary izao dia raharaha hafa tanteraka:

$ 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 segondra amin'ny lisitry ny rakitra 10, firaketana.

Fametrahana Sherlock

Manomboka amin'ny 13 segondra miaraka amin'ny fanovana default ka hatramin'ny 0,3 segondra miaraka amin'ny fanitsiana kely LS_COLORS midika hoe fanafainganana in-40 noho ny tsy fisiana setuid / setgid ary rakitra azo tanterahana miloko. Tsy fatiantoka lehibe toy izany.

Mazava ho azy fa efa namboarina ao amin'ny Sherlock ho an'ny mpampiasa tsirairay izany.

Fa raha te-hamerina ny fandokoana ianao dia afaka miverina amin'ny toeran'ny default:

$ unset LS_COLORS

Fa avy eo amin'ny lahatahiry misy rakitra be dia be, tandremo tsara ny manao labiera kafe rehefa mandeha ls.

Source: www.habr.com

Add a comment