Jodi a nou vle pale sou kèk nan dènye mizajou nan sistèm Sherlock la [sa a se yon gwoup pèfòmans segondè nan Inivèsite Stanford - approx. trans.], ki siyifikativman akselere lis fichye nan anyè ak yon gwo kantite antre.
Kontrèman ak atik regilye, sa a se plis nan yon rapò inisye sou fason nou regilyèman travay sou Sherlock kenbe li kouri nan pi bon li yo pou itilizatè nou yo. Nou espere pibliye plis atik tankou sa alavni.
Lis anpil fichye pran tan
Tout bagay te kòmanse ak yon kesyon sipò teknik nan men yon itilizatè. Li rapòte yon pwoblèm ke ekzekisyon an ls
pran kèk minit nan yon anyè ki gen plis pase 15 antre nan $SCRATCH
[anyè pou fichye tanporè - approx. liy].
Dè milye de fichiers nan yon sèl anyè dabitid poze yon chay pou sistèm fichier Et san mank pa rekòmande. Itilizatè a te konnen sa a epi li admèt ke li pa t 'bon, men mansyone ke lis la te 1000 fwa pi vit sou laptop li pase Sherlock. Natirèlman, sa a fè nou mal. Se konsa, nou gade pi fon.
Paske ls sanble bèl
Nou te gade sa li aktyèlman fè ls
lè lis yon anyè, e poukisa pwosesis la pran anpil tan. Sou pifò distribisyon modèn ls
pa default li kouri kòm ls --color=auto
, paske tout moun renmen koulè yo.
Men, bèl koulè vini nan yon pri: pou chak dosye ls
dwe jwenn enfòmasyon sou kalite dosye a, otorizasyon li yo, drapo, atribi pwolonje ak bagay sa yo nan lòd yo chwazi koulè ki apwopriye a.
Yon solisyon senp nan pwoblèm nan se enfim koulè nan ls tout ansanm, men imajine outraj la soti nan itilizatè yo. Anba okenn sikonstans ou ta dwe retire pwodiksyon an koulè, nou pa monstr.
Se konsa, nou gade pi fon. ls
koulè antre atravè anviwònman varyab LS_COLORS
, ki mete dircolors(1)
baze sou dosye konfigirasyon dir_colors(5)
... Wi,
Ann pran yon gade pi pre
Pou detèmine ki konplo koulè ki lakòz ralentissement la, nou te kreye yon anviwònman eksperimantal:
$ 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 segonn pou 10 dosye, pa trè bon.
An pasan, nou bezwen yon drapo
--color=always
: byenke li tounen vin jwennls --color=auto
menls
detekte lè li pa konekte ak yon tèminal (pa egzanp, pa tiyo oswa ak redireksyon pwodiksyon) epi li enfim koloran si li mete souauto
. Nèg entelijan.
Se konsa, kisa k ap pran anpil tan? Nou gade ak 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 apèl lstat()
, 10 apèl getxattr()
(ki tout echwe paske anviwònman nou an pa gen atribi ls ap chèche), 10 apèl capget()
.
Se vre wi sa a ka optimize.
Kapasite atribi? Non
Swiv konsèy
$ 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
Wow, jiska 8 segonn akselerasyon! Nou te debarase m de tout apèl sa yo chè getxattr()
, ak defi capget()
disparèt tou, gwo.
Men, toujou genyen apèl anmèdan sa yo lstat()
, Malgre…
Konbyen flè ou bezwen?
Se poutèt sa, nou te pran yon gade pi pre LS_COLORS
.
Premye nou tou senpleman enfim varyab sa a:
$ 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
Kisa!?! Toujou 13 segonn?
Li sanble ke lè anviwònman an varyab LS_COLORS
sèlman youn nan eleman li yo pa defini oswa ki manke <type>=color:
, li sèvi ak baz done entegre a pa default epi li toujou sèvi ak koulè. Se konsa, si ou vle enfim kolorizasyon pou yon kalite dosye sèten, ou bezwen pase sou plas li ak <type>=:
oswa <type> 00
nan dosye DIR_COLORS
.
Apre anpil esè ak erè, nou redwi rechèch nou an nan sa a:
EXEC 00
SETUID 00
SETGID 00
CAPABILITY 00
ki ekri kòm
LS_COLORS='ex=00:su=00:sg=00:ca=00:'
Sa vle di: pa fè koulè dosye pa atribi.
, ni pa
Nou akselere ls
Men, si ou pa fè nenpòt nan chèk sa yo, Lè sa a, apèl lstat()
disparèt, epi kounye a li se yon pwoblèm konplètman diferan:
$ 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 segonn sou yon lis 10 dosye, yon dosye.
Mete kanpe Sherlock
Soti nan 13 segonn ak anviwònman default a 0,3 segonn ak ajisteman minè LS_COLORS
vle di yon akselerasyon 40 fwa akòz absans la setuid
/ setgid
ak dosye ki gen koulè ègzekutabl. Pa tankou yon gwo pèt.
Natirèlman, sa a se kounye a configuré nan Sherlock pou chak itilizatè.
Men, si ou vle retounen koloran an, ou ka tou senpleman retounen nan anviwònman yo default:
$ unset LS_COLORS
Men, Lè sa a, sou anyè ki gen yon anpil nan dosye, asire w ke ou melanje kafe pandan li ap kouri ls
.
Sous: www.habr.com