Bir ortam değişkeni süreci 40 kat hızlandırdığında

Bugün Sherlock sistemindeki en son güncellemelerden bazıları hakkında konuşmak istiyoruz [bu, Stanford Üniversitesi'ndeki yüksek performanslı bir kümedir - yaklaşık. trans.], çok sayıda girişi olan dizinlerdeki dosyaların listelenmesini önemli ölçüde hızlandırır.

Normal makalelerden farklı olarak bu, Sherlock'un kullanıcılarımız için en iyi şekilde çalışmasını sağlamak amacıyla düzenli olarak nasıl çalıştığımıza dair içeriden öğrenilen bir rapordur. Gelecekte buna benzer daha fazla makale yayınlamayı umuyoruz.

Çok sayıda dosyanın listelenmesi zaman alır

Her şey bir kullanıcının teknik destek sorusuyla başladı. İnfazdaki sorunu bildirdi ls 15'den fazla girişin bulunduğu bir dizinde birkaç dakika sürer $SCRATCH [geçici dosyalar için dizin - yakl. Lane].

Bir dizinde binlerce dosya genellikle dosya sistemine yük oluşturur ve kesinlikle önerilmez. Kullanıcı bunu biliyordu ve bunun iyi olmadığını kabul etti ancak dizüstü bilgisayarında listelemenin Sherlock'tan 1000 kat daha hızlı olduğundan bahsetti. Tabii bu bizi üzdü. Bu yüzden daha derinlere baktık.

Çünkü güzel görünüyor

Aslında ne işe yaradığına baktık ls Bir dizini listelerken ve sürecin neden bu kadar uzun sürdüğünü. Çoğu modern dağıtımda ls varsayılan olarak şu şekilde çalışır ls --color=autoÇünkü herkes renkleri sever.

Ancak güzel renklerin bir bedeli vardır: her dosya için ls Uygun rengi seçebilmek için dosya türü, izinleri, bayrakları, genişletilmiş özellikleri ve benzerleri hakkında bilgi edinmesi gerekir.

Soruna basit bir çözüm, ls'deki rengi tamamen devre dışı bırakmaktır, ancak kullanıcıların öfkesini bir düşünün. Hiçbir durumda renkli çıktıyı elinizden almamalısınız, biz canavar değiliz.

Bu yüzden daha derinlere baktık. ls ortam değişkeni aracılığıyla renk girişleri LS_COLORS, ayarlanmış olan dircolors(1) yapılandırma dosyasına dayalı dir_colors(5). Evet, yürütülebilir dosya, bir ortam değişkeni oluşturmak için yapılandırma dosyasını okur; bu daha sonra ls'yi kullanır. (ve dosyalar hakkında bilginiz yoksa kapı (yap), ardından dir_colors çalışacak, Her şeye rağmen).

Hadi daha yakından bakalım

Hangi renk şemasının yavaşlamaya neden olduğunu belirlemek için deneysel bir ortam oluşturduk:

$ 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 dosya için 10 saniye, pek iyi değil.

Bu arada, bir bayrağa ihtiyacımız var --color=always: dönmesine rağmen ls --color=autoama ls bir terminale bağlı olmadığını algılar (örn. boruyla veya çıkış yönlendirmeyle) ve eğer ayarlandıysa renklendirmeyi devre dışı bırakır auto. Akıllı adam.

Peki bu kadar uzun süren ne? ile baktık 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
[...]

Vay be: 10 arama lstat(), 10 çağrı getxattr() (ortamımızın aradığı niteliklere sahip olmaması nedeniyle hepsi başarısız oluyor), 10 çağrı capget().

Elbette bu optimize edilebilir.

Yetenekler özelliği? Hayır

Tavsiyeye uymak 10 yıl önceki hataözellik kontrolünü devre dışı bırakmayı denedik yetenekleri:

$ 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

Vay, 8 saniyeye kadar hızlanma! Tüm bu pahalı aramalardan kurtulduk getxattr()ve zorluklar capget() ben de ortadan kayboldum, harika.

Ama hala sinir bozucu aramalar var lstat(), Rağmen…

Kaç çiçeğe ihtiyacın var?

Bu nedenle daha yakından baktık LS_COLORS.

İlk önce bu değişkeni basitçe devre dışı bıraktık:

$ 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

Ne!?! Hala 13 saniye mi?

Ortam değişkeni olduğunda ortaya çıktı LS_COLORS öğelerinden yalnızca biri tanımlanmamış veya eksik <type>=color:varsayılan olarak yerleşik veritabanını kullanır ve renkleri kullanmaya devam eder. Dolayısıyla, belirli bir dosya türü için renklendirmeyi devre dışı bırakmak istiyorsanız, bunu geçersiz kılmanız gerekir. <type>=: veya <type> 00 dosyada DIR_COLORS.

Pek çok deneme yanılmadan sonra aramamızı şu şekilde daralttık:

EXEC 00
SETUID 00
SETGID 00
CAPABILITY 00

şu şekilde yazılır

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

Bu şu anlama gelir: dosyaları özniteliğe göre renklendirmeyin. yetenekleriama yavaş yavaş setuid/setgid, ne de yürütülebilirlik bayrağı.

Hızlandırıyoruz ls

Ve eğer bu kontrollerden herhangi birini yapmazsanız, o zaman çağrılar lstat() ortadan kayboluyor ve şimdi bu tamamen farklı bir konu:

$ 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 dosyalık listede 10 saniye, bir rekor.

Sherlock'u kurma

Varsayılan ayarlarla 13 saniyeden küçük ayarlamalarla 0,3 saniyeye LS_COLORS yokluğundan dolayı 40 kat hızlanma anlamına gelir setuid / setgid ve renkli yürütülebilir dosyalar. Çok büyük bir kayıp değil.

Elbette bu artık Sherlock'ta her kullanıcı için yapılandırılmıştır.

Ancak renklendirmeyi geri döndürmek istiyorsanız varsayılan ayarlara dönebilirsiniz:

$ unset LS_COLORS

Ancak çok sayıda dosya içeren dizinlerde kahveyi çalışırken demlediğinizden emin olun. ls.

Kaynak: habr.com

Yorum ekle