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
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 kanggols --color=auto
, nangingls
ndeteksi nalika ora disambungake menyang terminal (contone dening pipa utawa karo pangalihan output) lan mateni pewarnaan yen disetel menyangauto
. 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
$ 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.
, ora dening
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