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,
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 tills --color=auto
Menls
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 tilauto
. 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
$ 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.
, hverken af
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