Pan fydd newidyn amgylchedd yn cyflymu'r broses 40 gwaith

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, mae'r gweithredadwy yn darllen y ffeil ffurfweddu i greu newidyn amgylchedd, sydd wedyn yn ei ddefnyddio (ac os nad ydych chi'n gwybod am ffeiliau drws (gwneud), yna dir_colors bydd yn gweithio, Er gwaethaf popeth).

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 at ls --color=autoOnd ls 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 i auto. 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 byg o 10 mlynedd yn ôl, gwnaethom geisio analluogi gwirio priodoleddau galluoedd:

$ 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. galluoedd, ond fesul tipyn setuid/setgid, na chan baner gweithredadwyedd.

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

Ychwanegu sylw