Kur një variabël mjedisi e përshpejton procesin 40 herë

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 (dhe nëse nuk e dini për skedarët door (do), atëherë dir_colors , pavarësisht gjithçkaje). do të funksionojë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.699s

12.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, por ls detects when it is not connected to the terminal (e.g., over a pipe or with output redirection) and disables coloring if set to auto. 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 një bug 10-vjeçar, përpiqem të çaktivizoj kontrollin e atributit capabilities:

$ 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 00

cili regjistrohet si

LS_COLORS='ex=00:su=00:sg=00:ca=00:'

Kjo do të thotë: mos ngjyros skedarët as sipas atributeve capabilities, as sipas bitëve setuid/setgid, as sipas flagut të ekzekutueshmërisë.

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.029s

0.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

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster