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,
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=auto
Lakinls
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
$ 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.
, nə də tərəfindən
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