Hari ini kami ingin berbicara tentang beberapa pembaruan terbaru dari sistem Sherlock [ini adalah cluster berkinerja tinggi di Universitas Stanford - kira-kira. per.], yang sangat mempercepat daftar file dalam direktori dengan sejumlah besar entri.
Tidak seperti artikel biasa, ini lebih merupakan laporan orang dalam tentang bagaimana pekerjaan reguler pada Sherlock berlangsung untuk mempertahankannya dengan cara terbaik untuk pengguna kami. Kami berharap dapat menerbitkan lebih banyak artikel seperti itu di masa mendatang.
Mendaftarkan banyak file membutuhkan waktu
Semuanya dimulai dengan pertanyaan dukungan teknis dari pengguna. Dia melaporkan masalah bahwa menjalankan
ls
membutuhkan waktu beberapa menit dalam direktori dengan lebih dari 15.000 entri dalam
$SCRATCH
[direktori untuk file sementara - kira-kira. trans.].
Ribuan file dalam satu direktori biasanya membuat kesulitan untuk sistem file dan ini jelas tidak dianjurkan. Pengguna tahu ini dan mengakui bahwa itu tidak baik, tetapi menyebutkan bahwa daftar di laptop-nya 1000 kali lebih cepat daripada di Sherlock. Tentu saja, itu menghantam kita. Karena itu, kami melihat lebih dalam.
Karena dia terlihat cantik
Kami melihat apa yang sebenarnya dilakukan ketika mendaftar direktori, dan mengapa prosesnya begitu lama. Pada kebanyakan distribusi modern,
ls
default ke
ls --color=auto
, karena semua orang suka warna.
Tetapi warna-warna indah memiliki harga: untuk setiap file,
ls
perlu mendapatkan informasi tentang jenis file, izinnya, bendera, atribut lanjutan, dan sejenisnya, untuk memilih warna yang sesuai.
Salah satu solusi sederhana untuk masalah ini adalah menonaktifkan warna secara bersamaan, tetapi bayangkan kemarahan pengguna. Dalam kasus apa pun Anda tidak dapat mengambil output warna, kami bukan monster.
Karena itu, kami melihat lebih dalam.
ls
mewarnai entri melalui
LS_COLORS
lingkungan
LS_COLORS
, yang
dircolors(1)
ditetapkan berdasarkan pada file konfigurasi
dir_colors(5)
. Ya, yang
dapat dieksekusi membaca file konfigurasi untuk membuat variabel lingkungan yang kemudian digunakan ls (dan jika Anda tidak tahu tentang file
pintu (lakukan), maka dir_colors
akan berfungsi , apa pun yang terjadi).
Kami akan mengerti lebih detail
Untuk menentukan skema pewarnaan mana yang menyebabkan pelambatan, kami membuat lingkungan eksperimental:
$ 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 untuk 10.000 file, tidak terlalu bagus.Ngomong-ngomong, kita memerlukan flag --color=always
: meskipun berubah menjadi ls --color=auto
, tetapi ls
mendeteksi ketika tidak terhubung ke terminal (misalnya, melalui saluran atau dengan redirection output) dan menonaktifkan pewarnaan jika diatur ke auto
. Pria pintar.
Jadi, apa yang begitu lama? Kami melihat dengan
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.000 panggilan ke
lstat()
, 10.000 panggilan ke
getxattr()
(yang semua orang gagal karena di lingkungan kita tidak ada atribut yang
capget()
), 10.000 panggilan untuk
capget()
.
Tentunya ini bisa dioptimalkan.
Atribut kemampuan Tidak
Mengikuti saran
bug 10 tahun yang lalu , kami mencoba untuk menonaktifkan pemeriksaan 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
Wow, akselerasi hingga 8 detik! Kami menyingkirkan semua panggilan
getxattr()
mahal ini, dan panggilan
capget()
juga menghilang, bagus.
Tapi tetap saja panggilan yang mengganggu ini ke
lstat()
tetap, meskipun ...
Berapa banyak bunga yang kamu butuhkan?
Karenanya, kami memeriksa
LS_COLORS
secara lebih rinci.
Pertama, mereka cukup mematikan variabel ini:
$ 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: atau = 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: * .tahun = 01; 31: *. sar = 01; 31: *. rar = 01; 31: *. alz = 01; 31: * .ce = 01; 31: *. kebun binatang = 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:
$ batalkan LS_COLORS
$ echo $ LS_COLORS
$ time ls --color = selalu $ SCRATCH / dont | wc -l
10.000
0m13.037s nyata
pengguna 0m0.077s
sys 0m1.092s
Apa!?! Masih 13 detik?
Ternyata ketika
LS_COLORS
lingkungan
LS_COLORS
tidak didefinisikan atau jika hanya salah satu elemennya
<type>=color:
ada, ia menggunakan basis data bawaan secara default dan masih menggunakan warna. Oleh karena itu, jika Anda ingin menonaktifkan pewarnaan untuk jenis file tertentu, Anda harus
DIR_COLORS
dengan
<type>=:
atau
<type> 00
dalam file
DIR_COLORS
.
Setelah banyak percobaan dan kesalahan, kami mempersempit pencarian kami untuk ini:
EXEC 00 SETUID 00 SETGID 00 CAPABILITY 00
apa yang tertulis sebagai
LS_COLORS='ex=00:su=00:sg=00:ca=00:'
Ini berarti: jangan mewarnai file dengan
kapabilitas atrubut, atau oleh bit
setuid/setgid
, atau oleh
flag yang dapat dieksekusi .
Mempercepat ls
Dan jika Anda tidak melakukan pemeriksaan ini, maka panggilan ke
lstat()
menghilang, dan sekarang masalah yang sama sekali berbeda:
$ 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 pada daftar 10.000 file, sebuah catatan.
Konfigurasikan Sherlock
Dari 13 detik dengan pengaturan default menjadi 0,3 detik dengan pengaturan kecil
LS_COLORS
berarti akselerasi 40 kali lipat karena kurangnya file
setuid
/
setgid
dan berwarna yang dapat dieksekusi. Bukan kerugian besar.
Tentu saja, sekarang ini dikonfigurasi di Sherlock untuk setiap pengguna.
Tetapi jika Anda ingin mengembalikan pewarnaan, Anda bisa kembali ke pengaturan default:
$ unset LS_COLORS
Tetapi kemudian pada direktori dengan sejumlah besar file, pastikan untuk membuat kopi saat bekerja.