Nalika variabel lingkungan nyepetake proses kanthi 40 kaping

Dina iki kita arep ngomong babagan sawetara nganyari paling anyar kanggo sistem Sherlock [iki minangka kluster kinerja dhuwur ing Universitas Stanford - kira-kira. trans.], sing kanthi signifikan nyepetake dhaptar file ing direktori kanthi jumlah entri sing akeh.

Ora kaya artikel biasa, iki luwih saka laporan wong njero babagan cara kerja Sherlock kanthi rutin supaya bisa digunakake kanthi paling apik kanggo pangguna. Kita ngarep-arep bisa nerbitake luwih akeh artikel kaya iki ing mangsa ngarep.

Listing akeh file mbutuhake wektu

Iku kabeh diwiwiti kanthi pitakonan dhukungan teknis saka pangguna. Panjenenganipun kacarita masalah sing execution ls njupuk sawetara menit ing direktori karo liwat 15 entri ing $SCRATCH [direktori kanggo file sementara - kira-kira. jalur].

Ewonan file ing siji direktori biasane dadi beban kanggo sistem file lan mesthi ora dianjurake. Pangguna ngerti iki lan ngakoni yen ora apik, nanging nyatakake yen listing kasebut 1000 kaping luwih cepet ing laptop tinimbang Sherlock. Mesthi, iki nglarani kita. Dadi kita katon luwih jero.

Amarga ls katon apik

Kita ndeleng apa sing ditindakake ls nalika ndhaptar direktori, lan kenapa proses kasebut suwe banget. Ing distribusi paling modern ls kanthi gawan mlaku minangka ls --color=auto, amarga kabeh wong seneng warna.

Nanging werna ayu teka ing rega: kanggo saben file ls kudu entuk informasi babagan jinis file, ijin, gendera, atribut lengkap lan liya-liyane kanggo milih warna sing cocog.

Siji solusi sing gampang kanggo masalah kasebut yaiku mateni warna ing ls kabeh, nanging mbayangno nesu pangguna. Ing kahanan apa sampeyan kudu njupuk adoh output werna, kita ora monsters.

Dadi kita katon luwih jero. ls entri werna liwat variabel lingkungan LS_COLORS, kang disetel dircolors(1) adhedhasar file konfigurasi dir_colors(5)... Iya eksekusi maca file konfigurasi kanggo nggawe variabel lingkungan, sing banjur digunakake (lan yen sampeyan ora ngerti babagan file dening (do), banjur dir_colors bakal nyambut gawe, Senadyan kabeh).

Ayo dideleng kanthi cetha

Kanggo nemtokake skema warna sing nyebabake kalem, kita nggawe lingkungan eksperimen:

$ 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 kanggo 10 file, ora apik banget.

Miturut cara, kita kudu gendΓ©ra --color=always: senajan dheweke nguripake kanggo ls --color=auto, nanging ls ndeteksi nalika ora disambungake menyang terminal (contone dening pipa utawa karo pangalihan output) lan mateni pewarnaan yen disetel menyang auto. Wong lanang pinter.

Dadi apa sing suwe banget? Kita nyawang karo 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 telpon lstat(), 10 telpon getxattr() (sing kabeh gagal amarga lingkungan kita ora duwe atribut sing digoleki), 10 telpon capget().

Mesthi iki bisa dioptimalake.

Atribut kapabilitas? Ora

Nuruti saran bug saka 10 taun ago, kita nyoba mateni pamriksa atribut kemampuan:

$ 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 nganti 8 detik! Kita nyingkirake kabeh telpon sing larang getxattr(), lan tantangan capget() ilang uga, gedhe.

Nanging isih ana telpon sing ngganggu lstat(), Senajan…

Pira kembang sing dibutuhake?

Mulane, kita njupuk dipikir nyedhaki LS_COLORS.

Kaping pisanan, kita mung mateni variabel iki:

$ 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

Apa!?! Isih 13 detik?

Pranyata metu sing nalika variabel lingkungan LS_COLORS mung siji unsur sing ora ditetepake utawa ilang <type>=color:, nggunakake basis data sing dibangun kanthi standar lan isih nggunakake warna. Dadi yen sampeyan pengin mateni pewarnaan kanggo jinis file tartamtu, sampeyan kudu ngilangi <type>=: utawa <type> 00 ing file DIR_COLORS.

Sawise akeh nyoba lan kesalahan, kita mbatesi telusuran menyang iki:

EXEC 00
SETUID 00
SETGID 00
CAPABILITY 00

kang ditulis minangka

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

Iki tegese: aja warna file miturut atribut. kemampuan, nanging sithik-sithik setuid/setgid, ora dening flag eksekusi.

Kita nyepetake ls

Lan yen sampeyan ora nindakake samubarang mriksa iki, banjur nelpon lstat() ilang, lan saiki dadi prakara sing beda:

$ 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 ing dhaptar 10 file, rekaman.

Nggawe Sherlock

Saka 13 detik kanthi setelan gawan nganti 0,3 detik kanthi pangaturan cilik LS_COLORS tegese percepatan 40 kaping amarga ora ana setuid / setgid lan file eksekusi warna. Ora kaya mundhut gedhe.

Mesthi, iki saiki dikonfigurasi ing Sherlock kanggo saben pangguna.

Nanging yen sampeyan pengin mbalekake pewarnaan, sampeyan mung bisa bali menyang setelan gawan:

$ unset LS_COLORS

Nanging banjur ing direktori karo akeh file, manawa kanggo nggawe kopi nalika lagi mlaku ls.

Source: www.habr.com

Add a comment