Go言語とWebSocketサーバ
電子メールサービス会社Mail.Ruの開発者Sergey Kamardin氏が、
Go言語を用いて高負荷対応のWebSocketサーバをいかに開発したか
説明している。
postd.cc記事内では、下記のような最適化手法について説明されている。
- 内部バッファを使った読み込みゴルーチンは高コストです。解決策:netpoll(epoll, kqueue)、バッファの再利用。
- 内部バッファを使った書き出しゴルーチンは高コストです。解決策:必要な時にゴルーチンを開始。バッファの再利用。
- 接続の集中に対しては、netpollは有効ではありません。解決策:数を制限した上でのゴルーチンの再利用。
net/http
はWebSocketへアップグレードする最速の方法ではありません。解決策:単なるTCP接続については、ゼロコピーアップグレードを使用。
なお、これらの最適化は全ての場合において有効だとは言えないようだ。
オンライン接続数と比較して、フリーリソースの割合がかなり高い場合、
最適化の効果はほとんどない可能性があるとのこと。