Wanneer een omgevingsvariabele het proces 40 keer versnelt

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 (en als je niet weet over bestanden door (do), dan zal dir_colors werken , ongeacht wat er ook gebeurt).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.699s

12,7 seconden voor 10.000 bestanden, niet zo goed.

Overigens, de vlag is nodig --color=always: hoewel deze dat verandert naar ls --color=auto, maar ls detecteert 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 op auto. 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 een 10 jaar oude bug, hebben we geprobeerd de controle op het attribuut capabilities:

$ 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 00

dat wordt vastgelegd als

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

Dit betekent: kleurt geen bestanden op basis van attribuut capabilities, noch op basis van setuid/setgid, of op de uitvoerbaarheid vlag.

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

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers šŸ”„ Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster