Kur një variabël mjedisor e përshpejton procesin me 40 herë

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, ekzekutuesi lexon skedarin e konfigurimit për të krijuar një variabël mjedisi, të cilin më pas ls e përdor (dhe nëse nuk dini për skedarët derë (bëj), pastaj dir_colors do të funksionojë, Pavarësisht gjithçkaje).

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 kthehet ls --color=autoPor ls 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 gabim nga 10 vjet më parë, ne u përpoqëm të çaktivizonim kontrollin e atributeve aftësitë:

$ 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. aftësitë, por pak nga pak setuid/setgid, as nga flamuri i ekzekutueshmërisë.

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

Shto një koment