Heddiw rydym am siarad am rai o'r diweddariadau diweddaraf i system Sherlock [mae hwn yn glwstwr perfformiad uchel ym Mhrifysgol Stanford - tua. trans.], sy'n cyflymu rhestru ffeiliau mewn cyfeiriaduron â nifer fawr o gofnodion yn sylweddol.
Yn wahanol i erthyglau rheolaidd, mae hwn yn fwy o adroddiad mewnolwr ar sut rydym yn gweithio'n rheolaidd ar Sherlock i'w gadw i redeg ar ei orau i'n defnyddwyr. Gobeithiwn gyhoeddi mwy o erthyglau fel hyn yn y dyfodol.
Mae rhestru llawer o ffeiliau yn cymryd amser
Dechreuodd y cyfan gyda chwestiwn cymorth technegol gan ddefnyddiwr. Adroddodd y broblem bod y gweithredu ls
yn cymryd ychydig funudau mewn cyfeiriadur gyda dros 15 o gofnodion ynddo $SCRATCH
[cyfeiriadur ar gyfer ffeiliau dros dro - tua. lôn].
Mae miloedd o ffeiliau mewn un cyfeiriadur fel arfer yn faich ar y system ffeiliau ac yn bendant nid yw'n cael ei argymell. Roedd y defnyddiwr yn gwybod hyn a chyfaddefodd nad oedd yn dda, ond soniodd fod y rhestriad 1000 gwaith yn gyflymach ar ei liniadur na Sherlock. Wrth gwrs, mae hyn yn brifo ni. Felly edrychon ni'n ddyfnach.
Achos mae'n edrych yn neis
Gwnaethom edrych ar yr hyn y mae'n ei wneud mewn gwirionedd ls
wrth restru cyfeiriadur, a pham mae'r broses yn cymryd cymaint o amser. Ar y rhan fwyaf o ddosbarthiadau modern ls
yn ddiofyn mae'n rhedeg fel ls --color=auto
, oherwydd mae pawb yn hoffi'r lliwiau.
Ond daw lliwiau hardd am bris: am bob ffeil ls
rhaid iddo gael gwybodaeth am y math o ffeil, ei chaniatadau, fflagiau, priodoleddau estynedig ac ati er mwyn dewis y lliw priodol.
Un ateb syml i'r broblem yw analluogi lliw yn gyfan gwbl, ond dychmygwch ddicter defnyddwyr. Ni ddylech o dan unrhyw amgylchiadau dynnu'r allbwn lliw i ffwrdd, nid ydym yn angenfilod.
Felly edrychon ni'n ddyfnach. ls
cofnodion lliwiau trwy newidyn amgylchedd LS_COLORS
, sy'n cael ei osod dircolors(1)
yn seiliedig ar ffeil ffurfweddu dir_colors(5)
... Ie,
Gadewch i ni edrych yn agosach
I benderfynu pa gynllun lliw sy'n achosi'r arafu, fe wnaethon ni greu amgylchedd arbrofol:
$ 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 eiliad ar gyfer 10 o ffeiliau, ddim yn dda iawn.
Gyda llaw, mae angen baner
--color=always
: er ei fod yn troi atls --color=auto
Ondls
yn canfod pan nad yw wedi'i gysylltu â therfynell (e.e. trwy bibell neu ag ailgyfeirio allbwn) ac yn analluogi lliwio os yw wedi'i osod iauto
. Boi clyfar.
Felly beth sy'n cymryd cymaint o amser? Edrychon ni gyda 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
[...]
Waw: 10 o alwadau lstat()
, 10 o alwadau getxattr()
(sydd i gyd yn methu oherwydd nad oes gan ein hamgylchedd y priodoleddau y mae'n chwilio amdanynt), 10 o alwadau capget()
.
Yn sicr gellir optimeiddio hyn.
Gallu priodoli? Naddo
Yn dilyn cyngor
$ 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
Waw, hyd at 8 eiliad o gyflymiad! Cawsom wared ar yr holl alwadau drud hynny getxattr()
, a heriau capget()
wedi diflannu hefyd, gwych.
Ond mae'r galwadau annifyr hyn o hyd lstat()
, Er bod…
Faint o flodau sydd eu hangen arnoch chi?
Felly, cymerasom olwg agosach LS_COLORS
.
Yn gyntaf fe wnaethom analluogi'r newidyn hwn:
$ 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
Beth!?! 13 eiliad o hyd?
Mae'n troi allan pan fydd y newidyn amgylchedd LS_COLORS
dim ond un o'i elfennau sydd heb ei ddiffinio neu sydd ar goll <type>=color:
, mae'n defnyddio'r gronfa ddata adeiledig yn ddiofyn ac yn dal i ddefnyddio lliwiau. Felly os ydych chi am analluogi lliwio ar gyfer math penodol o ffeil, mae angen i chi ei ddiystyru <type>=:
neu <type> 00
mewn ffeil DIR_COLORS
.
Ar ôl llawer o brofi a methu, gwnaethom gyfyngu ein chwiliad i lawr i hyn:
EXEC 00
SETUID 00
SETGID 00
CAPABILITY 00
a ysgrifenir fel
LS_COLORS='ex=00:su=00:sg=00:ca=00:'
Mae hyn yn golygu: peidiwch â lliwio ffeiliau yn ôl priodoledd.
, na chan
Rydym yn cyflymu ls
Ac os nad ydych yn gwneud unrhyw un o'r gwiriadau hyn, yna galwadau lstat()
diflannu, a nawr mae'n fater hollol wahanol:
$ 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 eiliad ar restr o 10 o ffeiliau, cofnod.
Sefydlu Sherlock
O 13 eiliad gyda gosodiadau diofyn i 0,3 eiliad gyda mân addasiadau LS_COLORS
yn golygu cyflymiad 40-plyg oherwydd yr absenoldeb setuid
/ setgid
a ffeiliau gweithredadwy lliw. Ddim yn golled mor fawr.
Wrth gwrs, mae hyn bellach wedi'i ffurfweddu yn Sherlock ar gyfer pob defnyddiwr.
Ond os ydych chi am ddychwelyd y lliwio, gallwch chi ddychwelyd i'r gosodiadau diofyn:
$ unset LS_COLORS
Ond yna ar gyfeiriaduron gyda llawer o ffeiliau, gofalwch eich bod yn bragu coffi tra ei fod yn rhedeg ls
.
Ffynhonnell: hab.com