Gaur Sherlock sistemaren azken eguneratze batzuei buruz hitz egin nahi dugu [Stanford Unibertsitateko errendimendu handiko kluster bat da - gutxi gorabehera. trans.], horrek nabarmen bizkortzen du fitxategiak zerrendatzea sarrera asko dituzten direktorioetan.
Ohiko artikuluetan ez bezala, hau Sherlock-en aldian-aldian lan egiten dugunari buruzko txosten bat da, gure erabiltzaileentzat hobekien funtzionatzen jarraitzeko. Etorkizunean horrelako artikulu gehiago argitaratzea espero dugu.
Fitxategi asko zerrendatzeak denbora eskatzen du
Erabiltzaile baten laguntza teknikoko galdera batekin hasi zen guztia. Exekuzioaren arazoaren berri eman zuen ls
minutu batzuk hartzen ditu 15 sarrera baino gehiago dituen direktorio batean $SCRATCH
[Aldi baterako fitxategien direktorioa - gutxi gorabehera. erreia].
Direktorio bakarreko milaka fitxategik zama bat ekartzen dute normalean fitxategi-sistemarentzat eta, zalantzarik gabe, ez da gomendagarria. Erabiltzaileak hori bazekien eta onartu zuen ez zela ona, baina zerrenda bere ordenagailu eramangarrian Sherlock baino 1000 aldiz azkarragoa zela aipatu zuen. Noski, horrek min egin zigun. Beraz, sakonago begiratu genuen.
Itxura polita duelako
Benetan zer egiten duen aztertu dugu ls
direktorio bat zerrendatzean, eta zergatik irauten duen prozesuak hainbeste denbora. Banaketa moderno gehienetan ls
modu lehenetsian exekutatzen da ls --color=auto
, denei gustatzen zaielako koloreak.
Baina kolore ederrak prezio bat dauka: fitxategi bakoitzeko ls
fitxategi motari, baimenei, banderak, atributu hedatuak eta antzekoei buruzko informazioa lortu behar du kolore egokia hautatzeko.
Arazoaren irtenbide sinple bat ls-en kolorea guztiz desgaitzea da, baina imajinatu erabiltzaileen haserrea. Inolaz ere ez duzu kolorearen irteerarik kendu behar, ez gara munstroak.
Beraz, sakonago begiratu genuen. ls
kolore-sarrerak ingurune-aldagaiaren bidez LS_COLORS
, ezarrita dagoena dircolors(1)
konfigurazio fitxategian oinarrituta dir_colors(5)
... Bai,
Ikus dezagun hurbilagotik
Zein kolore-eskema moteltzea eragiten duen zehazteko, ingurune esperimental bat sortu dugu:
$ 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 segundo 10 fitxategitarako, ez oso ona.
Bide batez, bandera bat behar dugu
--color=always
: hara jotzen duen arrenls --color=auto
Bainals
terminal batera konektatuta ez dagoenean detektatzen du (adibidez, kanalizazio bidez edo irteerako birbideratzearekin) eta koloreztatzea desgaitzen du aukeran ezartzen bada.auto
. Tipo argia.
Beraz, zer da hainbeste denbora? Begiratu dugu 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
[...]
Aupa: 10 dei lstat()
, 10 dei getxattr()
(guztiek huts egiten dute gure inguruneak ez dituelako ls-k bilatzen dituen atributuak), 10 dei capget()
.
Seguru hori optimizatu daitekeela.
Gaitasunak atributua? Ezetz
Aholkuari jarraituz
$ 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
Aupa, gehienez 8 segundoko azelerazioa! Dei garesti horiek guztiak kendu genituen getxattr()
, eta erronkak capget()
desagertu ere, bikaina.
Baina oraindik badira dei gogaikarri hauek lstat()
, Nahiz etaβ¦
Zenbat lore behar dituzu?
Horregatik, hurbilagotik begiratu dugu LS_COLORS
.
Lehenik eta behin, aldagai hau desgaitu dugu:
$ 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
Zer!?! Oraindik 13 segundo?
Ingurugiroaren aldagaia denean bihurtzen da LS_COLORS
bere elementuetako bat bakarrik ez dago definitu edo falta da <type>=color:
, integratutako datu-basea erabiltzen du lehenespenez eta oraindik koloreak erabiltzen ditu. Beraz, fitxategi mota jakin baterako koloreztatzea desgaitu nahi baduzu, baliogabetu behar duzu <type>=:
edo <type> 00
fitxategian DIR_COLORS
.
Proba eta akats askoren ondoren, gure bilaketa honetara murriztu dugu:
EXEC 00
SETUID 00
SETGID 00
CAPABILITY 00
bezala idatzita dagoena
LS_COLORS='ex=00:su=00:sg=00:ca=00:'
Horrek esan nahi du: ez koloreztatu fitxategiak atributuaren arabera.
, ezta by
Bizkortzen dugu ls
Eta egiaztapen hauetako bat egiten ez baduzu, deitu lstat()
desagertu, eta orain guztiz bestelako kontua da:
$ 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 segundo 10 fitxategiko zerrenda batean, errekor bat.
Sherlock konfiguratzen
13 segundo ezarpen lehenetsiekin 0,3 segundora doikuntza txikiekin LS_COLORS
absentzia dela eta 40 aldiz azelerazioa esan nahi du setuid
/ setgid
eta koloretako fitxategi exekutagarriak. Ez da hain galera handia.
Jakina, hau Sherlock-en konfiguratuta dago erabiltzaile bakoitzarentzat.
Baina kolorea itzuli nahi baduzu, lehenetsitako ezarpenetara itzul zaitezke:
$ unset LS_COLORS
Baina gero fitxategi asko dituzten direktorioetan, ziurtatu kafea prestatzen ari den bitartean ls
.
Iturria: www.habr.com