Ma szeretnénk beszélni néhány legutóbbi frissítésről a Sherlock rendszerében [ez a Stanford Egyetem nagy teljesítményű klasztere – a ford. megj.] , amelyek jelentősen felgyorsítják a fájlok listázását olyan könyvtárakban, ahol sok bejegyzés található.
A szokásos cikkekkel ellentétben ez inkább egy insider jelentés arról, hogy hogyan zajlik a rendszeres munka a Sherlockedon, hogy a legjobban támogathassuk felhasználóinkat. Reméljük, a jövőben több ilyen cikket is közzétehetünk.
Sok fájl listázása időigényes
Minden azzal a kérdéssel kezdődött, amelyet egy felhasználó tett fel a műszaki támogatásnak. Bejelentette, hogy a végrehajtás ls több percet vesz igénybe egy több mint 15 000 bejegyzést tartalmazó könyvtárban $SCRATCH [ideiglenes fájlok könyvtára – a ford. megj.] .
Ezernyi fájl egy könyvtárban általában problémákat okoz a fájlrendszer számára, és ezt határozottan nem ajánlják. A felhasználó tudta ezt, és elismerte, hogy nem ideális, de megemlítette, hogy a laptopján a listázás 1000-szer gyorsabb, mint a Sherlocknál. Természetesen ez bántott minket. Ezért mélyebben beleástunk.
Mert az ls szépen néz ki
Megvizsgáltuk, hogy mit is csinál valójában ls a könyvtár listázásakor, és miért tart ennyi ideig a folyamat. A legtöbb modern disztribúcióban ls alapértelmezés szerint ls --color=auto, mert mindenkinek tetszik a színezés.
De a szépen megjelenő színek ára van: minden fájlhoz ls információt kell gyűjteni a fájl típusáról, engedélyeiről, flagjairól, kiterjesztett attribútumairól és hasonlókról, hogy ki tudja választani a megfelelő színt.
Egyik egyszerű megoldás a problémára az ls színének teljes kikapcsolása, de képzelje el a felhasználók felháborodását. Semmiképpen sem szabad a színes kimenetet elvenni, nem vagyunk szörnyetek.
Ezért mélyebben beleástunk. ls a z ls a környezeti változót LS_COLORS, amelyet a dircolors(1) a konfigurációs fájl alapján állít be dir_colors(5). Igen, használ, (és ha nem ismered a (do), akkor a dir_colors .
Nézzük meg részletesebben
Hogy meghatározzuk, melyik színsémát okozza a lassítást, kísérleti környezetet alakítottunk ki:
$ mkdir $SCRATCH/dont
$ touch $SCRATCH/dont/{1..10000} # ezt ne próbáld ki otthon!
$ time ls --color=always $SCRATCH/dont | wc -l
10000
valódi 0m12.758s
felhasználói 0m0.104s
rendszer 0m0.699s12,7 másodperc 10 000 fájlhoz, nem túl jó.
Egyébként szükség van a flag-ra
--color=always: bár ez als --color=auto, delsészleli, amikor nem csatlakoztatott a terminálhoz (például csatornán vagy kimeneti átirányítással), és kikapcsolja a színezést, ha az értékauto. Okos srác.
De mi tart annyi ideig? Megnéztük a strace:
$ strace -c ls --color=always $SCRATCH/dont | wc -l
10000
% idő másodpercek usec/hívás hívások hibák 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
[...] Hűha: 10 000 hívás lstat(), 10 000 hívás getxattr() (amelyek mind megbuknak, mert a környezetünkben nincsenek attribútumok, amelyeket az ls keres), 10 000 hívás capget().
Biztos vagyok benne, hogy ezt optimalizálni lehet.
Attribútumok? Nem.
A 10 éves hiba javaslatainak követésével $ eval $(dircolors -b | sed s/ca=[^:]*:/ca=:) $ time strace -c ls --color=always $SCRATCH/dont | wc -l 10000 % idő másodpercek usec/hívás hívások hibák 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 összesenvalódi 0m8.160s felhasználói 0m0.115s rendszer 0m0.961s :
Wow, 8 másodpercre gyorsultunk! Megszabadultunk minden drága hívástól , és a hívások getxattr()is eltűntek, nagyszerű. capget() De még mindig ott vannak ezek a bosszantó hívások
, pedig... lstat()Mennyi színre van szükség?
Ezért alaposabban megnéztük
Először egyszerűen letiltottuk ezt a változót: LS_COLORS.
Először egyszerűen letiltották ezt a változót:
$ 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
Mi van!?! Még mindig 13 másodperc?
Kiderül, hogy amikor a környezeti változó LS_COLORS nincs definiálva, vagy csak az egyik eleme hiányzik =szín:, akkor alapértelmezés szerint a beépített adatbázist használja, és továbbra is színeket alkalmaz. Tehát ha ki akarod kapcsolni a színezést egy adott fájltípushoz, az át kell írnod = vagy 00 a fájlban DIR_COLORS.
Sok próbálkozás és hiba után szűkítettük a keresést erre:
EXEC 00
SETUID 00
SETGID 00
CAPABILITY 00ami így íródik:
LS_COLORS='ex=00:su=00:sg=00:ca=00:' Ez azt jelenti: ne színezze a fájlokat semmilyen attribútum alapján, , sem pedig a bitek alapján, , sem a .
Gyorsítunk. ls
És ha egyik ellenőrzést sem végezzük el, akkor a hívások eltűnnek, és most egészen más a helyzet: lstat() $ export LS_COLORS='ex=00:su=00:sg=00:ca=00:' $ time strace -c ls --color=always $SCRATCH/dont | wc -l 10000 % idő másodpercek usec/hívás hívások hibák 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 összesítvevalós 0m0.337s felhasználó 0m0.032s rendszer 0m0.029s
0,3 másodperc a 10 000 fájl listázására, rekord.Sherlock beállítása
A 13 másodpercből alapértelmezett beállításokkal 0,3 másodperc,
Ez 40-szeres gyorsulást jelent a LS_COLORS és a színezett végrehajtható fájlok miatt. Nem olyan nagy veszteség. setuid / setgid és a színes végrehajtható fájlokat. Nem olyan nagy veszteség.
Természetesen, most ezt a Sherlock minden felhasználó számára beállítottuk.
De ha vissza szeretné állítani a színezést, egyszerűen visszatérhet az alapértelmezett beállításokhoz:
$ unset LS_COLORS De akkor a sok fájlt tartalmazó könyvtáraknál muszáj kávét főzni, amíg fut. ls.
Forrás: habr.com
