2016ǯ10��24��

ISUCON6 ��ͥ�����ޤ���

¤Ï¤Æ¤Ê¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ËÅÐÏ¿

@methane �Ǥ��������ȥ���̤ꡢ ISUCON �ǤȤ��Ȥ�ͥ�����Ƥ��ޤ�����

��������С��ϡ�(ͽ����Ʊ����) @kizkoh (����ե�ô��), @mecha_g3 (���ץ�ô��) �Ǥ�����

���ͽ���ΤȤ��ϥ��åĥ�ȥ��ץ��񤤤Ƥ����ΤǤ���������Ǥ� netstat -tn (��Ϸ��), top, dstat -ai, sudo perf top �ʤɤ�ߤĤĻؼ���������ꡢ���ˤ��᤿�ꡢ������̤�и����ä� node.js & react.js �к��򤷤��꤬��ʻŻ��ǡ����ȤϽ��פΥ���ե�Υ����������̤ˤ���Ȥ��� MySQL �� docker ���鳰���ƴ���Ū�ʥ��塼�˥󥰤����줿�� Go ��100�����ٽ񤤤������Ǥ���

���Ū�ˤ�ͥ���Ǥ��ޤ����������С���2�ͤ��褯���������֤Ǥ���Ϥ�ȯ�����Ƥ��줿�Τ��Ф��� �ͤ���ά�ߥ������פ���������������夲���ʤ��ä��Τǡ��Ǹ�ޤǥҥ�ҥ䤷�Ƥ��ޤ�����

�Ȥ������Ȥǡ� nginx �� Go �Ǥ�ä����Ȥϥ��С�����ͤ��̤˵�����񤤤Ƥ����Ȼפ��Τǡ� ��������ǹͤ������ȡ���ʬ�Ǥ�ä����Ȥ����ˤ���ƻؼ��������ȡ����ιͻ���񤤤Ƥ��������Ȼפ��ޤ���

����Ƚ�������ˤĤ���

����ϡ��ꥢ�륿�����¾�ͤν񤤤�����¾�Υ桼�����˸�����褦�ʤ��������Ǽ��ĤǤ�����

��������ħŪ�ǡ�

  • �ե���Ȥˤ���Τ��̾�� Web �����С��ǤϤʤ��ơ� react.js ��Ȥä����ץ��ޤ� node.js ������ (�ʲ�react)
  • ���������С����ץ������������ǥ��ץ꤬¸�ߤ�������ˤϳƸ���μ��������� (�ʲ�app)
  • app �ΥХå�����ɤȤ��Ƥ� MySQL ������
  • react, app, MySQL �����٤� docker �ˤʤäƤ��ơ� docker-compose ��ư���Ƥ���

�Ȥ�����ΤǤ�����

�٥���ޡ������� react �� Web ���ץ�����ꤷ�Ƥ���褦�ǡ� bundle.js �Ȥ����ե������react �� �����Τ�ޤ��󤬡����֤󥵡��С������ɤȥ��饤����ȥ����ɤǶ��̤ʥե�����ˤ�1�Х��ȤǤ��Ѳ������� FAIL ���Ƥ����Τǡ����ʤ긷̩�˥����å����Ƥ����Τ��Ȼפ��ޤ���

Docker �� @kizkoh ��Ƚ��Ȥ������ȤǤ������� node.js & react ������ʬ����ʤ��Τ��Ȥˤ����Ĥ餤��

��react ��Ƚ��ʤ��Ⱦ��Ƥʤ�����ʤ�¿�����Ѱդ����̣�ʤ��������äȴ�ñ�ˤ����ϥܥȥ�ͥå�����ʤ��ʤäơ� 1������������餽���ɴ�ͤ�ž�����Ʋ�ɴ����С��������褦�������������ʤ�Go�����դ����� �ͥåȥ���Ƕ��ϥץ쥤���륵���С���Go�dz�ȯ���Ƥ��ͤ�����դ������ϽФ��о��Ƥ�פ� ���С��ȼ�ʬ�˸���ʹ�����ƥ������Ȥ��ޤ�����

������ (~14:00 ���餤)

���٥���򽪤��� @kizkoh �� nginx �ν����� @mecha_g3 �����ץ곫ȯ�����塼�˥󥰤ν����� ���Ƥ��뤢�����ˡ��ե���Ȥ� react �� server.jsx �Ȥ����ե������ Go ���ץ�Υ롼�ƥ�����ʬ�򸫤ơ� �ե���Ȥ��ɲä��� nginx �Υ�С����ץ��������� (/api/ ��ľ�� app �˥�С����ץ��������ơ�����ʳ��� react �˥�С����ץ���������ʤ�) ��ޤȤ᤿�ꡢ @mecha_g3 �� room �Υ�����경��Ϥ��褦�˻ؼ������ꤷ�ޤ�����

���ΤȤ��Ϥޤ� react ���ܥȥ�ͥå��Ǥʤ��ʤ�Ȥ����ڴ�Ū��������ä��Τǡ��ޤ��� @mecha_g3 ������񤯤Ȥ����Ȥ���� SSE���ۿ�����Ȥ����ǥ�����경��ʤ�Ƥ�餤�Ĥġ� react �� docker �����������Ф����ꡢ��ͭ���Ƥ�����ȯ�Ķ��� MySQL �򥻥åȥ��åפ��ƥ���ե�ƹ�����Ǥ� app ��ư���ǧ���Ǥ���������Ѱդ��Ƥ��顢ʢ�򤯤��ä� react �� server.jsx �Ȥ����ե�������ɤ߻Ϥ�ޤ����� (server.jsx�Υ�����������)

��������ȡ��������� renderString() ���Ƥ���Ȥ����ϡ���������HTML�ϥ֥饦���Ǹ������������ɤ���ä����������Τ� �����狼��ʤ���ˡ�HTML�����ˤϤ��֤󥯥饤����Ȥȥ����С������������ǧ���뤿��Τ�ΤȻפ�������å����ब���äơ� ���򤷤��� fail ����Τ�ʬ����ʤ��Ǥ���������ꤿ���ʤ���ʬ�˸�����������������ˤϤ����ˤ⤳������塼�˥󥰤��Ƥ��� �Ȥ���ʷ�ϵ��� /img/:id �Ȥ����ѥ��ν����򤷤Ƥ��륳���ɤ��ܤ˻ߤޤ�ޤ�����������ɤ���ä�XML���Ǥ���Τ������狼��ʤ� ��ΤΡ��쥹�ݥ󥹥إå������ꤷ�Ƥ���Ȥ����������� svg ���������Ƥ��뤳�Ȥ����������Ǥ�����

/img/:id: ����ʬ�� renderString() �ǤϤʤ��� renderToStaticMarkup() �Ȥ����ؿ���ȤäƤ����Τǡ����δؿ��Υ�ե���󥹤� õ���Ƹ��Ƥߤޤ���

https://facebook.github.io/react/docs/react-dom-server.html#rendertostaticmarkup

Similar to renderToString, except this doesn't create extra DOM attributes such as data-reactid, that React uses internally. This is useful if you want to use React as a simple static page generator, as stripping away the extra attributes can save lots of bytes.

�פ���� react ����Ѥ������äƤʤ��ץ졼��ʥǡ������뤿��δؿ��Τ褦�Ǥ�������Ͻ���Ԥ���Υҥ�Ȥ�������XML�����Ȥ� �����ˤ�Ť��������������򥭥�å��夹��Ȥ� 304 not modified ���֤��а쵤�� react ������ˤʤ�ʤ��ʤ����������Ȥ�����˾Ūͽ¬��Ω�Ƥޤ�����

�ʤ���������λ��ˤ���äȥǥ��쥯�ȥ�ĥ꡼���ܤ��̤��Ƥߤ��顢������ components/ �Ȥ����ǥ��쥯�ȥ��۲��˥���ݡ��ͥ�ȡʥƥ�ץ졼��+�����ɡˤ����ä� xml ���������Ƥ��� Canvas �Ȥ�������ݡ��ͥ�Ȥ�Ƚ��ޤ��������Υǥ��쥯�ȥ�򸫤Ƥ���Ф��θ����ά���ä��Ѥ�ä����⤷��ޤ��� ����äȸ�������С�Ʊ���ǥ��쥯�ȥ�ˤ��� Room �Ȥ�������ݡ��ͥ�Ȥ�Ʊ�� Canvas ����ݡ��ͥ�Ȥ����Ѥ��Ƥ�Τ�Ƚ��Τǡ� /img/:id ���� ��®�����Ƥ� react ���Τ��ڤ��Ϥʤ�ʤ��������� /room/:id ���к���ɬ�פ��Ȥ�������ǿʤ���Ƥ����Ϥ��Ǥ���

��ĥ���֤Ǥ��Τ�ʤ����Ѥ�10���ݤ������٥���ޡ���������������å����Ƥ뤫�狼��ʤ��Τ�10���ݤ��ơ���100�ܤ��ݤ������͡������ʤ��͡�

������ (~16:30 ���餤)

react ���� ssl �򳰤��ƥե���Ȥ� nginx �ˤ���Ȥ� docker �����Ȥ����̤꽪��ä��Τǡ� @kizkoh �ˤϡ֤�ꤿ�����Ȥ��ĤäƤ�ʤ��äƤƤ������ɡ� ̵���ʤ���˲������褦�ȴ�ĥ���꽪�פ˸����ƵٷƼ�äƤ����ơפȤ����ؼ���Ф��� app ���֤� json �Ȥ���� react ���Ѵ����ƥ֥饦�����֤� svg ����٤ʤ��顢 ���� svg �� Go �������Υǡ�����¤����ľ����������褦�� fmt.Printf �β�����ޤ��� (������������)

@mecha_g3 �Υ�����경������äƤ���Ĥʤ����ߡ�svg�Ϥ��ä���٥����ѥ�������Go�˻��äƤ��äƤ�svg�����Ϸ빽�Ť���������ˤΤǡ� @mecha_g3 �˥���å������ꡣ ���λ�����ä����򤬤äơ� stroke ���񤫤줿�Ȥ��Υ���å���ι����ǤҤȹ��ס� svg �ι����� stroke ���ɵ�����꡼�ʤΤǡ���������������ΤǤϤʤ��ơ�ñ���ɲä��줿 stroke ��Ǹ�� </svg> �����μ�����������������ˤ��Ƥ�餤�ޤ������������ˤɤ줯�餤�ƶ������ä��Τ��Ϥ狼��ޤ��󤬡����줬��ñ�ˤǤ����Τ�Go�餷����ʬ�Ǥ�����

�ȤϤ��������ι��פ������ä��Τ��ȸ����ȡ���Ƥߤʤ��Ȥ狼��ʤ���ΤΡ�svg����Ū�ե�������Ǥ��Ф���nginx���֤����Ȥǻ�����ǽ�夲���ۤ�����������ǽ��夲���ꥹ�����夬�ä���ǽ�����礭���Ȼפ��ޤ���

����ˡ���ǽ���Ȥ��Ƥϡ�react¦�� /room/:id ��Ϯ�뤳�Ȥ��Ǥ���С� react ������Ū�ե�������ɤ߹����������Τϴ�ñ���ä��Ϥ��Ǥ��� ��Ū�ե������Ȥ����ʬ���������ͥå��ˤʤ�ޤ�����Ʊ�������ؤΥ���������Ʊ�������С���ʬ�������褦�� nginx ������� @kizkoh �ʤ餹���ˤ�äƤ��줿�Ϥ��Ǥ���

������

���פ˹ͤ��Ƥ������Ȥϼ¸��Ǥ�����ΤΡ����ΤȤ������ۤ��Ƥ�����٥����ǽ�������ФƤ��ޤ���

����ե�¦�Ǥ����꤬�����ǤƤ��ޤ��������ʤˤ�� react ��CPU����Ψ������Ū�� app ����ǽ�������褫���Ƥ��ޤ���

������ react ��Ĵ�٤ƥϥޤ餺�˥��塼�˥󥰤���ΤϥХ����᤮�ơ��������ȥĥȥåפξ��֤���ĩ�魯��Τϥʥ��Ǥ��� �����ޤ�1���ư�����Ƥ����Τ�MySQL �� isu2 �� (������ͤλؼ��Ǥ��������ǡ������åȤ�������֤ˤ�ɤäƷڤ��ʤ�ʳ���̵��̣�Ǥ�����)�� react �� isu3-5 ��ư����ʬ�������˰ܹԤ��ޤ���

¾�ˤ� too many open files �Ȥ� TIME_WAIT �Ȥ�������ˤʤäƤ����Τǡ� nofiles �� tcp_tw_reuse �ʤɤ����ꤹ��褦�˻ؼ����Ĥġ� react �� HTTP keep-alive ���ʤ˵��ݤ��Ƥ����Τ�ľ���Ƥ����ޤ���

�ޤ��� nginx -> react �Υ�С����ץ�������ʬ������ keep-alive ����ʤ��Τϡ� express.js ��ʬ�ǥ쥹�ݥ󥹥إå������ɲä���API��Ĵ�٤� res.append('Connection', 'keep-alive') ���ɲä�����ľ��ޤ����� ���� react -> app ����������ǡ��饤�֥��ΰ�¸�ط������äƤ��ä���̡� bitinn/node-fetch ����μ��Τ褦�ʥ����ɤ�������Ȥ�������äȶ�������ˡ�Dz�ä��ޤ�����

// https://github.com/bitinn/node-fetch/blob/master/index.js#L79-L81
		if (!headers.has('connection') && !options.agent) {
			headers.set('connection', 'close');
		}

�������ä������򡢺Ƶ�ư��ι�֤�˥�äƤ�äƤ����ΤǤ��������פϥ������ߥåȤ���Ť��ˤĤ첿�⤷�ʤ��Ƥ�ɤ�ɤ󥹥���������������˴٤äƤ��ơ� �٥��ȥ������� 85k ���ϺǸ�ν��������äƤʤ����֤Ǥ�����

�ͻ�

���פ˥�����������Ǻ����ʤष��������ˤΤ��Ӱ褬�ͥå�����ͽ�ۤ��Ƥ������ˤĤ�����­���Ƥ����ޤ��� ����Ȥä����󥹥��󥹤�2������ D2v2 �ǡ��٥���ޡ������������������륤�󥹥��󥹤�1��Τߡ����Υ���դϽ��פΥ٥���ˤ����뤽��1����Ӱ� (bytes/sec) �Ǥ���

ÂӰ襰¥é¥Õ

2�����Υ��󥹥��󥹤�100MB/sec��Ķ���Ƥ�ΤϤ������Ǥ��͡�����դ����������ʤΤϡ�¿ʬ�٥���ޡ��������Ⱦ�����򤷤����Ƥ���������Ȼפ��ޤ���

���ϡ��ƥѥ��ؤΥ����������Ǥ������פ��Ƥ���Τϥ٥���ޡ���������Υ��������Τߤǡ� react -> app �ؤΥ����������ޤޤ�Ƥ��ޤ���(�������פʾ���ʤΤǡ� ľ�ܥ������������Ƥ����Τ��ͤ�Ƚ�ǥߥ��Ǥ���)

Request by count
11106 GET /img/*
178 GET /
112 GET /bundle.js
112 GET /css/rc-color-picker.css
112 GET /css/sanitize.css
49 GET /rooms/*
46 POST /api/strokes/rooms/*
41 GET /api/rooms
20 GET /api/stream/rooms/*
3 POST /api/rooms
2 GET //admin/config.php
1 GET /api/rooms/1088

���ϡ�Ʊ�����٥���ޡ��������֤��Ƥ����쥹�ݥ󥹤Ρ��ƥѥ����Ȥι�ס�ʿ�ѥХ��ȿ��Ǥ���

Request by out bytes
2511686449 14110598 GET /
272792736 6653481 GET /api/rooms
266967906 24038 GET /img/*
36283072 323956 GET /bundle.js
9725553 198480 GET /rooms/*
764377 38218 GET /api/stream/rooms/*
340144 3037 GET /css/sanitize.css
303520 2710 GET /css/rc-color-picker.css
184982 4021 POST /api/strokes/rooms/*
75910 75910 GET /api/rooms/1088
1017 339 POST /api/rooms
490 245 GET //admin/config.php

�����Ӱ��ȤäƤ��� / �Ǥ���������� react ���鳰���Ƥ��ʤ��ѥ��ǡ������礭���쥹�ݥ󥹤� react (�̥����С�) -> nginx -> �٥���ޡ�������ή��Ƥ���Τǡ� nginx ���֤��Ƥ�ޥ���� in �� out ���Ӱ褬Ʊ�����餤�ˤʤäƤ��ޤ���

2�֤�� /api/rooms �Ǥ����������ľ�ܥ��饤����Ȥ���ƤФ��Τ�41�󡢡�¿ʬ��/rooms/* ��������Ƥ��� react ���饢�����������Τ�¾�� 49 �󤢤�Τǡ� �ºݤ˻ȤäƤ����Ӱ�Ϥ����ܰʾ夢�ä��Ϥ��ǡ��������Ӱ�˰��������ƥ����ॢ���Ȥ��䤹���ʤä��Τ������������ꤷ�ʤ��ä���ͳ���Ȼפ��ޤ���

�ޤ�����Ƥʤ��Ǥ����� / ���Ӱ�򸺤餻��褦�ʻŹ��ߤ����ä��Τ��⤷��ޤ��󡣤ޤ��������ά�Ǥ��ʤ��ä��Ȥ��Ƥ⡢ nginx �����Τ� ratelimit �򤫤��� �Ӱ�򿩤��ѥ����٤���������ˤ���ʳ��Υѥ��ǥ����ॢ���Ȥˤʤ���򸺤餹���Ȥǡ���äȥ��饤����Ȥ������٤�Ԥ��ǥ��������줿���⤷��ޤ���

���ä�����������ξ������Ƥ��ʤ��顢���פϥƥ�ѤäƤ��������ͻ��Ǥ��Ƥ��ޤ���Ǥ������Ƶ�ư�������Ť˺Ǹ�Τ⤦�ҤȲԤ���ͤ��ʤ��Ȥ����ޤ���͡�

����

��ǯ�ϼ�ʬ�����֥��ץ��񤱤롢���ĥ���ե�Υ��塼�˥󥰤����Ƚ��Ȥ������֤ǡ���´���С�2�ͤ˥������򿶤�Ȥ����襤���򤷤Ƥ��ޤ�����

��ǯ�ϡ� @mecha_g3 ��ʬ��Ʊ�����餤���ץ꤬�񤱤�ȿ��ꤷ����ޤ������ˤ�����ͭ��������ǺѤ������ @kizkoh ���ͤ���������å����åפǤ��Ƥ��ʤ� ��ǯ�Υߥɥ륦������ͽ�����Ƥ��Ƥ���Ƥ��ޤ����Ǥ�����ˡ����ץ���塼�˥󥰤����������饤��ե�����ǥ������򿭤Ф��Ƥ��줿�������ǡ� ���ư���������ܤ�Ƭ��Ȥ��襤�����Ǥ��ޤ�����

�ޤ��ޤ��ͤ�����­�ǽ���¦�������ˡ�ˤϤ��ɤ��失�ޤ���Ǥ�������3�ͤǶ��������बISUCON�Ƕ�����������Ȥ������Ȥ򶯤��´��Ǥ��� ���ݥ���ޥ󥬤��о��ʪ�ˤʤä����Τ褦�ʲ�����ã���������뤳�Ȥ��Ǥ��ޤ����� ���Υ�����Ǥ���10�󤯤餤���äƾ޶�ǿ��֤�WRX���㤤�����Ǥ���

�����ˤʤ�ޤ��������ġ������γư̡��ä���ǯ����³���뻲�üԤ򤢤������ߤΤ��뱿�ѤDZ��Ĥ��Ƥ������äƤ�����椵��ȡ� ��ǯ�夬��³��������٥�Υץ�å��㡼�˸����˱���������Ȱ���٥���ޡ��������ƥ���äƤ������ä����������˴��դ������ޤ���

songofacandy at 19:09��Comments(0)��TrackBack(0)��ISUCON 

�ȥ�å��Хå�URL

���ε����˥����Ȥ���

̾��:
URL:
  ����òµ­²ï¿½: ɾ��: ��    ��
 
 
 
Blog�⸡��
�ǿ�����
Archives
���Υ֥����ˤĤ���
DSAS�Ȥϡ�KLab �����ۤ����Ѥ��Ƥ��륳��ƥ�ĥ����ӥ��Ѥ�Linux�١����Υ���ե�Ǥ�������5����Υǡ������󥿤ˤƹ��ۤ������Ѥ��Ƥ��ޤ������桹��DSAS����Ȥ��䤹�����������ˡ������Ƥ����ϤDZ��ѤǤ��뤳�Ȥ��ܻؤ��ơ��������ɤ˶Ф���Ǥ��ޤ���
���Υ֥����Ǥϡ������ DSAS �ǻȤäƤ��뵻�ѤξҲ�䡢�¸����Ƥߤ���̤���𡢥ȥ�֥�˴������ޤ줿���ηи��̤ʤɡ���������������������򿥤�ޤ��ƾҲ𤷤Ƥ��������Ȼפ��ޤ���
�ǿ�������
<%==comments[n].author%>
<% } %>