Երբ շրջակա միջավայրի փոփոխականն արագացնում է գործընթացը 40 անգամ

Այսօր մենք ուզում ենք խոսել Sherlock համակարգի վերջին թարմացումներից մի քանիսի մասին [սա Սթենֆորդի համալսարանի բարձր արդյունավետության կլաստեր է. մոտ. trans.], որոնք զգալիորեն արագացնում են ֆայլերի ցուցակագրումը մեծ թվով գրառումներով դիրեկտորիաներում:

Ի տարբերություն սովորական հոդվածների, սա ավելի շատ ինսայդերական զեկույց է այն մասին, թե ինչպես ենք մենք պարբերաբար աշխատում Sherlock-ի վրա, որպեսզի այն լավագույնս աշխատի մեր օգտատերերի համար: Հուսով ենք, որ հետագայում նման հոդվածներ կհրապարակենք:

Շատ ֆայլերի ցուցակագրումը ժամանակ է պահանջում

Ամեն ինչ սկսվեց օգտատիրոջ տեխնիկական աջակցության հարցից: Նա հայտնել է այն խնդրի մասին, որ մահապատիժը ls 15-ից ավելի գրառումներով գրացուցակում մի քանի րոպե տևում է $SCRATCH [ժամանակավոր ֆայլերի տեղեկատու - մոտ. գոտի]:

Հազարավոր ֆայլերը մեկ գրացուցակում սովորաբար ծանրաբեռնում են ֆայլային համակարգը և հաստատ խորհուրդ չի տրվում: Օգտատերը գիտեր դա և խոստովանեց, որ լավ չէ, բայց նշեց, որ իր նոութբուքի ցուցակը 1000 անգամ ավելի արագ է, քան Շերլոկը։ Իհարկե, սա մեզ ցավ պատճառեց։ Այսպիսով, մենք նայեցինք ավելի խորը:

Քանի որ ls-ը գեղեցիկ տեսք ունի

Մենք նայեցինք, թե ինչ է այն իրականում անում ls երբ ցուցակագրում եք գրացուցակը և ինչու է գործընթացն այդքան երկար տևում: Ժամանակակից բաշխումների մեծ մասի վրա ls լռելյայն աշխատում է որպես ls --color=auto, քանի որ բոլորին դուր են գալիս գույները։

Բայց գեղեցիկ գույներն ունեն գին՝ յուրաքանչյուր ֆայլի համար ls պետք է տեղեկատվություն ստանա ֆայլի տեսակի, դրա թույլտվությունների, դրոշների, ընդլայնված ատրիբուտների և այլնի մասին, որպեսզի ընտրի համապատասխան գույնը:

Խնդրի պարզ լուծումներից մեկը ls-ի գույներն ընդհանրապես անջատելն է, բայց պատկերացրեք օգտատերերի վրդովմունքը: Ոչ մի դեպքում չպետք է խլեք գույնի արդյունքը, մենք հրեշներ չենք:

Այսպիսով, մենք նայեցինք ավելի խորը: ls գույների մուտքերը շրջակա միջավայրի փոփոխականի միջոցով LS_COLORS, որը սահմանված է dircolors(1) հիմնված կազմաձևման ֆայլի վրա dir_colors(5)... Այո, գործարկվողը կարդում է կազմաձևման ֆայլը՝ շրջակա միջավայրի փոփոխական ստեղծելու համար, որն այնուհետև օգտագործում է (և եթե չգիտեք ֆայլերի մասին դուռ (do), ապա dir_colors դա կաշխատի, չնայած ամեն ինչին):

Եկեք մանրամասն նայենք

Որոշելու համար, թե որ գունային սխեման է առաջացնում դանդաղում, մենք ստեղծեցինք փորձնական միջավայր.

$ 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 վայրկյան 10 ֆայլի համար, ոչ այնքան լավ:

Ի դեպ, մեզ դրոշ է պետք --color=alwaysթեև նա դիմում է ls --color=autoՍակայն ls հայտնաբերում է, երբ այն միացված չէ տերմինալին (օրինակ՝ խողովակով կամ ելքային վերահղմամբ) և անջատում է գունավորումը, եթե սահմանված է auto. Խելացի տղա.

Այսպիսով, ի՞նչն է այդքան երկար տևում: Մենք նայեցինք հետ 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 զանգ lstat(), 10 զանգ getxattr() (որոնք բոլորը ձախողվում են, քանի որ մեր միջավայրը չունի այն հատկանիշները, որոնք փնտրում է ls-ը), 10 զանգ capget().

Իհարկե, սա կարելի է օպտիմալացնել:

Կարողությունների հատկանիշ. ոչ

Հետևելով խորհուրդներին 10 տարի առաջվա սխալ, մենք փորձեցինք անջատել հատկանիշի ստուգումը կարողությունները:

$ 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

Վայ, մինչև 8 վայրկյան արագացում: Մենք ազատվեցինք այդ բոլոր թանկ զանգերից getxattr()և մարտահրավերներ capget() անհետացավ նույնպես, հիանալի:

Բայց դեռ կան այս նյարդայնացնող զանգերը lstat(), Չնայած նրան…

Քանի ծաղիկ է ձեզ հարկավոր:

Հետեւաբար, մենք ավելի ուշադիր նայեցինք LS_COLORS.

Սկզբում մենք պարզապես անջատեցինք այս փոփոխականը.

$ 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

Ինչ!?! Դեռ 13 վրկ.

Ստացվում է, որ երբ շրջակա միջավայրի փոփոխական LS_COLORS միայն դրա տարրերից մեկը սահմանված չէ կամ բացակայում է <type>=color:, այն օգտագործում է ներկառուցված տվյալների բազան լռելյայնորեն և դեռ օգտագործում է գույները: Այսպիսով, եթե ցանկանում եք անջատել գունավորումը որոշակի ֆայլի տեսակի համար, դուք պետք է անտեսեք այն <type>=: կամ <type> 00 ֆայլում DIR_COLORS.

Շատ փորձերից և սխալներից հետո մենք մեր որոնումը կրճատեցինք հետևյալի վրա.

EXEC 00
SETUID 00
SETGID 00
CAPABILITY 00

որը գրված է որպես

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

Սա նշանակում է. մի գունազարդեք ֆայլերը ըստ հատկանիշի: կարողությունները, բայց քիչ առ քիչ setuid/setgid, ոչ էլ կողմից կատարողականության դրոշ.

Մենք արագացնում ենք ls

Իսկ եթե այս ստուգումներից ոչ մեկը չեք անում, ապա զանգահարեք lstat() անհետանալ, իսկ հիմա բոլորովին այլ հարց է.

$ 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 վայրկյան 10 ֆայլերի ցանկում, ռեկորդ:

Շերլոկի կարգավորում

13 վայրկյանից լռելյայն կարգավորումներով մինչև 0,3 վայրկյան՝ չնչին ճշգրտումներով LS_COLORS նշանակում է բացակայության պատճառով 40 անգամ արագացում setuid / setgid և գունավոր գործարկվող ֆայլեր: Ոչ այնքան մեծ կորուստ.

Իհարկե, սա այժմ կազմաձևված է Sherlock-ում յուրաքանչյուր օգտագործողի համար:

Բայց եթե ցանկանում եք վերադարձնել գունավորումը, կարող եք պարզապես վերադառնալ լռելյայն կարգավորումներին.

$ unset LS_COLORS

Բայց հետո շատ ֆայլեր պարունակող գրացուցակներում, համոզվեք, որ սուրճ եփեք, մինչ այն աշխատում է ls.

Source: www.habr.com

Добавить комментарий