Ketika variabel lingkungan mempercepat proses hingga 40 kali

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.

Source: https://habr.com/ru/post/id450806/


All Articles