Vandaag willen we enkele van de nieuwste updates van het Sherlock-systeem [dit is een high-performance cluster van de Stanford University - vert.], bespreken, die het opsommen van bestanden in mappen met veel records aanzienlijk versnellen.
In tegenstelling tot gewone artikelen is dit meer een insiderverslag over hoe het dagelijkse werk aan Sherlock verloopt om het in optimale staat te houden voor onze gebruikers. We hopen in de toekomst meer van dit soort artikelen te publiceren.
Het aanvullen van veel bestanden kost tijd.
Het begon allemaal met een vraag naar de klantenservice van een gebruiker. Hij meldde een probleem dat de uitvoering ls enkele minuten duurt in een map met meer dan 15.000 records in $SCRATCH [de tijdelijke map - vert.].
Duizenden bestanden in ƩƩn map veroorzaken meestal problemen voor het bestandssysteem en dat wordt beslist niet aanbevolen. De gebruiker wist dit en erkende dat het niet goed was, maar hij merkte op dat het opsommen op zijn laptop 1000 keer sneller gaat dan in Sherlock. Natuurlijk raakte ons dat. Dus we keken dieper.
Omdat ls er mooi uitziet.
We hebben bekeken wat er eigenlijk gebeurt ls bij het opsommen van een map, en waarom het proces zoveel tijd kost. In de meeste moderne distributies ls wordt standaard uitgevoerd als ls --color=auto, omdat iedereen van kleurtjes houdt.
Maar mooie kleuren hebben hun prijs: voor elk bestand ls moet informatie over het type bestand, de rechten, vlaggen, uitgebreide attributen, enzovoort, worden opgehaald om de juiste kleur te kiezen.
Een van de eenvoudige oplossingen voor het probleem is om de kleur in ls helemaal uit te schakelen, maar stel je de verontwaardiging van de gebruikers voor. Dit kan je de gekleurde uitvoer niet afnemen, we zijn geen monster.
Dus keken we dieper. ls kleurt de records via de omgevingsvariabele LS_COLORS, die is ingesteld door dircolors(1) op basis van het configuratiebestand dir_colors(5). Ja,het uitvoerbare bestand leest het configuratiebestand om de omgevingsvariabele te maken die ls vervolgens gebruikt door werken Laten we verder analyseren.
Om te bepalen welke van de kleurenschema's de vertraging veroorzaakt, hebben we een experimentele omgeving gemaakt:
Om te bepalen welke van de kleurschema's de vertraging veroorzaakt, hebben we een experimentele omgeving gecreƫerd:
$ mkdir $SCRATCH/dont
$ touch $SCRATCH/dont/{1..10000} # probeer dit niet thuis!
$ time ls --color=always $SCRATCH/dont | wc -l
10000
real 0m12.758s
user 0m0.104s
sys 0m0.699s12,7 seconden voor 10.000 bestanden, niet zo goed.
Overigens, de vlag is nodig
--color=always: hoewel deze dat verandert naarls --color=auto, maarlsdetecteert wanneer het niet verbonden is met de terminal (bijvoorbeeld via een kanaal of met omleiding van uitvoer) en schakelt kleur uit als het is ingesteld opauto. Slimme jongen.
Wat kost dan zoveel tijd? We hebben gekeken met behulp van strace:
$ strace -c ls --color=always $SCRATCH/dont | wc -l
10000
% tijd seconden gebruiks/aanroep aanroepen fouten 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
[...] Wauw: 10.000 aanroepen lstat(), 10.000 aanroepen getxattr() (die allemaal mislukken omdat er in onze omgeving geen attributen zijn die ls zoekt), 10.000 aanroepen capget().
Hier moet zeker iets te optimaliseren zijn.
Capabilities-attribuut? Nee
Volgend de adviezen , hebben we geprobeerd de controle op het attribuut :
$ eval $(dircolors -b | sed s/cap=[^:]*:/cap=:)
$ time strace -c ls --color=always $SCRATCH/dont | wc -l
10000
% tijd seconden gebruiks/aanroep aanroepen fouten 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 totaal
real 0m8.160s
user 0m0.115s
sys 0m0.961s Wauw, een versnelling tot 8 seconden! We hebben ons ontdaan van al die dure aanroepen getxattr(), en de aanroepen capget() zijn ook verdwenen, geweldig.
Maar er blijven nog steeds die vervelende aanroepen over lstat(), hoewel...
Hoeveel kleuren zijn er nodig?
Daarom hebben we het nog eens goed bekeken LS_COLORS.
We hebben eerst deze variabele gewoon uitgeschakeld:
$ 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
Wat!?! Nog steeds 13 seconden?
Blijkbaar wanneer de omgevingsvariabele LS_COLORS niet gedefinieerd is of slechts ƩƩn van zijn elementen ontbreekt =kleur:, gebruikt het standaard de ingebouwde database en gebruikt het nog steeds kleuren. Dus, als je kleurcodering voor een bepaald bestandstype wilt uitschakelen, moet je het overschrijven met =: of 00 in het bestand DIR_COLORS.
Na veel proberen en fouten hebben we de zoektocht tot dit beperkt:
EXEC 00
SETUID 00
SETGID 00
CAPABILITY 00dat wordt vastgelegd als
LS_COLORS='ex=00:su=00:sg=00:ca=00:' Dit betekent: kleurt geen bestanden op basis van attribuut , noch op basis van , of op .
Versnellen ls
En als je geen van deze controles uitvoert, verdwijnen de aanroepen, en het is nu een heel ander verhaal: lstat() $ export LS_COLORS='ex=00:su=00:sg=00:ca=00:' $ time strace -c ls --color=always $SCRATCH/dont | wc -l 10000 % tijd seconden microsec/oproep aanroepen fouten 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 totaalreal 0m0.337s user 0m0.032s sys 0m0.029s
0,3 seconden voor een lijst van 10.000 bestanden, een record.Sherlock instellen
Van 13 seconden met standaardinstellingen tot 0,3 seconden met een kleine configuratie
betekent een 40-voudige versnelling door de afwezigheid van LS_COLORS setuid setgidĀ / en gekleurde uitvoerbare bestanden. Niet zo'n groot verlies. en gekleurde uitvoerbare bestanden. Geen al te grote verlies.
Natuurlijk, dit is nu ingesteld in Sherlock voor elke gebruiker.
Maar als je de kleurcodering wilt terugbrengen, kun je gewoon teruggaan naar de standaardinstellingen:
$ unset LS_COLORS Maar dan, als je veel bestanden in de mappen hebt, zet dan koffie terwijl het werkt. ls.
Bron: habr.com
