Täna tahame rääkida mõnest Sherlocki süsteemi viimastest uuendustest [see on Stanfordi ülikooli suure jõudlusega klaster – u. trans.], mis kiirendavad oluliselt failide loetlemist suure hulga kirjetega kataloogides.
Erinevalt tavalistest artiklitest on see pigem siseringi aruanne selle kohta, kuidas me Sherlockiga regulaarselt töötame, et see meie kasutajate jaoks parimal viisil töötaks. Loodame tulevikus avaldada rohkem selliseid artikleid.
Paljude failide loetlemine võtab aega
Kõik sai alguse kasutaja tehnilise toe küsimusest. Ta teatas hukkamise probleemist ls
15 000 kirjega kataloogis kulub paar minutit $SCRATCH
[ajutiste failide kataloog - u. sõidurada].
Tuhanded failid ühes kataloogis koormavad tavaliselt failisüsteemi ja pole kindlasti soovitatav. Kasutaja teadis seda ja tunnistas, et see pole hea, kuid mainis, et loend oli tema sülearvutis 1000 korda kiirem kui Sherlock. Muidugi tegi see meile haiget. Nii et vaatasime sügavamalt.
Sest see näeb kena välja
Vaatasime, mida see tegelikult teeb ls
kataloogi loetlemisel ja miks see protsess nii kaua aega võtab. Enamikel kaasaegsetel distributsioonidel ls
vaikimisi töötab see kui ls --color=auto
, sest värvid meeldivad kõigile.
Kuid ilusatel värvidel on oma hind: iga faili eest ls
peab hankima teavet failitüübi, selle õiguste, lippude, laiendatud atribuutide jms kohta, et valida sobiv värv.
Üks lihtne lahendus probleemile on keelata värv ls-is täielikult, kuid kujutage ette kasutajate pahameelt. Mitte mingil juhul ei tohi te värviväljundit ära võtta, me pole koletised.
Nii et vaatasime sügavamalt. ls
värvikirjed keskkonnamuutuja kaudu LS_COLORS
, mis on määratud dircolors(1)
konfiguratsioonifaili põhjal dir_colors(5)
... Jah,
Vaatame lähemalt
Et teha kindlaks, milline värviskeem põhjustab aeglustumist, lõime eksperimentaalse keskkonna:
$ 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 sekundit 10 000 faili jaoks, mitte eriti hea.
Muide, me vajame lippu
--color=always
: kuigi ta pöördub poolels --color=auto
Kuidls
tuvastab, kui see pole terminaliga ühendatud (nt toru kaudu või väljundi ümbersuunamisega) ja keelab värvimise, kui see on määratudauto
. Tark mees.
Mis siis nii kaua aega võtab? Vaatasime koos 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
[...]
Vau: 10 000 kõnet lstat()
, 10 000 kõnet getxattr()
(mis kõik ebaõnnestuvad, kuna meie keskkonnal pole atribuute, mida ls otsib), 10 000 kõnet capget()
.
Kindlasti saab seda optimeerida.
Võimaluste atribuut? Ei
Nõuannet järgides
$ 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
Vau, kuni 8 sekundit kiirendust! Saime kõigist nendest kallitest kõnedest lahti getxattr()
ja väljakutseid capget()
kadus ka ära, suurepärane.
Aga neid tüütuid kõnesid on ikka lstat()
, kuigi…
Kui palju lilli vajate?
Seetõttu vaatasime lähemalt LS_COLORS
.
Esmalt keelasime selle muutuja lihtsalt välja:
$ 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
Mida!?! Ikka 13 sekundit?
Selgub, et kui keskkonnamuutuja LS_COLORS
ainult üks selle elementidest on määratlemata või puudub <type>=color:
, kasutab see vaikimisi sisseehitatud andmebaasi ja kasutab endiselt värve. Nii et kui soovite teatud failitüübi jaoks värvimise keelata, peate selle alistama <type>=:
või <type> 00
failis DIR_COLORS
.
Pärast palju katse-eksitusi kitsendasime otsingut järgmisele:
EXEC 00
SETUID 00
SETGID 00
CAPABILITY 00
mis on kirjutatud kui
LS_COLORS='ex=00:su=00:sg=00:ca=00:'
See tähendab: ärge värvige faile atribuudi järgi.
, ka mitte
Me kiirendame ls
Ja kui te ühtegi neist kontrollidest ei tee, helistage lstat()
kaovad ja nüüd on asi hoopis teine:
$ 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 sekundit 10 000 failiga loendis, rekord.
Sherlocki seadistamine
Alates 13 sekundist vaikeseadetega kuni 0,3 sekundini väikeste muudatustega LS_COLORS
tähendab puudumise tõttu 40-kordset kiirendust setuid
/ setgid
ja värvilised käivitatavad failid. Pole nii suur kaotus.
Loomulikult on see nüüd Sherlockis iga kasutaja jaoks konfigureeritud.
Kuid kui soovite värvi taastada, saate lihtsalt naasta vaikeseadetele:
$ unset LS_COLORS
Kuid kataloogides, kus on palju faile, keetke kindlasti kohvi töötamise ajal ls
.
Allikas: www.habr.com