Kilroy Was Here

不定期更新の技術ブログ

Go言語とWebSocketサーバ

電子メールサービス会社Mail.Ruの開発者Sergey Kamardin氏が、

Go言語を用いて高負荷対応のWebSocketサーバをいかに開発したか

説明している。

postd.cc記事内では、下記のような最適化手法について説明されている。

  • 内部バッファを使った読み込みゴルーチンは高コストです。解決策:netpoll(epoll, kqueue)、バッファの再利用。
  • 内部バッファを使った書き出しゴルーチンは高コストです。解決策:必要な時にゴルーチンを開始。バッファの再利用。
  • 接続の集中に対しては、netpollは有効ではありません。解決策:数を制限した上でのゴルーチンの再利用。
  • net/httpはWebSocketへアップグレードする最速の方法ではありません。解決策:単なるTCP接続については、ゼロコピーアップグレードを使用。

なお、これらの最適化は全ての場合において有効だとは言えないようだ。

オンライン接続数と比較して、フリーリソースの割合がかなり高い場合、

最適化の効果はほとんどない可能性があるとのこと。