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,
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 anyls --color=auto
, butls
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 apetrakaauto
. 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
$ 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.
, na amin'ny
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