Når en miljøvariabel fremskynder processen med 40 gange

I dag vil vi tale om nogle af de seneste opdateringer til Sherlock-systemet [dette er en højtydende klynge på Stanford University - ca. trans.], hvilket markant fremskynder registrering af filer i mapper med et stort antal poster.

I modsætning til almindelige artikler er dette mere en insider-rapport om, hvordan vi regelmæssigt arbejder på Sherlock for at holde det kørende på sit bedste for vores brugere. Vi håber at publicere flere artikler som denne i fremtiden.

At liste mange filer tager tid

Det hele startede med et teknisk supportspørgsmål fra en bruger. Han rapporterede problemet med henrettelsen ls tager et par minutter i en mappe med over 15 poster i $SCRATCH [mappe til midlertidige filer - ca. bane].

Tusindvis af filer i en mappe udgør normalt en byrde for filsystemet og anbefales bestemt ikke. Brugeren vidste dette og indrømmede, at det ikke var godt, men nævnte, at noteringen var 1000 gange hurtigere på hans bærbare computer end Sherlock. Selvfølgelig gjorde dette ondt på os. Så vi kiggede dybere.

Fordi det ser godt ud

Vi kiggede på, hvad det rent faktisk gør ls når du angiver en mappe, og hvorfor processen tager så lang tid. På de fleste moderne distributioner ls som standard kører den som ls --color=auto, fordi alle kan lide farverne.

Men smukke farver har en pris: for hver fil ls skal indhente oplysninger om filtypen, dens tilladelser, flag, udvidede attributter og lignende for at kunne vælge den passende farve.

En simpel løsning på problemet er at deaktivere farve i ls helt, men forestil dig brugernes forargelse. Du bør under ingen omstændigheder fjerne farveoutputtet, vi er ikke monstre.

Så vi kiggede dybere. ls farver indtastninger via miljøvariabel LS_COLORS, som er indstillet dircolors(1) baseret på konfigurationsfil dir_colors(5). Ja, den eksekverbare læser konfigurationsfilen for at skabe en miljøvariabel, som derefter bruger (og hvis du ikke kender til filer dør (do), derefter dir_colors det vil virke, Trods alt).

Lad os se nærmere

For at afgøre, hvilket farveskema der forårsager afmatningen, har vi oprettet 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 filer, ikke særlig godt.

Vi har i øvrigt brug for et flag --color=always: selvom han vender sig til ls --color=autoMen ls registrerer, når den ikke er forbundet til en terminal (f.eks. via rør eller med udgangsomdirigering) og deaktiverer farvning, hvis den er indstillet til auto. Klog fyr.

Så hvad tager så lang tid? Vi kiggede 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 opkald lstat(), 10 opkald getxattr() (som alle mislykkes, fordi vores miljø ikke har de egenskaber, jeg leder efter), 10 opkald capget().

Dette kan helt sikkert optimeres.

Egenskaber? Nix

Efter råd fejl fra 10 år siden, vi forsøgte at deaktivere attributkontrol kapaciteter:

$ 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, op til 8 sekunders acceleration! Vi slap for alle de dyre opkald getxattr()og udfordringer capget() forsvandt også, fantastisk.

Men der er stadig disse irriterende opkald lstat(), Selvom…

Hvor mange blomster har du brug for?

Derfor kiggede vi nærmere LS_COLORS.

Først deaktiverede vi simpelthen denne variabel:

$ 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

Hvad!?! Stadig 13 sekunder?

Det viser sig, at når miljøvariablen LS_COLORS kun et af dets elementer er ikke defineret eller mangler <type>=color:, den bruger som standard den indbyggede database og bruger stadig farver. Så hvis du vil deaktivere farvelægning for en bestemt filtype, skal du tilsidesætte den med <type>=: eller <type> 00 i fil DIR_COLORS.

Efter en masse forsøg og fejl, indsnævrede vi vores søgning til dette:

EXEC 00
SETUID 00
SETGID 00
CAPABILITY 00

som er skrevet som

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

Det betyder: ikke farve filer efter attribut. kapaciteter, men lidt efter lidt setuid/setgid, hverken af eksekverbarhedsflag.

Vi speeder op ls

Og hvis du ikke laver nogen af ​​disse kontroller, så ringer lstat() forsvinde, og nu er det en helt anden sag:

$ 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 filer, en rekord.

Opsætning af Sherlock

Fra 13 sekunder med standardindstillinger til 0,3 sekunder med mindre justeringer LS_COLORS betyder en 40 gange acceleration på grund af fraværet setuid / setgid og farvede eksekverbare filer. Ikke så stort et tab.

Selvfølgelig er dette nu konfigureret i Sherlock for hver bruger.

Men hvis du vil returnere farven, kan du blot vende tilbage til standardindstillingerne:

$ unset LS_COLORS

Men på mapper med mange filer skal du sørge for at brygge kaffe, mens den kører ls.

Kilde: www.habr.com

Tilføj en kommentar