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.