Nalika variabel lingkungan ngagancangkeun prosés ku 40 kali

Dinten ieu kami hoyong ngobrol ngeunaan sababaraha apdet panganyarna pikeun sistem Sherlock [ieu klaster-kinerja tinggi di Stanford University - approx. trans.], anu sacara signifikan nyepetkeun daptar file dina diréktori kalayan jumlah éntri anu ageung.

Beda sareng tulisan biasa, ieu langkung seueur tina laporan insider ngeunaan cara urang rutin ngerjakeun Sherlock pikeun tetep ngajalankeun anu pangsaéna pikeun pangguna urang. Kami ngarepkeun bakal nyebarkeun langkung seueur tulisan sapertos kieu ka hareup.

Listing loba file butuh waktu

Éta sadayana dimimitian ku patarosan dukungan téknis ti pangguna. Anjeunna dilaporkeun masalah yén palaksanaan ls Butuh waktu sababaraha menit dina diréktori kalawan leuwih 15 éntri dina $SCRATCH [Diréktori pikeun file samentara - approx. jalur].

Rébuan file dina hiji diréktori biasana nyababkeun beban pikeun sistem file sareng pasti henteu disarankeun. Pamaké terang ieu sareng ngaku yén éta henteu saé, tapi disebatkeun yén daptar éta 1000 kali langkung gancang dina laptopna tibatan Sherlock. Tangtu, ieu menyakiti urang. Ku kituna urang nempo leuwih jero.

Kusabab ls katingalina alus.

Urang nempo naon sabenerna teu ls nalika daptar diréktori, sareng naha prosésna peryogi lami. Dina kalolobaan distribusi modern ls sacara standar ngajalankeun salaku ls --color=auto, sabab dulur resep warna.

Tapi warna anu éndah hargana: pikeun unggal file ls kudu ménta inpo ngeunaan jenis file, idin na, bandéra, atribut nambahan sarta kawas dina urutan pikeun milih warna luyu.

Hiji leyuran basajan pikeun masalah nyaeta mareuman warna dina ls sakabehna, tapi ngabayangkeun kalakuan cucungah pamaké. Dina sagala kaayaan anjeun kedah nyandak kaluar kaluaran warna, kami henteu monster.

Ku kituna urang nempo leuwih jero. ls éntri warna via variabel lingkungan LS_COLORS, nu diatur dircolors(1) dumasar kana file konfigurasi dir_colors(5)... Leres, executable maca file konfigurasi pikeun nyiptakeun variabel lingkungan, anu teras dianggo (sareng upami anjeun henteu terang ngeunaan file ku (ngalakukeun), teras dir_colors bakal jalan, Sanajan sagalana).

Hayu urang nempo leuwih deukeut

Pikeun nangtukeun skéma warna mana anu nyababkeun slowdown, kami nyiptakeun lingkungan ékspérimén:

$ 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 detik pikeun 10 file, teu pisan alus.

Ku jalan kitu, urang peryogi bandéra --color=always: najan anjeunna tos ka ls --color=autotapi ls ngadeteksi lamun teu disambungkeun ka terminal a (misalna ku pipa atawa kalayan alihan kaluaran) jeung disables ngawarnaan lamun disetel ka auto. Lalaki pinter.

Janten naon anu lami pisan? Urang nempo kalawan 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
[...]

Wah: 10 telepon lstat(), 10 nelepon getxattr() (anu sadayana gagal kusabab lingkungan urang henteu ngagaduhan atribut anu dicarioskeun), 10 telepon capget().

Pasti ieu tiasa dioptimalkeun.

Atribut kamampuhan? Heueuh

Nurutan saran bug ti 10 sababaraha taun ka pengker, urang diusahakeun mareuman mariksa atribut kamampuhan:

$ 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

Wah, akselerasi nepi ka 8 detik! Urang meunang leupas tina sakabeh jalma telepon mahal getxattr(), jeung tantangan capget() ngiles teuing, hébat.

Tapi masih aya telepon anu ngaganggu lstat(), Sanajan…

Sabaraha kembang anjeun peryogi?

Ku alatan éta, urang nyandak katingal ngadeukeutan LS_COLORS.

Mimiti urang ngan saukur mareuman variabel ieu:

$ 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

Naon!?! Masih 13 detik?

Tétéla yén nalika variabel lingkungan LS_COLORS ngan hiji unsurna teu dihartikeun atawa leungit <type>=color:, eta ngagunakeun database diwangun-di sacara standar sarta masih ngagunakeun kelir. Janten upami anjeun hoyong nganonaktipkeun pewarnaan pikeun jinis file anu tangtu, anjeun kedah nimpa éta <type>=: atawa <type> 00 dina file DIR_COLORS.

Sanggeus loba trial and error, urang ngahususkeun pilarian kami ka handap ieu:

EXEC 00
SETUID 00
SETGID 00
CAPABILITY 00

nu ditulis salaku

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

Ieu ngandung harti: ulah warna file ku atribut. kamampuhan, tapi saeutik-saeutik setuid/setgid, boh ku bandéra executability.

Urang gancangan ls

Tur upami Anjeun salah teu ngalakukeun salah sahiji cék ieu, teras nelepon lstat() ngaleungit, sareng ayeuna éta masalah anu béda pisan:

$ 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 detik dina daptar 10 file, rékaman.

Nyetél Sherlock

13 detik kalayan setélan standar pikeun 0,3 detik kalayan tweaking minor LS_COLORS hartina akselerasi 40-melu alatan henteuna setuid / setgid sareng file laksana berwarna. Teu sapertos rugi badag.

Tangtosna, ieu ayeuna dikonpigurasi dina Sherlock pikeun unggal pangguna.

Tapi upami anjeun hoyong uih deui ngawarnaan, anjeun ngan saukur tiasa uih deui ka setélan standar:

$ unset LS_COLORS

Tapi teras dina diréktori anu seueur file, pastikeun pikeun nyéduh kopi nalika dijalankeun ls.

sumber: www.habr.com

Tambahkeun komentar