Sot, sot, ne do donimë të flasim për disa nga përditësimet më të fundit të sistemit Sherlock [ky është një kluster me performancë të lartë i Universitetit të Stanfordit - shënim i përkthyesit], të cilat e shpejtojnë ndjeshëm listimin e skedarëve në direktoriumet me numër të madh regjistrimesh.
Ndryshe nga artikujt e zakonshëm, kjo është më shumë një raport i brendshëm mbi punën e rregullt mbi Sherlock, për të mbajtur atë në gjendjen më të mirë për përdoruesit tanë. Shpresojmë të publikojmë më shumë artikuj të tillë në të ardhmen.
Listimi i shumë skedarëve merr kohë
I gjithë ky proces filloi nga një pyetje në mbështetje teknike nga një përdorues. Ai raportoi një problem, se ekzekutimi ls merr disa minuta në një direktorium me më shumë se 15,000 regjistrime në $SCRATCH [direktoriumi për skedarët temporarë - shënim i përkthyesit].
Mijëra skedarë në një direktorium zakonisht krijojnë vështirësi për sistemin e skedarëve dhe kjo definitivisht nuk rekomandohet. Përdoruesi e dinte këtë dhe e pranoi se nuk ishte mirë, por përmendi se në laptopin e tij listimi ekzekutohej 1000 herë më shpejt se në Sherlock. Sigurisht, kjo na preku. Prandaj, ne e shqyrtuam më thellë.
Sepse ls duket bukur
Ne shqyrtuam se çfarë bën realisht ls kur ekzekuton listimin e një direktoriumi dhe pse procesi merr kaq shumë kohë. Në shumicën e distribucioneve moderne ls për default ekzekutohet si ls --color=auto, sepse të gjithëve iu pëlqen ngjyrimi.
Por ngjyrat e bukura kanë një kosto: për çdo skedar ls duhet të merrni informacion mbi llojin e skedarit, lejet e tij, flamujt, atributet e zgjeruara dhe të ngjashme, për të zgjedhur ngjyrën përkatëse.
Një nga zgjidhjet e thjeshta të problemit është të fikni krejt ngjyrat në ls, por imagjinoni zemërimin e përdoruesve. Në asnjë mënyrë nuk duhet të heqim daljen me ngjyra, nuk jemi monsterë.
Prandaj, ne e shqyrtuam më thellë. ls përdor ngjyrat përmes variablës ambientale LS_COLORS, e cila përcaktohet nga dircolors(1) në bazë të skedarit të konfigurimit dir_colors(5). Po,skedari ekzekutiv lexon skedarin e konfigurimit për të krijuar variablën ambientale, që pastaj e përdor ls door , pavarësisht gjithçkaje). Le të shqyrtojmë më hollësisht
Për të përcaktuar se cila nga skemat e ngjyrosjes shkakton ngadalësimin, ne krijuam një mjedis eksperimental:
$ mkdir $SCRATCH/dont $ touch $SCRATCH/dont/{1..10000} # mos e provoni këtë në shtëpi! $ time ls --color=always $SCRATCH/dont | wc -l 10000real 0m12.758s user 0m0.104s sys 0m0.699s
$ 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.699s12.7 sekonda për 10,000 skedha, nuk është shumë mirë.
Për më tepër, nevojitet një flamur
--color=always: megjithatë ai konverton nëls --color=auto, porlsdetects when it is not connected to the terminal (e.g., over a pipe or with output redirection) and disables coloring if set toauto. Djalë i zgjuar.
Por, çfarë zë kaq shumë kohë? Ne e shqyrtuam me strace:
$ strace -c ls --color=always $SCRATCH/dont | wc -l
10000
% koha sekonda usecs/call thirrje gabime 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,000 thirrje lstat(), 10,000 thirrje getxattr() (të cilat të gjitha dështojnë, sepse në mjedisin tonë nuk ka atribute që kërkon ls), 10,000 thirrje capget().
Sigurisht që kjo mund të optimizohet.
Atributi i mundësive? Jo.
Duke ndjekur këshillat e , përpiqem të çaktivizoj kontrollin e atributit :
$ eval $(dircolors -b | sed s/ca=[^:]*:/ca=:)
$ time strace -c ls --color=always $SCRATCH/dont | wc -l
10000
% koha sekonda usecs/call thirrje gabime 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, përshpejtimi deri në 8 sekonda! Ne u shpëtuam nga të gjitha këto thirrje të shtrenjta getxattr(), dhe thirrjet capget() në të njëjtën mënyrë zhduken, shkëlqyeshëm.
Por ende janĂ« kĂ«to thirrje tĂ« mĂ«rzitshme lstat(), megjithatĂ«âŠ
Sa ngjyra nevojiten?
Prandaj, ne shqyrtuam më në hollësi LS_COLORS.
Fillimisht thjesht çaktivizuam këtë variabël:
$ 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
ĂfarĂ«!?! Akoma 13 sekonda?
Duket se, kur variabla e ambientit LS_COLORS nuk është e përcaktuar ose mungon vetëm një nga elementët e saj =color:, atëherë ajo për default përdor bazën e dhënave të ingranuar dhe akoma përdor ngjyrat. Prandaj, nëse dëshiron të çaktivizosh ngjyrat për një tip të caktuar skedari, duhet ta mbishkruash atë me =: ose 00 në skedarin DIR_COLORS.
Pasi bëmë shumë prova dhe gabime, arritëm të ngushtojmë kërkimin tonë deri këtu:
EXEC 00
SETUID 00
SETGID 00
CAPABILITY 00cili regjistrohet si
LS_COLORS='ex=00:su=00:sg=00:ca=00:' Kjo do të thotë: mos ngjyros skedarët as sipas atributeve , as sipas bitëve , as sipas .
Përshpejtojmë ls
Dhe nëse nuk kalojmë asnjë nga këto kontrolle, atëherë thirrjet lstat() dissapear, dhe tani është një tjetër histori:
$ 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.029s0.3 sekonda për një listë me 10,000 skedarë, rekord.
Konfigurojmë Sherlock
Nga 13 sekonda me cilësimet e preçaktuara deri në 0.3 sekonda me një konfigurim të vogël LS_COLORS do të thotë një përshpejtim 40-fish për shkak të mungesës së setuid / setgid dhe skedarët ekzekutues me ngjyra. Një humbje e vogël.
Sigurisht, tani është e konfiguruar në Sherlock për çdo përdorues.
Por nëse dëshironi të ktheni ngjyrat, mund të ktheheni thjesht në cilësimet e parazgjedhura:
$ unset LS_COLORS Por atëherë, në katalogët me shumë skedarë, mos harroni të bëni kafe, derisa të funksionojë. ls.
Burimi: habr.com
