Go��database/sql.Stmt�Υ�������ӥ�ƥ���������ޤ���
������ Go�˽��ƻ�Υѥå��������ޤ� ������ȥ�ӥ塼����������ꤷ�ޤ�����
���Υѥå��ϡ� database/sql.Stmt
��إӡ��˻Ȥä�������ǽ����������16�����ʾ�Υ������˥������뤷�ʤ��Ȥ���������褹���ΤǤ���
�������ä������ɤ���ä�Ĵ������Τ��ȡ�Go�˥ѥå��������ޤ��ޤǤμ���Ҳ𤷤ޤ���
�ط�
��� TechEmpower �� FrameworkBenchmarks �Ȥ�����������ʸ���/�ե졼������Ʊ��Υ��ץ���äƥ٥���ޡ�������Ȥ����ץ��������Ȥǡ����Python��Ϣ�Υ��ƥʤ򤷤Ƥ��ޤ��� Go�ˤⶽ̣������Τǡ�Gin�Ȥ����ե졼�������ɲä����ꥳ���ɥ�ӥ塼�˻��ä����ꤷ�Ƥ��ޤ���
2014-05-01 �˹Ԥ�줿����Υ٥���ޡ��� Round 9 �Ǥϡ� PEAK Hosting ���¹ԴĶ��˲ä��ޤ��������δĶ��ϡ��ǥ奢�� Xeon E5-2660 v2 �Υޥ���� 10Gbit Ethernet ����³����Ȥ����ϥ����ڥå��ʤ�ΤǤ���
���δĶ��ǡ������Ի׵Ĥʷ�̤��ФƤ��ޤ�����¾�δĶ��Ǥ�Java��nginx�١����δĶ���³���ƾ�̤ˤĤ��Ƥ������̤�Go�Υե졼���������¤߽�̤���Ȥ���Scala, node.js, php �η��̥ե졼�����ˤޤ��餱�Ƥ��ޤäƤ����ΤǤ���
2014-11-02 �� ����������������ץ�ꥯ������ ���о줷�ޤ��������Υץ�ꥯ�����Ȥϡ� *sql.DB
��ʣ�����饦��ɥ��ӥ�����Ѥ��뤳�Ȥǥ��å�������������Ȥ�����ΤǤ�����
������餳�ν�����ˡ��ȿ�ФǤ��������Υץ��������Ȥ�ñ�˥ϥ���������������������Τ�ΤǤϤʤ����ƥե졼������ ����Ū�� �����ɤΥ���ץ�ȡ����θ���Ū�ʥ����ɤ��ɤ줯�餤����ǽ��Ф��Τ��λ����ͤ�¿���οͤ��󶡤��뤿��Τ�ΤǤ��� *sql.DB
��ʣ�����Τ��߷װտޤȰۤʤꡢ���ޤ긽��Ū�ʤ�Τˤϴ������ޤ���Ǥ�����
database/sql
���߷פˤĤ���
�������ƻ���ơ� database/sql
�δ����߷פˤĤ����������ޤ��� Go �ǥǡ����١�����Ȥ��ץ�������񤤤��и��Τ������Ϥ��Υ����������ɤ����Ф��Ƥ���������
database/sql
�ϡ� PHP �Ǥ��� PDO �Τ褦�ˡ��Ƽ�ǡ����١�������³����ɥ饤�Фξ���蘆�ꡢ���줷�����󥿥ե��������󶡤��ޤ����㤨�� MySQL �Ǥ���� go-sql-drivers/mysql ������Í̾�ʥɥ饤�Фˤʤ�ޤ����桼�����ϴ���Ū�ˤϥɥ饤�Ф�ľ�����Ѥ��뤳�ȤϤ��ޤ���
database/sql
���濴�ˤʤ�Τ� sql.DB
�Ǥ�������ϥ��ͥ������ס���ˤʤäƤ��ơ��ʲ��Τ褦�ʻȤ����򤷤ޤ���
DB.Exec()
��DB.Query()
��ľ�ܥ�������ꤲ��DB.Prepare()
�ǥץ�ڥ��ɥ��ơ��ȥ��Ȥ�ɽ��Stmt
���֥������Ȥ��ꡢStmt.Exec()
��Stmt.Query()
��Ȥ�DB.Begin()
�ǥȥ�󥶥�������ɽ��Tx
���֥������Ȥ��ꡢTx.Exec()
��Tx.Query()
��Ȥ�
�ȥ�󥶥�������Ȥ����� Tx
���֥������Ȥ� DB
��������å������Ȥ������ͥ��������ݻ����ޤ���������ʳ��ξ��� DB
���ס��뤷�Ƥ��륳�ͥ������Τ����줫�ǥ����꤬�¹Ԥ��졢�桼�����ϥ��ͥ����������֤��Ȥ��Ǥ��ޤ��� (�����Υ��С��Ǥ��Ƥ��ʤ��桼�����������б����뤿�ᡢ Go 1.5 �Ǥϥȥ�󥶥������ʤ��ǥ��ͥ�����������å������Ȥ��ƻȤ� API ���ɲä���븫���ߤǤ���)
1�֤���ˡ��Ȥ���硢 DB.Query()
�ϥɥ饤�Ф��ץ졼���ۥ�����ִ����б����Ƥ��ʤ����������� DB.Prepare()
, Stmt.Exec()
, Stmt.Close()
��Ԥ��ޤ���1��Υ������3��Υ饦��ɥȥ�åפ�ȯ������Τ���ǽŪ�ˤ������ˤʤ�ޤ��� go-sql-drivers/mysql ��ץ졼���ۥ���ִ����б����Ƥ��ʤ� (�б����뤿��Υץ�ꥯ������ ���ꤲ�Ƥ��Ƶ�����Ǥ�) �Τǡ� 2�֤���ˡ��������ǽ���Ф뤳�Ȥˤʤ�ޤ���
2�֤���ˡ�����Ѥ����硢 Stmt
���ƥɥ饤�Ф� prepare ������̤� DB ��Υ��ͥ������Ȥ��б���������Ƥ����Τǡ��桼�����Ϥɤ���³�� Prepare �򤷤��Τ��򵤤ˤ���ɬ�פϤ���ޤ��󡣺��������Ϥ�����ʬ���ͥå��ˤʤäƤ��ޤ���
���Τ褦���߷פˤʤäƤ��뤿��ˡ� DB
���Τ�ʣ�����ĤΤϥ��쥮��顼�ʻȤ����ǡ�1�ĤΥǡ����١���������1�Ĥ� DB
��������ǽ���������뤹��褦�ˤ���Τ����ۤǤ���
Ĵ��
�ޤ������ݤ�ȯ�����Ƥ��� PEAK Hosting �˶ᤤ�Ķ����Ѱդ���ɬ�פ�����ޤ��� AWS �� c3.8xlarge �Υޥ����2�桢��ĥ�ͥåȥ���󥰤�Í���ˤ��ơ�Ʊ��� placement group �����֤��뤳�Ȥǡ�32�����Υޥ����10Gbit�ΰ��ꤷ���ͥåȥ������³�����Ķ����Ѱդ��뤳�Ȥ��Ǥ��ޤ��� Amazon Linux AMI ��Ȥ��С��ǥե���Ȥdz�ĥ�ͥåȥ���󥰤�Í���ˤʤäƤ���ΤdzڤǤ��� ���ݥåȥ��󥹥��󥹤����Ѥ���С�2��� c3.8xlarge �Ϥ������� $0.7/h �Ǽڤ�뤳�Ȥ��Ǥ��ޤ���
���ˡ��٥���ޡ����򤫤������꤬�Ƹ����뤳�Ȥ��ǧ���Ĥġ� top ���ޥ�ɤ�CPU�����Ѿ������ǧ���ޤ��� Mutex ��Ȥä����å��ϡ����å��򤹤��˼����Ǥ��������㥳���ȤǤ��������礷�����Ϥ�������CPU�����������񤷤ޤ��� ����ˤʤäƤ��� Mutex ��Ĺ���֥��å�����Ƥ�����ϡ�ư��Ǥ��륹��åɤ�����Τ�CPU����Ψ���㤯�ʤꡢû���֤������������ˤ˥��å��������ϥ��å��ζ����ȯ�����٤��㤷���ʤꡢ��ǽ���������˥������뤷�Ƥʤ���ˤ�CPU����Ψ�Ϲ⤯�ʤ뷹���ˤ���ޤ�������Ϥɤ��餫�Ȥ����ȸ�Ԥ��Ȥ������Ȥ���ǧ�Ǥ��ޤ�����
�Ǹ�ˡ� net/http/pprof
�����Ѥ��ơ����������ꤷ�ޤ��� net/http/pprof
��CPU�ץ��ե������Ϥ�����Ĥ��ο��ǵ�ǽ������ޤ��������å�����ǰ������Ω�ĤΤ� full stack dump �Ǥ����ºݤΥ����å�����פ� ������ �ˤʤ�ޤ���
�ޤ���¿���� goroutine ���ߤޤäƤ��� Mutex.Lock()
�򸫤Ĥ��ޤ�������ξ��ϼ��Τ褦�ʥ����å��ȥ졼���ǻߤޤäƤ����礬¿���Τ��狼��ޤ��� �����������ɤǤ� ������ʬ �ˤʤ�ޤ���
goroutine 81 [semacquire]: sync.(*Mutex).Lock(0xc2080c42d0) /home/ec2-user/local/go/src/sync/mutex.go:66 +0xd3 database/sql.(*Stmt).connStmt(0xc2080c4280, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0) /home/ec2-user/local/go/src/database/sql/sql.go:1357 +0xa6 database/sql.(*Stmt).Query(0xc2080c4280, 0xc2089a1be8, 0x1, 0x1, 0x0, 0x0, 0x0) /home/ec2-user/local/go/src/database/sql/sql.go:1438 +0x120
�����ָ����˶�Ť��Ƥ��ޤ��������ޤ�������ʬ���ȿͤ����Ǹ����뤳�ȤϤǤ��ޤ��󡣥��å�����ϡ����å�������������٤ȥ��å�����äƤ�����֤γݤ���������ˤʤ�Τ��Ф��ơ������å�����פǤ����٤�¿����ʬ��¿��ɽ������뤫��Ǥ���
�����ǡ������Ʊ�������å�����פ���������椫�顢���� Stmt.mu
�Υ��å�����äƤ����Τ�õ���ޤ�������ȼ��Υ����å�����פ����Ĥ���ޤ���
goroutine 158 [semacquire]: sync.(*Mutex).Lock(0xc208096de0) /home/ec2-user/local/go/src/sync/mutex.go:66 +0xd3 database/sql.(*DB).connIfFree(0xc208096dc0, 0xc2083080c0, 0x0, 0x0, 0x0) /home/ec2-user/local/go/src/database/sql/sql.go:695 +0x67 database/sql.(*Stmt).connStmt(0xc2080c4280, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0) /home/ec2-user/local/go/src/database/sql/sql.go:1378 +0x316
Stmt.mu
����å����Ƥ���Τ���ۤɤ�Ʊ�����֤ʤΤǤ�����������Ǻ��٤� DB.mu
�Υ��å����ԤäƤ��뤳�Ȥ��狼��ޤ��� Stmt.connStmt()
�� DB.connIfFree()
�Υ����ɤ��ɤ�ȡ� connStmt()
�� Stmt.css
(prepare �ѤߤΥ��ͥ������� stmt �Υڥ���������Ƥ���ꥹ��) ���Ф��ƥ롼�פ��Ĥġ� connIfFree()
��ƤӽФ��� connIfFree()
����� DB.mu
����å����Ƥ��뤿��ˡ� DB.mu
���⤤���٤ǥ��å�����Ƥ���Τ��狼��ޤ��������������ξ��� Stmt.mu
����å����Ƥ���1�Ĥ� goroutine ����Ʊ���ˤ��ʤ��Τǡ�¾�ξ��� DB.mu
�Υ��å��ȶ��礷�Ƥ���褦�Ǥ������٤ϥ����å�����פΤʤ����顢 DB.mu
�Υ��å�����äƤ��Τ�õ���ޤ�������ȡ� DB.addDep()
�Υ��å�����˹Ԥ�������ޤ���
# DB.mu ����äƤ��� DB.addDep goroutine 18 [runnable]: database/sql.(*DB).addDep(0xc208096dc0, 0x7f0932f0e4d8, 0xc2080c4280, 0x73d340, 0xc2082ec540) /home/ec2-user/local/go/src/database/sql/sql.go:362 database/sql.(*Stmt).Query(0xc2080c4280, 0xc2087cbbe8, 0x1, 0x1, 0x0, 0x0, 0x0) /home/ec2-user/local/go/src/database/sql/sql.go:1455 +0x49a # DB.mu ���ԤäƤ��� DB.addDep. �����Ʊ�������å�����פ�¿��. goroutine 64 [semacquire]: sync.(*Mutex).Lock(0xc208096de0) /home/ec2-user/local/go/src/sync/mutex.go:66 +0xd3 database/sql.(*DB).addDep(0xc208096dc0, 0x7f0932f0e4d8, 0xc2080c4280, 0x73d340, 0xc2085f0540) /home/ec2-user/local/go/src/database/sql/sql.go:364 +0x38 database/sql.(*Stmt).Query(0xc2080c4280, 0xc20899fbe8, 0x1, 0x1, 0x0, 0x0, 0x0) /home/ec2-user/local/go/src/database/sql/sql.go:1455 +0x49a
�������������������İ��Ǥ��ޤ�����
Stmt.connStmt()
��(���Ū)Ĺ����Stmt.mu
����å����Ƥ���Τǡ�Stmt
�����ޤꤿ�����������ư���ʤ���Stmt.connStmt()
�Ϸ����֤�DB.connIfFree()
��ƤӽФ���������DB.mu
�Υ��å������礷�Ƥ��뤿���٤��ʤ롣DB.mu
�Υ��å���������DB.addDep()
����1: DB.mu ��ʬΥ����
DB.addDep()
���ɤ�Ǥߤ�ȡ����ȥ�����������ǥ꥽������������Ƥ��ơ��Ǹ�˥꥽�����β�����ԤäƤ���褦�Ǥ���
���ȥ�����ȤȲ���������������뤿��� map ���뤿��� DB.mu
����å�������¾���Ƥ��ޤ������������Ω���� Mutex ��ʬΥ�Ǥ��ޤ���
DB.connIfFree()
�� DB.mu
�����å�����򵯤����ʤ���н�ʬ��®���ʤ��ǽ�������ꡢ����ʤ鿶���񤤤�����ѹ�������������褹�뤳�Ȥ��Ǥ��ޤ���
���������ºݤ˥��å���ʬΥ���Ƥߤ��Ȥ�����2�����٤�����ǽ������������ DB
���Τ�ʣ�����äƥ饦��ɥ��ӥ󤹤�Τ���٤�Ȥޤ���ǽ�����ʤê°ï¿½ï¿½ï¿½Ç¤ï¿½ï¿½ï¿½
DB.mu
�Υ��å�������褷�Ƥ⡢ Stmt.connStmt()
�� Stmt.mu
����å����Ƥ�����¦���ޤ��٤��Τ� Stmt.mu
�Υ��å����礬��褵��Ƥʤ��褦�Ǥ���
Mutex ��ʬΥ�ϥѥå����ꤲ�Ĥġ� Stmt.connStmt()
�ι�®���˾��Ф��ޤ���
����2: Stmt.connStmt() / DB.connIfFree() ����
Stmt.connStmt()
�� Stmt.css
���Ф��ƥ롼�פ� DB.connIfFree()
��ƤӽФ��Ƥ���ΤǤ��������Υ롼�פ� prepare �Ѥߤ���³�������Ƥ����餽������Ѥ���Ȥ�����Ū�ȡ� prepare �Ѥߤ���³�� close ����Ƥ����� Stmt.css
��������Ȥ���2�Ĥ���Ū������ޤ���
����������³�� close ����Ƥ��뤫�ɤ��������Ѥ���Ƥ��뤫�ɤ����ϡ� DB.mu
����å����Ƥ�������С� DB
�Υ��Ф򻲾Ȥ��ʤ��Ƥ��®��Ƚ��Ǥ��ޤ���
�����ǡ� Stmt.connStmt()
����� Stmt.css
���Ф���롼�פγ�¦��ľ�� DB.mu
����å����Ƥ��ޤ����ʤ�������³�Υ����å���롼�����ľ�ܹԤ� DB.connIfFree()
�θƤӽФ��򸺤餹������Ԥä��Ȥ��������٤�ʣ�� DB
�Υ饦��ɥ��ӥ��Ʊ�����٤�®�٤��Ǥ�褦�ˤʤ�ޤ�����
���������̿�Ȥ��Ƥޤ��ѥå����ꤲ�ޤ��� ����
Go �˥ѥå�����������ޤ��ޤ�
�Ȥꤢ���� Go �� Contribution Guideline ���ɤߤޤ��礦�� �ʲ������Ĥޤ���������ޤ���
�ǽ�� Github Issue �ǽ�������ޤ������ˤˤĤ��ƹ�դ�ȤäƤ����ޤ���
������Ϥ�����ˡ� Google �� CLA �˽�̾���Ƥ����ޤ��礦�� ����
Go�Υ�ݥ��ȥ�ϺǶ� Mercurial ���� Git �˰ܹԤ��ޤ�������Github�˰ܹԤ����櫓�ǤϤ���ޤ��� Github �� Issue Tracker �ȡ���ݥ��ȥ�Υ�����������Ѥ���Ƥ��ޤ������ꥸ�ʥ�Υ�ݥ��ȥ�ξ��� https://go.googlesource.com/go �ʤΤǡ� github ���� clone ���Ƥ���ʤ� git upstream set-url
�ʤɤ� origin �θ�������Ѥ���ɬ�פ�����ޤ���
Go �Υ����ɥ�ӥ塼�� Gerrit �ǹԤ��Ƥ��ޤ��������˥����������ƥ������󤷡����ޥ�ɥ饤��ġ��뤫��ѥå����ꤲ��Τ�ɬ�פʥѥ���ɤ�ȯ�Ԥ��Ƥ����ޤ���
���ˡ� git-codereview �Ȥ����ġ���򥤥󥹥ȡ��뤷�ޤ���
go get -u golang.org/x/review/git-codereview
���Υġ���ϡ��ѥå���1���ߥåȤΥ֥����Ȥ������Ǵ����������Υѥå��� gerrit �����������ΤǤ��� git �˴��줿�͸�������������ȼ��Τ褦�ˤʤ�ޤ���
git codereview change fix-abc
��git checkout -b fix-abc
����git codereview change
�ϡ��ǽ�Υ��ߥåȤǤ����git commit
������2���ܰʹߤ�git commit --amend
����. (commit
��Ʊ��-a
�����Ѳ�ǽ).git codereview sync
��git fetch origin && git rebase origin/master
����git codereview mail -diff
��git diff HEAD..master
����git codereview mail
�� Gerrit �˥ѥå�������
�ѥå����ꤲ��ȥ�ӥ塼���Ϥޤ�ޤ��� (Go �γ�ȯ�ϤȤƤ��ȯ�ǡ���ö�˥ѥå����ꤲ���餽�����Τ����˥����Ȥ��Ĥ��ƤӤä��ꤷ�ޤ���)
- ��ޤ����߷�
- �����ɤν��������ߥåȥ����ν���
- �ƥ��Ȥν���
- �����Ȥν���
�Ȥ��������ǡ���ӥ塼�����������ܤäƤ�����ʣ���� Googler ���鷫���֤���ӥ塼������ޤ���
��ӥ塼���̤ä�����
��ӥ塼�ν���ǡ� prepare �Ѥߤ���³��ͥ�褷�ƻȤ��Ȥ����������Τ�ä��ʤ������˥���ץ���߷פˤʤ�ޤ����� ����� Github Issue �λ�������Ƥ���Ƥ������ˤǡ������ȥ����Ȥ��ɤ�Ǥ����Ф��ߤ���̵�̤ʻ��֤�ʤ����Ϥ��Ǥ���
�ƥ��ȤˤĤ��Ƥϡ���¸�Υ٥���ޡ������ñ�˽������Ƥ����ΤǤ�����ʿ�����Υ٥���ޡ����� RunParallel
��Ȥ��褦�˻�Ŧ����ơ����Τޤޤ�������Ȥ��ƻȤ���褦�ʥ���ץ�򥳥��Ȥ��Ƥ�餤�ޤ�������¸�Υե�����ξ岼���쥬�����ʤ鼫ʬ�ν�����ʬ��쥬�����ʽ������������櫓�ǤϤʤ��褦�Ǥ���
�Ǹ�����ϡ������Ȥ��оݹԤα��˽ñ¤¯¤È¤ï¿½ï¿½Ï¼ï¿½ï¿½ï¿½ï¿½Î¬ï¿½ï¿½ï¿½Æ¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½É¡ï¿½Ä¹ï¿½ï¿½ï¿½Ê¤Ã¤ï¿½ï¿½Ð¾Ý¹Ô¤Î¾ï¿½Ë°ï¿½Æ°ï¿½ï¿½ï¿½ï¿½Ê¤ï¿½ï¿½ï¿½ï¿½ï¿½È¼ï¿½ì¤«ï¿½ï¿½ñ¤»Ï¤ï¿½ï¿½È¤ï¿½ï¿½ï¿½ï¿½Ñ¸ï¿½Î¹ï¿½Ê¸ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ó¤·¤Ê¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½É¤È´Ø·ï¿½ï¿½Ê¤ï¿½ï¿½ï¿½Å¦ï¿½È½ï¿½ï¿½ï¿½ï¿½Î·ï¿½ï¿½ï¿½ï¿½Ö¤ï¿½ï¿½Ç¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ç½ï¿½Åªï¿½Ë¼ï¿½ï¿½ï¿½ï¿½Þ¤ï¿½ï¿½Þ¤Ç¤Ë¥Ñ¥Ã¥ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ã¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½13��ˤʤ�ޤ�����
�֤ä��㤱�Ƹ����С�Ĵ����̤�ܺ٤� Issue ����𤹤�����ǻߤ�Ƥ����ơ��ºݤν����� Googler ��Ǥ���Ƥ��ޤä�������������Ǥʤ���ӥ塼����¦��ڤ��ä��Ǥ��礦������Ǥ⡢ʣ���� Googler ������ǫ�ʥ����ɥ�ӥ塼�������Ȥ����Τϵ��Ťʷи��Ǥ������֤��ȤϤ�äȤ�����פȸ��鷺���Ǹ�ޤǥ�ӥ塼���դ���äƤ��äƴ��դ��Ƥ��ޤ���