Når en miljøvariabel fremskynder prosessen med 40 ganger

I dag ønsker vi å snakke om noen av de siste oppdateringene til Sherlock-systemet [dette er en høyytelsesklynge ved Stanford University - ca. trans.], noe som gir en betydelig raskere oppføring av filer i kataloger med et stort antall oppføringer.

I motsetning til vanlige artikler, er dette mer en insider-rapport om hvordan vi regelmessig jobber med Sherlock for å holde den i gang på sitt beste for brukerne våre. Vi håper å publisere flere slike artikler i fremtiden.

Å liste opp mange filer tar tid

Det hele startet med et teknisk støttespørsmål fra en bruker. Han rapporterte problemet med henrettelsen ls tar noen minutter i en katalog med over 15 000 oppføringer $SCRATCH [katalog for midlertidige filer - ca. kjørefelt].

Tusenvis av filer i én katalog utgjør vanligvis en byrde for filsystemet og anbefales definitivt ikke. Brukeren visste dette og innrømmet at det ikke var bra, men nevnte at oppføringen var 1000 ganger raskere på den bærbare datamaskinen hans enn Sherlock. Selvfølgelig skadet dette oss. Så vi så dypere.

Fordi det ser fint ut

Vi så på hva det faktisk gjør ls når du legger opp en katalog, og hvorfor prosessen tar så lang tid. På de fleste moderne distribusjoner ls som standard kjører den som ls --color=auto, fordi alle liker fargene.

Men vakre farger har en pris: for hver fil ls må innhente informasjon om filtypen, dens tillatelser, flagg, utvidede attributter og lignende for å velge riktig farge.

En enkel løsning på problemet er å deaktivere farger i ls helt, men forestill deg brukernes harme. Under ingen omstendigheter bør du ta bort fargeutskriften, vi er ikke monstre.

Så vi så dypere. ls farger oppføringer via miljøvariabel LS_COLORS, som er satt dircolors(1) basert på konfigurasjonsfilen dir_colors(5)... Ja, den kjørbare leser konfigurasjonsfilen for å lage en miljøvariabel, som deretter bruker (og hvis du ikke vet om filer dør (do), deretter dir_colors skal jobbe, Til tross for alt).

La oss ta en nærmere titt

For å finne ut hvilket fargeskjema som forårsaker nedgangen, har vi laget et eksperimentelt miljø:

$ 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 sekunder for 10 000 filer, ikke veldig bra.

Vi trenger forresten et flagg --color=always: selv om han snur seg til ls --color=autoMen ls oppdager når den ikke er koblet til en terminal (f.eks. med rør eller med utgangsomdirigering) og deaktiverer farging hvis satt til auto. Flink fyr.

Så hva tar så lang tid? Vi så med 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 000 anrop lstat(), 10 000 samtaler getxattr() (som alle mislykkes fordi miljøet vårt ikke har egenskapene jeg leter etter), 10 000 samtaler capget().

Dette kan sikkert optimaliseres.

Egenskaper? Nei

Følger råd feil fra 10 år siden, vi prøvde å deaktivere attributtkontroll evner:

$ 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, opptil 8 sekunders akselerasjon! Vi ble kvitt alle de dyre samtalene getxattr(), og utfordringer capget() forsvant også, flott.

Men det er fortsatt disse irriterende samtalene lstat(), Selv om…

Hvor mange blomster trenger du?

Derfor tok vi en nærmere titt LS_COLORS.

Først deaktiverte vi denne variabelen:

$ 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

Hva!?! Fortsatt 13 sekunder?

Det viser seg at når miljøvariabelen LS_COLORS bare ett av elementene er ikke definert eller mangler <type>=color:, bruker den den innebygde databasen som standard og bruker fortsatt farger. Så hvis du vil deaktivere fargelegging for en bestemt filtype, må du overstyre den med <type>=: eller <type> 00 i fil DIR_COLORS.

Etter mye prøving og feiling begrenset vi søket vårt til dette:

EXEC 00
SETUID 00
SETGID 00
CAPABILITY 00

som er skrevet som

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

Dette betyr: ikke fargelegg filer etter attributt. evner, men litt etter litt setuid/setgid, verken av kjørbarhetsflagg.

Vi setter fart ls

Og hvis du ikke gjør noen av disse kontrollene, ringer du lstat() forsvinne, og nå er det en helt annen sak:

$ 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 sekunder på en liste med 10 000 filer, rekord.

Setter opp Sherlock

Fra 13 sekunder med standardinnstillinger til 0,3 sekunder med mindre justeringer LS_COLORS betyr 40 ganger akselerasjon på grunn av fraværet setuid / setgid og fargede kjørbare filer. Ikke så stort tap.

Selvfølgelig er dette nå konfigurert i Sherlock for hver bruker.

Men hvis du vil returnere fargen, kan du ganske enkelt gå tilbake til standardinnstillingene:

$ unset LS_COLORS

Men på kataloger med mange filer, sørg for å brygge kaffe mens den kjører ls.

Kilde: www.habr.com

Legg til en kommentar