Lokacin da canjin yanayi ya ƙara saurin aiwatar da sau 40

A yau muna son yin magana game da wasu sabbin abubuwan sabuntawa ga tsarin Sherlock [wannan gungu ne mai girma a Jami'ar Stanford - kusan. trans.], wanda ke haɓaka jeri fayiloli a cikin kundayen adireshi tare da babban adadin shigarwar.

Ba kamar labaran yau da kullun ba, wannan ƙari ne na rahoton mai ciki kan yadda muke aiki akai-akai akan Sherlock don ci gaba da gudana a mafi kyawun sa ga masu amfani da mu. Muna fatan za mu buga ƙarin labarai kamar haka nan gaba.

Jerin fayiloli da yawa yana ɗaukar lokaci

Duk ya fara da tambayar goyan bayan fasaha daga mai amfani. Ya bayar da rahoton matsalar cewa kisa ls yana ɗaukar 'yan mintoci kaɗan a cikin kundin adireshi tare da shigarwar sama da 15 a ciki $SCRATCH [directory don fayilolin wucin gadi - kimanin. layi].

Dubban fayiloli a cikin kundin adireshi ɗaya yawanci suna haifar da nauyi ga tsarin fayil kuma tabbas ba a ba da shawarar ba. Mai amfani ya san wannan kuma ya yarda cewa ba shi da kyau, amma ya ambata cewa lissafin ya yi sauri sau 1000 akan kwamfutar tafi-da-gidanka fiye da Sherlock. Tabbas wannan ya cutar da mu. Don haka muka duba zurfi.

Domin ls yayi kyau

Mun duba abin da yake yi a zahiri ls lokacin jera kundin adireshi, da kuma dalilin da yasa tsarin ke ɗaukar lokaci mai tsawo. Akan yawancin rabawa na zamani ls ta tsohuwa yana gudana kamar ls --color=auto, saboda kowa yana son launuka.

Amma kyawawan launuka suna zuwa a farashi: ga kowane fayil ls dole ne a sami bayanai game da nau'in fayil ɗin, izini, tutoci, tsawaita halaye da makamantansu domin zaɓar launi mai dacewa.

Magani ɗaya mai sauƙi ga matsalar shine a kashe launi a cikin ls gaba ɗaya, amma tunanin ɓacin ran masu amfani. Babu wani yanayi da ya kamata ku cire fitar da launi, mu ba dodanni ba ne.

Don haka muka duba zurfi. ls shigar da launuka ta hanyar canjin yanayi LS_COLORS, wanda aka saita dircolors(1) bisa ga fayil ɗin sanyi dir_colors(5)... Ee, mai aiwatarwa yana karanta fayil ɗin sanyi don ƙirƙirar canjin yanayi, wanda ls sannan yayi amfani da shi (kuma idan ba ku sani ba game da fayiloli ƙofar (yi), sannan dir_launi zai yi aiki, Duk da komai).

Mu duba sosai

Don sanin wane tsarin launi ya haifar da raguwa, mun ƙirƙiri yanayin gwaji:

$ 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 seconds don fayilolin 10, ba kyau sosai ba.

Af, muna bukatar tuta --color=always: ko da yake ya juya zuwa ls --color=auto, amma ls yana gano lokacin da ba'a haɗa shi da tasha (misali ta bututu ko tare da jujjuyawar fitarwa) kuma yana kashe launi idan an saita zuwa auto. Mutum mai hankali.

To me ke daukar lokaci mai tsawo haka? Mun duba da 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
[...]

Wow: 10 kira lstat(), 10 kira getxattr() (wanda duk ya kasa saboda yanayin mu ba shi da halayen da ls ke nema), kira 10 capget().

Tabbas ana iya inganta wannan.

Siffar iyawa? A'a

Bin shawara bug daga shekaru 10 da suka gabata, Mun yi ƙoƙarin musaki duba sifa damar:

$ 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

Kai, har zuwa 8 seconds na hanzari! Mun kawar da duk waɗannan kira masu tsada getxattr(), da kalubale capget() ya bace kuma, mai girma.

Amma har yanzu akwai wadannan kiraye-kirayen masu ban haushi lstat(), Ko da yake…

Furanni nawa kuke bukata?

Saboda haka, mun yi nazari sosai LS_COLORS.

Da farko mun kashe wannan canjin kawai:

$ 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

Menene!?! Har yanzu dakika 13?

Sai dai itace lokacin da yanayin ya canza LS_COLORS daya kawai daga cikin abubuwan da ba a bayyana ko ya ɓace ba <type>=color:, yana amfani da bayanan da aka gina ta hanyar tsoho kuma har yanzu yana amfani da launuka. Don haka idan kuna son musaki canza launin don takamaiman nau'in fayil, kuna buƙatar soke shi da shi <type>=: ko <type> 00 cikin fayil DIR_COLORS.

Bayan gwaji da kurakurai da yawa, mun takaita bincikenmu zuwa ga haka:

EXEC 00
SETUID 00
SETGID 00
CAPABILITY 00

wanda aka rubuta kamar

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

Wannan yana nufin: kar a canza fayilolin ta sifa. damar, amma bit by bit setuid/setgid, ba ta tutar aiwatarwa.

Muna sauri ls

Idan kuma baku yi ɗaya daga cikin waɗannan cak ɗin ba, to ku kira lstat() bace, kuma yanzu abu ne daban-daban:

$ 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 seconds akan jerin fayilolin 10, rikodin.

Saita Sherlock

Daga daƙiƙa 13 tare da saitunan tsoho zuwa 0,3 seconds tare da ƙananan gyare-gyare LS_COLORS yana nufin saurin ninka sau 40 saboda rashi setuid / setgid da fayilolin aiwatarwa masu launi. Ba irin wannan babban asara ba.

Tabbas, yanzu an saita wannan a cikin Sherlock don kowane mai amfani.

Amma idan kuna son dawo da canza launin, zaku iya komawa zuwa saitunan tsoho:

$ unset LS_COLORS

Amma sai a kan kundayen adireshi masu tarin fayiloli, tabbatar da yin kofi yayin da yake gudana ls.

source: www.habr.com

Add a comment