ISUCON6 ��ͥ�����ޤ���
@methane �Ǥ��������ȥ���̤ꡢ ISUCON �ǤȤ��Ȥ�ͥ�����Ƥ��ޤ�����
��������С��ϡ�(ͽ����Ʊ����) @kizkoh (����ե�ô��), @mecha_g3 (���ץ�ô��) �Ǥ�����
���ͽ���ΤȤ��ϥ��åĥ�ȥ��ץ��񤤤Ƥ����ΤǤ���������Ǥ� netstat -tn
(��Ϸ��), top
,
dstat -ai
, sudo perf top
�ʤɤ�ߤĤĻؼ���������ꡢ���ˤ��᤿�ꡢ������̤�и����ä�
node.js & react.js �к��򤷤��꤬��ʻŻ��ǡ����ȤϽ��פΥ���ե�Υ����������̤ˤ���Ȥ���
MySQL �� docker ���鳰���ƴ���Ū�ʥ��塼�˥󥰤����줿�� Go ��100�����ٽ񤤤������Ǥ���
���Ū�ˤ�ͥ���Ǥ��ޤ����������С���2�ͤ��褯���������֤Ǥ���Ϥ�ȯ�����Ƥ��줿�Τ��Ф��� �ͤ���ά�ߥ������פ���������������夲���ʤ��ä��Τǡ��Ǹ�ޤǥҥ�ҥ䤷�Ƥ��ޤ�����
��ǯ�� #isucon ͽ����isupam����ʤ��Ƥ⥹�������Ӥ��Τ��������raact�Υ����С������ɥ�����󥰤����ܤ��к����ʤ��ȥ��������Ӥʤ����Υե�����ȤˤʤäƤ��ơ������˥ϥ��줿��
— INADA Naoki (@methane) 2016ǯ10��22��
��ǯ��ͥ���Ͻ���ԥ�������Ȼפ���
�Ȥ������Ȥǡ� nginx �� Go �Ǥ�ä����Ȥϥ��С�����ͤ��̤˵�����񤤤Ƥ����Ȼפ��Τǡ� ��������ǹͤ������ȡ���ʬ�Ǥ�ä����Ȥ����ˤ���ƻؼ��������ȡ����ιͻ���񤤤Ƥ��������Ȼפ��ޤ���
- ����ե�ô���� @kizkoh �ε���: ISUCON6 �˥���ե饨�󥸥˥��Ȥ��ƻ��ä���ͥ������!!
- ���ץ�ô���� @mecha_g3 �ε���: ISUCON6 ͥ�����ޤ���
����Ƚ�������ˤĤ���
����ϡ��ꥢ�륿�����¾�ͤν񤤤�����¾�Υ桼�����˸�����褦�ʤ��������Ǽ��ĤǤ�����
��������ħŪ�ǡ�
- �ե���Ȥˤ���Τ��̾�� 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��Ĥ��Ƥ������äƤ�����椵��ȡ� ��ǯ�夬��³��������٥�Υץ�å��㡼�˸����˱���������Ȱ���٥���ޡ��������ƥ���äƤ������ä����������˴��դ������ޤ���