Айлана-чөйрө өзгөрмө процессти 40 эсе ылдамдатканда

Бүгүн биз Шерлок системасынын акыркы жаңыртууларынын айрымдары жөнүндө сүйлөшкүбүз келет [бул Стэнфорд университетиндеги жогорку натыйжалуу кластер - болжол менен. trans.], бул файлдарды көп сандагы жазуулары бар каталогдордо тизмелөөнү кыйла тездетет.

Кадимки макалалардан айырмаланып, бул биздин колдонуучулар үчүн эң жакшы иштеши үчүн Шерлокто кантип үзгүлтүксүз иштегенибиз жөнүндө көбүрөөк инсайдердин отчету. Келечекте дагы ушул сыяктуу макалаларды чыгарабыз деген үмүттөбүз.

Көптөгөн файлдарды тизмелөө убакытты талап кылат

Мунун баары колдонуучунун техникалык колдоо суроосу менен башталды. Ал аткарылып жаткан көйгөйдү билдирди ls 15 000ден ашык жазуусу бар каталогдо бир нече мүнөт талап кылынат $SCRATCH [убактылуу файлдар үчүн каталог - болжол менен. тилке].

Бир каталогдогу миңдеген файлдар, адатта, файл тутумуна оорчулук келтирет жана албетте сунушталбайт. Колдонуучу муну билген жана бул жакшы эмес экенин мойнуна алган, бирок листинг Шерлокко караганда анын ноутбукунда 1000 эсе тез экенин айткан. Албетте, бул бизге зыян келтирди. Ошентип биз тереңирээк карадык.

Анткени ls жакшы көрүнөт.

Биз анын чындыгында эмне кылып жатканын карадык ls каталогду тизмелегенде жана процесс эмне үчүн мынчалык узакка созулат. Көпчүлүк заманбап бөлүштүрүү боюнча ls демейки боюнча ал иштейт ls --color=auto, анткени ар бир адам түстөрдү жакшы көрөт.

Бирок кооз түстөр бир баада келет: ар бир файл үчүн ls Тиешелүү түстү тандоо үчүн файлдын түрү, анын уруксаттары, желектери, кеңейтилген атрибуттары жана ушул сыяктуулар жөнүндө маалымат алышы керек.

Көйгөйдүн бир жөнөкөй чечими - ls ичиндеги түстү таптакыр өчүрүү, бирок колдонуучулардын нааразычылыгын элестетиңиз. Эч кандай шартта сиз түстүү чыгарууну алып салбаңыз, биз желмогуз эмеспиз.

Ошентип биз тереңирээк карадык. ls чөйрө өзгөрмө аркылуу түстөрдү киргизүү LS_COLORS, белгиленген dircolors(1) конфигурация файлына негизделген dir_colors(5)... Ооба, аткарылуучу чөйрө өзгөрмөсүн түзүү үчүн конфигурация файлын окуйт, аны ls кийин колдонот (жана файлдар жөнүндө билбесеңиз эшик (кыла), андан кийин 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 файл үчүн 000 секунд, анча жакшы эмес.

Баса, бизге желек керек --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 000 чалуу lstat(), 10 000 чалуу getxattr() (анын баары ишке ашпай калды, анткени биздин чөйрөдө ls издеп жаткан атрибуттар жок), 10 000 чалуу 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 файлдардын тизмесинде 000 секунд, рекорд.

Шерлок орнотулууда

13 секунд демейки жөндөөлөр менен 0,3 секунда чейин кичине өзгөртүү менен LS_COLORS жоктугуна байланыштуу 40 эсе ылдамдатууну билдирет setuid / setgid жана түстүү аткарылуучу файлдар. Мынчалык чоң жоготуу эмес.

Албетте, бул азыр Шерлокто ар бир колдонуучу үчүн конфигурацияланган.

Бирок, эгер сиз боёкту кайтаргыңыз келсе, жөн гана демейки жөндөөлөргө кайтсаңыз болот:

$ unset LS_COLORS

Бирок андан кийин файлдары көп каталогдордо, ал иштеп жатканда кофе кайнатууну унутпаңыз ls.

Source: www.habr.com

Комментарий кошуу