Бүгүн биз Шерлок системасынын акыркы жаңыртууларынын айрымдары жөнүндө сүйлөшкүбүз келет [бул Стэнфорд университетиндеги жогорку натыйжалуу кластер - болжол менен. trans.], бул файлдарды көп сандагы жазуулары бар каталогдордо тизмелөөнү кыйла тездетет.
Кадимки макалалардан айырмаланып, бул биздин колдонуучулар үчүн эң жакшы иштеши үчүн Шерлокто кантип үзгүлтүксүз иштегенибиз жөнүндө көбүрөөк инсайдердин отчету. Келечекте дагы ушул сыяктуу макалаларды чыгарабыз деген үмүттөбүз.
Көптөгөн файлдарды тизмелөө убакытты талап кылат
Мунун баары колдонуучунун техникалык колдоо суроосу менен башталды. Ал аткарылып жаткан көйгөйдү билдирди ls
15 000ден ашык жазуусу бар каталогдо бир нече мүнөт талап кылынат $SCRATCH
[убактылуу файлдар үчүн каталог - болжол менен. тилке].
Бир каталогдогу миңдеген файлдар, адатта, файл тутумуна оорчулук келтирет жана албетте сунушталбайт. Колдонуучу муну билген жана бул жакшы эмес экенин мойнуна алган, бирок листинг Шерлокко караганда анын ноутбукунда 1000 эсе тез экенин айткан. Албетте, бул бизге зыян келтирди. Ошентип биз тереңирээк карадык.
Анткени ls жакшы көрүнөт.
Биз анын чындыгында эмне кылып жатканын карадык ls
каталогду тизмелегенде жана процесс эмне үчүн мынчалык узакка созулат. Көпчүлүк заманбап бөлүштүрүү боюнча ls
демейки боюнча ал иштейт ls --color=auto
, анткени ар бир адам түстөрдү жакшы көрөт.
Бирок кооз түстөр бир баада келет: ар бир файл үчүн ls
Тиешелүү түстү тандоо үчүн файлдын түрү, анын уруксаттары, желектери, кеңейтилген атрибуттары жана ушул сыяктуулар жөнүндө маалымат алышы керек.
Көйгөйдүн бир жөнөкөй чечими - ls ичиндеги түстү таптакыр өчүрүү, бирок колдонуучулардын нааразычылыгын элестетиңиз. Эч кандай шартта сиз түстүү чыгарууну алып салбаңыз, биз желмогуз эмеспиз.
Ошентип биз тереңирээк карадык. ls
чөйрө өзгөрмө аркылуу түстөрдү киргизүү LS_COLORS
, белгиленген dircolors(1)
конфигурация файлына негизделген dir_colors(5)
... Ооба,
Келгиле, жакыныраак карап көрөлү
Кайсы түс схемасы жайлагандыгын аныктоо үчүн биз эксперименталдык чөйрө түздүк:
$ 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()
.
Албетте, бул оптималдаштырууга болот.
Мүмкүнчүлүктөрдүн атрибуту? Жок
Кеңешти аткаруу
$ 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:'
Бул: файлдарды атрибут боюнча боёбоңуз.
, тарабынан да эмес
Биз тездетебиз 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