Atrof-muhit o'zgaruvchisi jarayonni 40 marta tezlashtirganda

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, bajariladigan fayl muhit o'zgaruvchisini yaratish uchun konfiguratsiya faylini o'qiydi, undan keyin ls foydalanadi (va agar siz fayllar haqida bilmasangiz eshik (qilish), keyin dir_colors ishlaydi, Hamma narsaga qaramay).

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 ham ls --color=auto, lekin ls 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 10 yil oldingi xato, biz atributlarni tekshirishni o'chirishga harakat qildik Qobiliyatlari:

$ 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. Qobiliyatlari, lekin asta-sekin setuid/setgid, tomonidan ham emas bajarilish bayrog'i.

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

a Izoh qo'shish