Sot duam të flasim për disa nga përditësimet më të fundit të sistemit Sherlock [ky është një grup me performancë të lartë në Universitetin Stanford - përafërsisht. trans.], të cilat përshpejtojnë ndjeshëm renditjen e skedarëve në drejtoritë me një numër të madh hyrjesh.
Ndryshe nga artikujt e zakonshëm, ky është më shumë një raport i brendshëm se si ne punojmë rregullisht në Sherlock për ta mbajtur atë të funksionojë sa më mirë për përdoruesit tanë. Shpresojmë të publikojmë më shumë artikuj të tillë në të ardhmen.
Renditja e shumë skedarëve kërkon kohë
E gjitha filloi me një pyetje për mbështetje teknike nga një përdorues. Ai raportoi problemin se ekzekutimi ls
merr disa minuta në një drejtori me mbi 15 hyrje $SCRATCH
[Direktoria për skedarët e përkohshëm - përafërsisht. korsi].
Mijëra skedarë në një direktori zakonisht përbëjnë një barrë për sistemin e skedarëve dhe definitivisht nuk rekomandohet. Përdoruesi e dinte këtë dhe pranoi se nuk ishte mirë, por përmendi se listimi ishte 1000 herë më i shpejtë në laptopin e tij sesa Sherlock. Natyrisht, kjo na ka lënduar. Kështu që ne shikuam më thellë.
Sepse duket bukur
Ne shikuam se çfarë bën në të vërtetë ls
kur renditni një drejtori dhe pse procesi zgjat kaq shumë. Në shumicën e shpërndarjeve moderne ls
si parazgjedhje funksionon si ls --color=auto
, sepse ngjyrat i pëlqejnë të gjithëve.
Por ngjyrat e bukura kanë një çmim: për çdo skedar ls
duhet të marrë informacion në lidhje me llojin e skedarit, lejet e tij, flamujt, atributet e zgjeruara dhe të ngjashme për të zgjedhur ngjyrën e duhur.
Një zgjidhje e thjeshtë për problemin është çaktivizimi i ngjyrave në ls, por imagjinoni zemërimin e përdoruesve. Në asnjë rrethanë nuk duhet të hiqni prodhimin e ngjyrave, ne nuk jemi përbindësha.
Kështu që ne shikuam më thellë. ls
hyrjet e ngjyrave nëpërmjet ndryshores së mjedisit LS_COLORS
, e cila është vendosur dircolors(1)
bazuar në skedarin e konfigurimit dir_colors(5)
. Po,
Le të hedhim një vështrim më të afërt
Për të përcaktuar se cila skemë ngjyrash shkakton ngadalësimin, ne krijuam një mjedis eksperimental:
$ 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 sekonda për 10 skedarë, jo shumë mirë.
Meqë ra fjala, na duhet një flamur
--color=always
: edhe pse i kthehetls --color=auto
Porls
zbulon kur nuk është i lidhur me një terminal (p.sh. me tub ose me ridrejtim të daljes) dhe çaktivizon ngjyrosjen nëse vendoset nëauto
. Djalë i zgjuar.
Pra, çfarë po zgjat kaq shumë? Ne shikuam me 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 thirrje lstat()
, 10 000 thirrje getxattr()
(të cilat të gjitha dështojnë sepse mjedisi ynë nuk i ka atributet që kërkon), 10 telefonata capget()
.
Sigurisht që kjo mund të optimizohet.
Atributi i aftësive? Jo
Duke ndjekur këshillën
$ 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, deri në 8 sekonda përshpejtim! Ne i hoqëm të gjitha ato thirrje të shtrenjta getxattr()
, dhe sfidat capget()
u zhduk gjithashtu, shkëlqyeshëm.
Por ka ende këto thirrje të bezdisshme lstat()
, Edhe pse…
Sa lule ju duhen?
Prandaj, ne hodhëm një vështrim më të afërt LS_COLORS
.
Së pari ne 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ë!?! Edhe 13 sekonda?
Rezulton se kur ndryshorja e mjedisit LS_COLORS
vetëm një nga elementet e tij nuk është përcaktuar ose mungon <type>=color:
, ai përdor bazën e të dhënave të integruar si parazgjedhje dhe ende përdor ngjyrat. Pra, nëse doni të çaktivizoni ngjyrosjen për një lloj skedari të caktuar, duhet ta anashkaloni atë <type>=:
ose <type> 00
në dosje DIR_COLORS
.
Pas shumë provash dhe gabimesh, ne e ngushtuam kërkimin tonë në këtë:
EXEC 00
SETUID 00
SETGID 00
CAPABILITY 00
e cila shkruhet si
LS_COLORS='ex=00:su=00:sg=00:ca=00:'
Kjo do të thotë: mos i ngjyrosni skedarët sipas atributeve.
, as nga
Ne shpejtojmë ls
Dhe nëse nuk bëni asnjë nga këto kontrolle, atëherë telefononi lstat()
zhduken, dhe tani është një çështje krejtësisht tjetër:
$ 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 sekonda në një listë prej 10 skedarësh, një rekord.
Vendosja e Sherlock
Nga 13 sekonda me cilësimet e paracaktuara në 0,3 sekonda me rregullime të vogla LS_COLORS
nënkupton një nxitim 40-fish për shkak të mungesës setuid
/ setgid
dhe skedarë të ekzekutueshëm me ngjyra. Jo një humbje kaq e madhe.
Sigurisht, kjo tani është konfiguruar në Sherlock për çdo përdorues.
Por nëse doni të ktheni ngjyrosjen, thjesht mund të ktheheni në cilësimet e paracaktuara:
$ unset LS_COLORS
Por më pas, në drejtoritë me shumë skedarë, sigurohuni që të krijoni kafe gjatë kohës që është në punë ls
.
Burimi: www.habr.com