Bir mühit dəyişəni prosesi 40 dəfə sürətləndirdikdə

Bu gün biz Sherlock sistemindəki ən son yeniləmələrdən bəziləri haqqında danışmaq istəyirik [bu, Stenford Universitetində yüksək performanslı klasterdir - təqribən. trans.], bu da çoxlu sayda girişi olan qovluqlarda faylların siyahısını əhəmiyyətli dərəcədə sürətləndirir.

Adi məqalələrdən fərqli olaraq, bu, istifadəçilərimiz üçün ən yaxşı şəkildə işləməsini təmin etmək üçün Sherlock üzərində müntəzəm olaraq necə işlədiyimiz haqqında daha çox insayder hesabatıdır. Ümid edirik ki, gələcəkdə bu kimi məqalələri daha çox dərc edəcəyik.

Bir çox faylları siyahıya almaq vaxt tələb edir

Hər şey bir istifadəçinin texniki dəstək sualı ilə başladı. O, edam problemini bildirdi ls 15-dən çox giriş olan bir kataloqda bir neçə dəqiqə çəkir $SCRATCH [müvəqqəti fayllar üçün kataloq - təqribən. zolaq].

Bir qovluqdakı minlərlə fayl adətən fayl sisteminə yük yaradır və qətiliklə tövsiyə edilmir. İstifadəçi bunu bilirdi və bunun yaxşı olmadığını etiraf etdi, lakin siyahının onun noutbukunda Sherlock-dan 1000 dəfə sürətli olduğunu qeyd etdi. Təbii ki, bu bizə zərər verdi. Beləliklə, daha dərindən baxdıq.

Çünki gözəl görünür

Biz bunun əslində nə etdiyinə baxdıq ls kataloqu siyahıya salarkən və prosesin niyə bu qədər uzun sürdüyünü. Ən müasir paylamalarda ls default olaraq kimi işləyir ls --color=auto, çünki hər kəs rəngləri sevir.

Ancaq gözəl rənglər bir qiymətə gəlir: hər fayl üçün ls müvafiq rəngi seçmək üçün fayl növü, onun icazələri, bayraqları, genişləndirilmiş atributları və s. haqqında məlumat əldə etməlidir.

Problemin sadə həlli ls-də rəngi tamamilə söndürməkdir, lakin istifadəçilərin qəzəbini təsəvvür edin. Heç bir halda rəng çıxışını götürməməlisiniz, biz canavar deyilik.

Beləliklə, daha dərindən baxdıq. ls mühit dəyişəni vasitəsilə rəng girişləri LS_COLORS, müəyyən edilir dircolors(1) konfiqurasiya faylına əsaslanır dir_colors(5)... Bəli, icra olunan mühit dəyişənini yaratmaq üçün konfiqurasiya faylını oxuyur və bundan sonra istifadə edir (və faylları bilmirsinizsə qapı (edin), sonra dir_colors işləyəcək, Hər şeyə baxmayaraq).

Gəlin daha yaxından nəzər salaq

Hansı rəng sxeminin yavaşlamağa səbəb olduğunu müəyyən etmək üçün eksperimental mühit yaratdıq:

$ 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 fayl üçün 10 saniyə, çox yaxşı deyil.

Yeri gəlmişkən, bayraq lazımdır --color=always: çevrilsə də ls --color=autoLakin ls terminala qoşulmadıqda (məsələn, boru ilə və ya çıxış yönləndirməsi ilə) aşkar edir və təyin edildikdə rəngləməni söndürür. auto. Ağıllı oğlan.

Bəs bu qədər uzun çəkən nədir? ilə baxdıq 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: 10 zəng lstat(), 10 zəng getxattr() (bunların hamısı uğursuz olur, çünki mühitimiz ls axtardığı atributlara malik deyil), 10 zəng capget().

Şübhəsiz ki, bu optimallaşdırıla bilər.

Bacarıqlar atributu? Xeyr

Məsləhətdən sonra 10 il əvvələ aid səhv, biz atribut yoxlamasını söndürməyə çalışdıq imkanları:

$ 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 saniyəyə qədər sürətlənmə! Biz bütün o bahalı zənglərdən qurtulmuşuq getxattr(), və çətinliklər capget() da yox oldu, əla.

Amma yenə də bu bezdirici zənglər var lstat(), Baxmayaraq ki…

Neçə çiçək lazımdır?

Buna görə də daha yaxından baxdıq LS_COLORS.

Əvvəlcə bu dəyişəni qeyri-aktiv etdik:

$ 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

Nə!?! Hələ 13 saniyə?

Belə çıxır ki, mühit dəyişən zaman LS_COLORS onun elementlərindən yalnız biri müəyyən edilməyib və ya yoxdur <type>=color:, o, standart olaraq daxili verilənlər bazasından istifadə edir və hələ də rənglərdən istifadə edir. Beləliklə, müəyyən bir fayl növü üçün rəngləşdirməni söndürmək istəyirsinizsə, onu ləğv etməlisiniz <type>=: və ya <type> 00 faylda DIR_COLORS.

Çoxlu sınaq və səhvlərdən sonra axtarışımızı bu qədər daraltdıq:

EXEC 00
SETUID 00
SETGID 00
CAPABILITY 00

kimi yazılır

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

Bu o deməkdir ki: faylları atributla rəngləməyin. imkanları, amma yavaş-yavaş setuid/setgid, nə də tərəfindən icra qabiliyyəti bayrağı.

Biz sürətləndiririk ls

Və bu yoxlamalardan heç birini etməsəniz, zəng edin lstat() yox oldu və indi tamam başqa məsələdir:

$ 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 fayl siyahısında 10 saniyə, rekord.

Şerlok qurulur

Standart parametrlərlə 13 saniyədən kiçik düzəlişlərlə 0,3 saniyəyə qədər LS_COLORS olmaması səbəbindən 40 qat sürətlənmə deməkdir setuid / setgid və rəngli icra edilə bilən fayllar. O qədər də böyük itki deyil.

Əlbəttə ki, bu, indi Sherlock-da hər bir istifadəçi üçün konfiqurasiya edilmişdir.

Ancaq rəngi qaytarmaq istəyirsinizsə, sadəcə olaraq standart parametrlərə qayıda bilərsiniz:

$ unset LS_COLORS

Ancaq sonra çoxlu faylları olan qovluqlarda, işləyərkən qəhvə dəmlədiyinizə əmin olun ls.

Mənbə: www.habr.com

Добавить комментарий