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,
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 kals --color=auto
tapils
ngadeteksi lamun teu disambungkeun ka terminal a (misalna ku pipa atawa kalayan alihan kaluaran) jeung disables ngawarnaan lamun disetel kaauto
. 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
$ 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.
, boh ku
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