Lè yon varyab anviwònman akselere pwosesis la pa 40 fwa

Jodi a nou vle pale sou kèk nan dènye mizajou nan sistèm Sherlock la [sa a se yon gwoup pèfòmans segondè nan Inivèsite Stanford - approx. trans.], ki siyifikativman akselere lis fichye nan anyè ak yon gwo kantite antre.

Kontrèman ak atik regilye, sa a se plis nan yon rapò inisye sou fason nou regilyèman travay sou Sherlock kenbe li kouri nan pi bon li yo pou itilizatè nou yo. Nou espere pibliye plis atik tankou sa alavni.

Lis anpil fichye pran tan

Tout bagay te kòmanse ak yon kesyon sipò teknik nan men yon itilizatè. Li rapòte yon pwoblèm ke ekzekisyon an ls pran kèk minit nan yon anyè ki gen plis pase 15 antre nan $SCRATCH [anyè pou fichye tanporè - approx. liy].

Dè milye de fichiers nan yon sèl anyè dabitid poze yon chay pou sistèm fichier Et san mank pa rekòmande. Itilizatè a te konnen sa a epi li admèt ke li pa t 'bon, men mansyone ke lis la te 1000 fwa pi vit sou laptop li pase Sherlock. Natirèlman, sa a fè nou mal. Se konsa, nou gade pi fon.

Paske ls sanble bèl

Nou te gade sa li aktyèlman fè ls lè lis yon anyè, e poukisa pwosesis la pran anpil tan. Sou pifò distribisyon modèn ls pa default li kouri kòm ls --color=auto, paske tout moun renmen koulè yo.

Men, bèl koulè vini nan yon pri: pou chak dosye ls dwe jwenn enfòmasyon sou kalite dosye a, otorizasyon li yo, drapo, atribi pwolonje ak bagay sa yo nan lòd yo chwazi koulè ki apwopriye a.

Yon solisyon senp nan pwoblèm nan se enfim koulè nan ls tout ansanm, men imajine outraj la soti nan itilizatè yo. Anba okenn sikonstans ou ta dwe retire pwodiksyon an koulè, nou pa monstr.

Se konsa, nou gade pi fon. ls koulè antre atravè anviwònman varyab LS_COLORS, ki mete dircolors(1) baze sou dosye konfigirasyon dir_colors(5)... Wi, ègzèkutabl la li fichye konfigirasyon an pou kreye yon varyab anviwònman an, ki itilize lè sa a (e si ou pa konnen sou dosye yo pòt (fè), Lè sa a, dir_colors ap travay, Malgre tout bagay).

Ann pran yon gade pi pre

Pou detèmine ki konplo koulè ki lakòz ralentissement la, nou te kreye yon anviwònman eksperimantal:

$ 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 segonn pou 10 dosye, pa trè bon.

An pasan, nou bezwen yon drapo --color=always: byenke li tounen vin jwenn ls --color=automen ls detekte lè li pa konekte ak yon tèminal (pa egzanp, pa tiyo oswa ak redireksyon pwodiksyon) epi li enfim koloran si li mete sou auto. Nèg entelijan.

Se konsa, kisa k ap pran anpil tan? Nou gade ak 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 apèl lstat(), 10 apèl getxattr() (ki tout echwe paske anviwònman nou an pa gen atribi ls ap chèche), 10 apèl capget().

Se vre wi sa a ka optimize.

Kapasite atribi? Non

Swiv konsèy ensèk soti nan 10 ane de sa, nou te eseye enfim tcheke atribi kapasite:

$ 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, jiska 8 segonn akselerasyon! Nou te debarase m de tout apèl sa yo chè getxattr(), ak defi capget() disparèt tou, gwo.

Men, toujou genyen apèl anmèdan sa yo lstat(), Malgre…

Konbyen flè ou bezwen?

Se poutèt sa, nou te pran yon gade pi pre LS_COLORS.

Premye nou tou senpleman enfim varyab sa a:

$ 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

Kisa!?! Toujou 13 segonn?

Li sanble ke lè anviwònman an varyab LS_COLORS sèlman youn nan eleman li yo pa defini oswa ki manke <type>=color:, li sèvi ak baz done entegre a pa default epi li toujou sèvi ak koulè. Se konsa, si ou vle enfim kolorizasyon pou yon kalite dosye sèten, ou bezwen pase sou plas li ak <type>=: oswa <type> 00 nan dosye DIR_COLORS.

Apre anpil esè ak erè, nou redwi rechèch nou an nan sa a:

EXEC 00
SETUID 00
SETGID 00
CAPABILITY 00

ki ekri kòm

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

Sa vle di: pa fè koulè dosye pa atribi. kapasite, men ti kras pa ti kras setuid/setgid, ni pa ègzekutabilite drapo.

Nou akselere ls

Men, si ou pa fè nenpòt nan chèk sa yo, Lè sa a, apèl lstat() disparèt, epi kounye a li se yon pwoblèm konplètman diferan:

$ 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 segonn sou yon lis 10 dosye, yon dosye.

Mete kanpe Sherlock

Soti nan 13 segonn ak anviwònman default a 0,3 segonn ak ajisteman minè LS_COLORS vle di yon akselerasyon 40 fwa akòz absans la setuid / setgid ak dosye ki gen koulè ègzekutabl. Pa tankou yon gwo pèt.

Natirèlman, sa a se kounye a configuré nan Sherlock pou chak itilizatè.

Men, si ou vle retounen koloran an, ou ka tou senpleman retounen nan anviwònman yo default:

$ unset LS_COLORS

Men, Lè sa a, sou anyè ki gen yon anpil nan dosye, asire w ke ou melanje kafe pandan li ap kouri ls.

Sous: www.habr.com

Add nouvo kòmantè