Inguruko aldagai batek prozesua 40 aldiz bizkortzen duenean

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, exekutagarriak konfigurazio fitxategia irakurtzen du ingurune-aldagai bat sortzeko, gero ls-k erabiltzen duena (eta fitxategiei buruz ezagutzen ez baduzu atea (egin), gero dir_colors funtzionatuko du, Dena gorabehera).

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 arren ls --color=autoBaina ls 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 duela 10 urteko akatsa, atributuen egiaztapena desgaitzen saiatu gara gaitasun:

$ 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. gaitasun, baina pixkanaka setuid/setgid, ezta by exekutagarritasun bandera.

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

Gehitu iruzkin berria