Bugun biz Sherlok tizimidagi so'nggi yangilanishlar haqida gaplashmoqchimiz [bu Stenford universitetidagi yuqori samarali klaster - taxminan. trans.], bu ko'p sonli yozuvlarga ega kataloglarda fayllarni ro'yxatga olishni sezilarli darajada tezlashtiradi.
Oddiy maqolalardan farqli o'laroq, bu ko'proq Sherlokning foydalanuvchilarimiz uchun eng yaxshi ishlashini ta'minlash uchun qanday qilib muntazam ishlayotganimiz haqidagi insayder hisobotidir. Kelajakda shunga o'xshash maqolalarni ko'proq nashr etishga umid qilamiz.
Ko'p fayllarni ro'yxatga olish vaqt talab etadi
Hammasi foydalanuvchining texnik yordam savoli bilan boshlandi. U qatl bilan bog'liq muammo haqida xabar berdi ls
15 000 dan ortiq yozuvlari bo'lgan katalogda bir necha daqiqa davom etadi $SCRATCH
[vaqtinchalik fayllar uchun katalog - taxminan. qator].
Bitta katalogdagi minglab fayllar odatda fayl tizimiga yuk bo'ladi va aniq tavsiya etilmaydi. Foydalanuvchi buni bilar edi va bu yaxshi emasligini tan oldi, lekin listing uning noutbukida Sherlokdan 1000 marta tezroq ekanligini eslatib o'tdi. Albatta, bu bizga zarar keltirdi. Shunday qilib, biz chuqurroq qaradik.
Chunki ls chiroyli ko'rinadi
Biz aslida nima qilishini ko'rib chiqdik ls
katalogni ro'yxatga kiritishda va jarayon nima uchun shunchalik uzoq davom etadi. Ko'pgina zamonaviy tarqatishlarda ls
sukut bo'yicha u sifatida ishlaydi ls --color=auto
, chunki hamma ranglarni yaxshi ko'radi.
Lekin chiroyli ranglar qimmatga tushadi: har bir fayl uchun ls
tegishli rangni tanlash uchun fayl turi, uning ruxsatlari, bayroqlari, kengaytirilgan atributlari va shunga o'xshashlar haqida ma'lumot olishi kerak.
Muammoning oddiy yechimlaridan biri ls-dagi rangni butunlay o'chirib qo'yishdir, lekin foydalanuvchilarning g'azabini tasavvur qiling. Hech qanday holatda siz rang chiqishini olib tashlamasligingiz kerak, biz yirtqich hayvonlar emasmiz.
Shunday qilib, biz chuqurroq qaradik. ls
muhit o'zgaruvchisi orqali ranglar yozuvlari LS_COLORS
, o'rnatilgan dircolors(1)
konfiguratsiya fayliga asoslanadi dir_colors(5)
... Ha,
Keling, batafsil ko'rib chiqaylik
Qaysi rang sxemasi sekinlashuvga olib kelishini aniqlash uchun biz eksperimental muhit yaratdik:
$ 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 10 ta fayl uchun 000 soniya, unchalik yaxshi emas.
Aytgancha, bizga bayroq kerak
--color=always
: o'girsa hamls --color=auto
, lekinls
terminalga ulanmaganligini aniqlaydi (masalan, quvur orqali yoki chiqish yoʻnalishini yoʻnaltirish bilan) va agar sozlangan boʻlsa, rang berishni oʻchirib qoʻyadi.auto
. Aqlli yigit.
Xo'sh, nima uchun bunchalik uzoq davom etmoqda? bilan qaradik 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
[...]
Voy: 10 000 qo'ng'iroq lstat()
, 10 000 qo'ng'iroqlar getxattr()
(bularning barchasi muvaffaqiyatsiz tugadi, chunki bizning muhitimiz ls izlayotgan atributlarga ega emas), 10 000 qo'ng'iroq capget()
.
Albatta, buni optimallashtirish mumkin.
Imkoniyatlar atributi? yoq
Maslahatga amal qilish
$ 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
Voy, 8 soniyagacha tezlashtirish! Biz barcha qimmat qo'ng'iroqlardan xalos bo'ldik getxattr()
, va qiyinchiliklar capget()
ham g'oyib bo'ldi, ajoyib.
Ammo bu zerikarli qo'ng'iroqlar hali ham bor lstat()
, Garchi…
Sizga qancha gul kerak?
Shuning uchun biz batafsilroq ko'rib chiqdik LS_COLORS
.
Avval biz ushbu o'zgaruvchini o'chirib qo'ydik:
$ 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
Nima!?! Hali 13 soniya bormi?
Ma'lum bo'lishicha, qachon atrof-muhit o'zgaruvchan LS_COLORS
uning elementlaridan faqat bittasi aniqlanmagan yoki yo'q <type>=color:
, u sukut bo'yicha o'rnatilgan ma'lumotlar bazasidan foydalanadi va hali ham ranglardan foydalanadi. Shunday qilib, ma'lum bir fayl turi uchun rang berishni o'chirib qo'ymoqchi bo'lsangiz, uni bekor qilishingiz kerak <type>=:
yoki <type> 00
faylda DIR_COLORS
.
Ko'p sinov va xatolardan so'ng, biz qidiruvimizni quyidagilarga qisqartirdik:
EXEC 00
SETUID 00
SETGID 00
CAPABILITY 00
deb yoziladi
LS_COLORS='ex=00:su=00:sg=00:ca=00:'
Buning ma'nosi: fayllarni atribut bo'yicha rang bermang.
, tomonidan ham emas
Tezlashtiramiz ls
Va agar siz ushbu tekshiruvlardan birini qilmasangiz, qo'ng'iroq qiling lstat()
yo'qoladi va endi bu butunlay boshqa masala:
$ 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 10 ta fayl ro'yxatida 000 soniya, rekord.
Sherlock o'rnatilmoqda
Standart sozlamalar bilan 13 soniyadan kichik sozlashlar bilan 0,3 soniyagacha LS_COLORS
yo'qligi sababli 40 marta tezlanishni bildiradi setuid
/ setgid
va rangli bajariladigan fayllar. Unchalik katta yo'qotish emas.
Albatta, bu endi Sherlokda har bir foydalanuvchi uchun sozlangan.
Ammo agar siz rangni qaytarishni istasangiz, oddiy sozlamalarga qaytishingiz mumkin:
$ unset LS_COLORS
Ammo keyin ko'p fayllarga ega bo'lgan kataloglarda, u ishlayotgan paytda kofe pishirganingizga ishonch hosil qiling ls
.
Manba: www.habr.com