Вақте ки тағирёбандаи муҳити зист равандро 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 файл, на он қадар хуб.

Зимнан, ба мо байрақ лозим аст --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
[...]

Вой: 10 занг 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.

Манбаъ: will.com

Илова Эзоҳ