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,
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 zuwals --color=auto
, ammals
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 zuwaauto
. 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
$ 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.
, ba ta
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