Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ベンチマーカーのコネクションリーク #3

Open
methane opened this issue Oct 19, 2016 · 1 comment · May be fixed by #4
Open

ベンチマーカーのコネクションリーク #3

methane opened this issue Oct 19, 2016 · 1 comment · May be fixed by #4

Comments

@methane
Copy link

methane commented Oct 19, 2016

https://github.com/isucon/isucon6-qualify/blob/master/bench/cli.go#L70
ここで scenario 関数を実行するたびに NewSession() していて、

https://github.com/isucon/isucon6-qualify/blob/master/bench/checker/session.go#L46
ここで Session ごとに Transport を作ってしまっているのですが、 Transport はコネクションプールに
なっているので、 Session & Transport を GC 任せに破棄すると、その Transport に
残っている http クライアントのコネクションが開放されずにベンチマーカー終了まで
残ってしまうように見えます。

そのため、アプリ側のチューニングが進むと、ベンチマーカー側が too many open files になったり、
ポートが枯渇したりして、スコアが上がらなくなります。

回避策としては、

  1. 一つの大きめの Transport を用意し、全部の Session で共有する
  2. どうしても Session 間で Transport を共有したくない場合は、 scenario の終了後 (Transportがもう利用されてない状態で) CloseIdleConnections を呼ぶことで、 keep-alive しているコネクションを開放してやる

Go の想定している使い方としては 1 の方がおすすめですが、それだと1つのTCPコネクションを
通して複数のユーザーのhttpリクエストが送られてくることになるので、多数のブラウザからの
(ロードバランサーなどを介さない)接続をエミュレートしたいなら 2 の方が近くなります。

@methane
Copy link
Author

methane commented Oct 19, 2016

なお、「大きめのTransport」とは、 Transport の以下のメンバーを適切に設定することを意味しています。

        // MaxIdleConns controls the maximum number of idle (keep-alive)
        // connections across all hosts. Zero means no limit.
        MaxIdleConns int

        // MaxIdleConnsPerHost, if non-zero, controls the maximum idle
        // (keep-alive) connections to keep per-host. If zero,
        // DefaultMaxIdleConnsPerHost is used.
        MaxIdleConnsPerHost int

https://golang.org/pkg/net/http/#Transport

その下にある以下の文が、「Go の想定している使い方」を説明しています。

By default, Transport caches connections for future re-use. This may leave many open connections when accessing many hosts. This behavior can be managed using Transport's CloseIdleConnections method and the MaxIdleConnsPerHost and DisableKeepAlives fields.

@methane methane linked a pull request Oct 19, 2016 that will close this issue
cocodrips referenced this issue in cocodrips/isucon6-qualify Aug 19, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant