2015ǯ01��26��

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 �Ǥ�������ϥ��ͥ������ס���ˤʤäƤ��ơ��ʲ��Τ褦�ʻȤ����򤷤ޤ���

  1. DB.Exec() �� DB.Query() ��ľ�ܥ�������ꤲ��
  2. DB.Prepare() �ǥץ�ڥ��ɥ��ơ��ȥ��Ȥ�ɽ�� Stmt ���֥������Ȥ��ꡢ Stmt.Exec() �� Stmt.Query() ��Ȥ�
  3. 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 �γ�ȯ�ϤȤƤ��ȯ�ǡ���ö�˥ѥå����ꤲ���餽�����Τ����˥����Ȥ��Ĥ��ƤӤä��ꤷ�ޤ���)

  1. ��ޤ����߷�
  2. �����ɤν��������ߥåȥ����ν���
  3. �ƥ��Ȥν���
  4. �����Ȥν���

�Ȥ��������ǡ���ӥ塼�����������ܤäƤ�����ʣ���� Googler ���鷫���֤���ӥ塼������ޤ���

��ӥ塼���̤ä�����

��ӥ塼�ν���ǡ� prepare �Ѥߤ���³��ͥ�褷�ƻȤ��Ȥ����������Τ�ä��ʤ������˥���ץ���߷פˤʤ�ޤ����� ����� Github Issue �λ�������Ƥ���Ƥ������ˤǡ������ȥ����Ȥ��ɤ�Ǥ����Ф��ߤ���̵�̤ʻ��֤�ʤ����Ϥ��Ǥ���

�ƥ��ȤˤĤ��Ƥϡ���¸�Υ٥���ޡ������ñ�˽������Ƥ����ΤǤ�����ʿ�����Υ٥���ޡ����� RunParallel ��Ȥ��褦�˻�Ŧ����ơ����Τޤޤ�������Ȥ��ƻȤ���褦�ʥ���ץ�򥳥��Ȥ��Ƥ�餤�ޤ�������¸�Υե�����ξ岼���쥬�����ʤ鼫ʬ�ν�����ʬ��쥬�����ʽ������������櫓�ǤϤʤ��褦�Ǥ���

�Ǹ�����ϡ������Ȥ��оݹԤα��˽񤯤Ȥ��ϼ����ά���Ƥ������ɡ�Ĺ���ʤä��оݹԤξ�˰�ư����ʤ�����ȼ�줫��񤭻Ϥ��Ȥ����Ѹ�ι�ʸ�������󤷤ʤ����������ɤȴط��ʤ���Ŧ�Ƚ����η����֤��Ǥ������ǽ�Ū�˼����ޤ��ޤǤ˥ѥå������ä������13��ˤʤ�ޤ�����

�֤ä��㤱�Ƹ����С�Ĵ����̤�ܺ٤� Issue ����𤹤�����ǻߤ�Ƥ����ơ��ºݤν����� Googler ��Ǥ���Ƥ��ޤä�������������Ǥʤ���ӥ塼����¦��ڤ��ä��Ǥ��礦������Ǥ⡢ʣ���� Googler ������ǫ�ʥ����ɥ�ӥ塼�������Ȥ����Τϵ��Ťʷи��Ǥ������֤��ȤϤ�äȤ�����פȸ��鷺���Ǹ�ޤǥ�ӥ塼���դ���äƤ��äƴ��դ��Ƥ��ޤ���


@methane
songofacandy at 18:46��Comments(0)��TrackBack(0)��golang 

�ȥ�å��Хå�URL

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

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