ruby
��ٻ�ġ���֥��󥿡��ͥå��˲��פ�������ޤ���
��ٻ�ġ��� ���󥿡��ͥå��˲���������ޤ�����
������Ϥ��äȼ������ٻ�˻��Ѥ��Ƥ����ġ���Ǥ�������ǻ��Ѥ��Ƥ�����ΤʤΤǡ���������륢�ץ�����ε�ǽ�ʤɤ�¿���ɲä���Ƥ��ޤ������������󤽤�ʳ���Web���ץꥱ�������Ǥ���ѤǤ��ޤ���
����Ū�ˤ�Apache JMeter�Τ褦��Web���ץꥱ�������ऱ�Υ��ʥꥪ��ٻ�ġ���Ǥ������ޥ�ɥ饤�󥪥ڥ졼���������Ǽ¹ԤǤ��������С���Ǵ�ñ����ٻ��»ܤǤ���Τ���ħ�Ǥ���POST�ꥯ�����ȤʤɤϤ�����󡢥쥹�ݥ󥹤Υ����å���UserAgent�ε�������������ͤ�ѥ�᡼�����˥��åȤ��뵡ǽ��������Ƥ��ޤ���
����: �����ʤ��鼫ʬ�δ������ˤʤ������Ȥ˸�������ٻ�ġ����¹Ԥ���Τ����Фˤ��Ƥ������������˴����Ǥ���
ʪ����̾�����Ĥ��Ƥ��ޤ���������ϴ����ˤ錄���ξ���Ū�����μ�̣�ˤ��Ȥ����Ǥ����Ͽ̤ǿ͡����줷��Ǥ���Ȥ����ˡ��˲��פȤ���̾����ɤ��ʤΤ��ȻפäƤ����ΤǤ�����̾���Ϥ����ޤǤ�̾���ˤ����������֤���ٻ�ġ���Ǥ��Τǡ��Ѥ˱�θ����ΤϤ��Ƹ������뤳�Ȥˤ��ޤ�����
�Ͽ̤κݡ����äʤɤ���ǽ���ʤ��ʤ�ʤ���Twitter�� Google��Person Finder�ʤɤ�Web���ץꥱ������󤬺ҳ����ξ���򴹤���Ω�ä��Τϼ��Τλ��¤Ǥ��������ƺҳ����ʤɤ˥����������������Ƥ⥵���ӥ���ʿ��˹Ԥʤ�����ˤϡ���ٻ��ɬ�פǤ����趯��Web���ץꥱ��������ȯ���뤿��ˡ����Υġ��뤬��Ω�ƤиĿ�Ū�ˤ����ˤ��줷���Ǥ���
���󥹥ȡ�����ˡ
rubygems����Ͽ����Ƥ��뤿�ᡢ�ʲ��Υ��ޥ�ɥ饤�����ǥ��󥹥ȡ���Ǥ��ޤ���RubyRev�Ȥ������٥�ȶ�ư�Υե졼��������Ѥ��Ƥ���Τǡ��������Ʊ���˥��󥹥ȡ��뤵��ޤ���
$ gem install internethakai
�����������ɤ�ܺ٤ʥɥ�����Ȥϰʲ��Υ����ȤˤޤȤ�Ƥ��ޤ���
http://internethakai.rubyforge.org/
���塼�ȥꥢ��
��ñ�ʻ��¹Ԥ��Ƥߤޤ��礦��
�ޤ����ʥꥪ�Υƥ�ץ졼�Ȥ��������ޤ���
$ hakaigen your site ex. http://example.com > example.com save to scenario-0.yml
scenario-0.yml�Ȥ����ե�����˥١����Ȥʤ�����ե����뤬��¸����ޤ�����actions�Ȥ������ܤ򤤤���ޤ������ʥꥪ��yml�����Ǥ���
actions: - path: /top/index - path: /item/confirm - path: /item/doBuy method: POST post_params: id: 12 category: 2
�ʾ�Τ褦��path��ʤ�٤ƽ񤤤Ƥ���������פǤ���POST�βս��method��POST�Ȼ��ꤷ���ѥ�᡼������Ĥ��ޤ���
�ʲ��Υ��ޥ�ɤǼ¹Ԥ��ޤ���--test���ץ�����Ĥ���ȡ�������٥�3��Ʊ���ꥯ�����ȿ�1�Ǽ¹Ԥ��ޤ���
$ internethakai scenario-0.yml --test
������٥��4�ˤ���ȡ��쥹�ݥ󥹤���Ȥޤdz�ǧ�Ǥ��ޤ���
$ internethakai scenario-0.yml --log=4
Ʊ���ꥯ�����ȿ���50�ޤ����䤷�ޤ���
$ internethakai scenario-0.yml -r 50
100��롼�פ����ޤ���
$ internethakai scenario-0.yml -r 50 -l 100
5ʬ��(300��)����³�����ޤ���
$ internethakai scenario-0.yml -r 50 -d 300
�˲��Ϥ򤢤��뤿�ᡢ4�ץ������Ǽ¹Ԥ��Ƥߤޤ���
$ internethakai scenario-0.yml -r300 -p4 -d300
�����Ʊ���ˡ���ٻ��¹Ԥ��ʤ��顢cacti��ganglia�ʤɤΥ�ݡ��ȥġ���ǥ����С��ξ��֤��ǧ���ޤ���
�ޤ��¹Ԥ���λ����ȡ����󥿡��ͥå��˲���¦�ˤ�ǡ�����ɽ�������Τǡ��쥹�ݥ󥹤˻��֤Τ�����ѥ��ʤɤ��ǧ�Ǥ��ޤ���
Target domain = http://example.com Loop: 1 Request Concurrency: 10 Scenario Concurrency: 10 ooooooO result: failure TimePerRequest: 466.763428571429 RequestPerSec: 21.4241292009657 MinResponse Worst: 1: /top/index 66.806 20 2: /shop/confirm 26.582 10 3: /shop/doBuy 26.072 10 AvgResponse Worst: 1: /shop/doBuy 252.2343 20 2: /top/index 39.0615 10 ...
��Ǥϡ�POST�ꥯ�����ȤˤĤ��륢���ƥ��ID�ʤɤ����ˤ��ޤ��������ºݤλ�Ǥϥ������ID����ꤷ�������⤢��ޤ���
actions: ... - path: /item/doBuy method: POST post_params: id: 12 # ���������������ѹ��������� category: 2
�ޤ�1����100�ޤǤ��ͤ�񤤤��ե�����(���Զ��ڤ�)���Ѱդ��ޤ���
$ ruby -e "1.upto(100){|i| puts i.to_s}" > ids
��������ѿ��Ȥ������Ѥ���褦������ե������ñ¤´ï¿½ï¿½ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½
vars: - var_file: ./ids var_name: item_id actions: ... - path: /item/doBuy method: POST post_params: id: %(item_id)% # ���������������ѹ��������� category: 2
���ξ��֤Ǽ¹Ԥ���С�1��Υ��ʥꥪ���Ȥ˰ۤʤ��ͤ����Ѥ���ޤ���
$ internethakai scenario-0.yml -r50 -d300
(takada-at)
����1000���ͥ��������Ѥ��롪 Ruby �Υ��٥�ȶ�ư�饤�֥�� Rev �� EventMachine �� HTTP���饤�����
Ruby�Υ��٥�ȶ�ư���ͥåȥ���ץ�����ߥ󥰥ե졼���� Rev �� EventMachine �� HTTP���饤����Ȥ�ư�����Ƥߤޤ�����
���٥�ȶ�ư���ͥåȥ���ץ�����ߥ󥰥ե졼�����Ȥϲ����������������񤷤��Ǥ���������Ǹ����ȡ��ʲ��Τ褦�ˤʤ�ޤ���
# �դĤ��Υե�����ư���ץ������ Net::HTTP.start(host, port){|http| res = http.get(path) #���ν���������äƤ��� } puts "done" #���μ��ν������¹Ԥ����
# ���٥�ȶ�ư���ץ������ client = Rev::HttpClient::connect(host, port) client.get(path) #���ν���������äƤʤ��Τ� puts "not done" #�������ιԤ��¹Ԥ���Ƥ��ޤ��츫����ȥץ�������ʣ����������������Τ褦�˻פ��ޤ�����������֥��å����ʤ��Ȥ������Ȥ�̵�̤��ʤ��Ȥ������ȤǤ⤢��ޤ�������ˤ�äơ�
- ʣ���Υե�����ǥ�������ץ���Ʊ���˳���
- �ɤ߹��߲�ǽ�ʤ�Τ���������Ƥ���
���٥�ȶ�ư�饤�֥��Υ���ץ�Ǥϡ������С���񤯤��Ȥ�¿���Ǥ��������饤����Ȥ�Ʊ����³���θ³���ĩ�路�����ä��Τǡ������ HTTP���饤����Ȥ�񤤤Ƥߤޤ���
Ruby �Υ��٥�ȶ�ư�饤�֥��Ȥ��� Ruby Rev�� EventMachine ��2�Ĥ�Ȥäƥ쥹�ݥ󥹥�������¬���ޤ������ɤ�����ȼ��� HTTP���饤����Ȥ�饤�֥����Ȥ߹���Ǥ��ޤ���
EventMachine
http://rubyeventmachine.com/
Rev
http://rubyforge.org/projects/rev/
Rev �� EventMachine �� Python �� Twisted �� Tornado��Perl �� AnyEvent �Τ褦�ˡ��Υ�֥��å��� I/O �����Ѥ��뤳�Ȥ��¹������⤯��®�ʥͥåȥ���ץ��������Ȥि��Υե졼�����Ǥ���
�ɤ���Υ饤�֥���ޤ����ޤ����������ޤ��󤬡������μ����򸫤Ĥĥ���ץ륳���ɤ�������Ƥߤޤ�����
������������ȡ�Rev�ϤȤƤ��®�Ǥ���
�����С�¦�Ǥ�ñ���100ms�ԤäƤ���쥹�ݥ󥹤��֤������Υڡ������Ѱդ��Ƥ��������饤����Ȥ��������³���ƥ쥹�ݥ󥹥������ʿ�Ѥ���ޤ������פ���ˡ�����������䤷�Ƥ�쥹�ݥ󥹥����ब100ms �˶ᤱ��жᤤ�ۤɡ���®�ʥ��饤����ȤȤ������Ȥˤʤ�ޤ���
�ʲ�
- Ruby�Υ���å� + net/http �饤�֥��
- Rev/HttpClient
- EventMachine/HttpClient2
�ʤ���������Ѥ��������С��ϡ�Python �� Tornado �ǽ񤫤�Ƥ��ꡢ��ʬ�˹�®�Ǥ���
(EventMachine �ˤϤʤ��� HTTP���饤����Ȥ�2�Ĥ���ޤ�����HttpClient �Ȥ���̾�������ϤޤȤ��ư��ʤ��ä��Τǻ�оݤ��鳰���ޤ���)��
10���ͥ������
target: http://hornet.klab.org:8000/ concurrency: 10 net/http + thread avg: 140.5132 EventMachine/HttpClient2 avg: 101.3227 Rev/HttpClient avg: 101.4915
����åɤ����Ϥ��Ǥ�¿�����ٱ䤬�������Ƥޤ���
100���ͥ������
target: http://hornet.klab.org:8000/ concurrency: 100 net/http + thread avg: 166.59175 EventMachine/HttpClient2 avg: 110.23086 Rev/HttpClient avg: 103.69137
EventMachine, Rev �Ϥۤ������̵���������֤Ǥ���
500���ͥ������
target: http://hornet.klab.org:8000/ concurrency: 500 net/http + thread avg: 2720.349032 EventMachine/HttpClient2 avg: 132.847788 Rev/HttpClient avg: 113.132662
EventMachine ��¿�����ٱ䤬ȯ������褦�ˤʤ�ޤ���������åɤϤۤȤ�ɻȤ���Τˤʤ�ʤ��٤��Ǥ���
1000���ͥ������
target: http://hornet.klab.org:8000/ concurrency: 1000 net/http + thread avg: 10968.612545 EventMachine/HttpClient2 avg: 136.243228 Rev/HttpClient avg: 122.174841
EventMachine �⤫�ʤ��®�Ǥ�����1000�򾯤��ۤ��������꤫��ޤȤ��ư��ʤ��ʤ�ޤ���
���� Rev ��1000���ͥ���������٤Ǥ�����ʤ�ư���褦�Ǥ���
�ʤ����ջ���Ȥ��ơ����λ�򤹤����ˡ��ե�����ǥ�������ץ������¤����䤷�Ƥ���ɬ�פ�����ޤ���
�ǥե���ȤǤ�1024�ʾ�Υե�����ǥ�������ץ��򰷤����Ȥ��Ǥ����������åȤο��ˤ����¤����廊���Ƥ��ޤ��ޤ���
Linux �Ǥϡ�/etc/security/limits.conf ���Խ����뤳�Ȥǥ桼�����Υե�����ǥ�������ץ��ξ�¤����䤹���Ȥ��Ǥ��ޤ���
����ˡ�TIME_WAIT ���֤Υ��ͥ�������Ȥ��󤻤�褦��tcp_tw_reuse=1 �����ꤷ�Ƥ����Ȥ褤�Ǥ��礦��
/etc/sysctl.conf �� net.ipv4.tcp_tw_reuse��=��1 �����ꤹ�뤳�Ȥǡ�TIME_OUT ���֤Υ��ͥ�����������Ѥ���TCP���ͥ������ξ�¤�����夲�뤳�Ȥ��Ǥ��ޤ���
�ʲ��˺�����Ѥ����ƥ��ȥ����ɤ�Ǻܤ��ޤ���
���٥�ȶ�ư���Ȥ��Ƥ뤿��¿���ɤߤˤ����Ǥ������ɤΥѥ������ 1���ԤäƤ���HTTP�ꥯ�����Ȥ���������������쥹�ݥ󥹤λ��֤��¬���Ƥ��ޤ���
(takada-at) ³�����ɤ�