読者です 読者をやめる 読者になる 読者になる

non vorrei lavorare

ブログ名の通りです。javascript three.js mruby rust OCaml golang julialang blender

libtrusterdでHTTP/2でphpを動かして分かったことのその後 #知見

おはようございます。長男は最近ブロック作りが上達して、飛行機の構造も少し理解してきたようで、垂直尾翼水平尾翼がどういうパーツなのかわかっているようです。kjunichiです。

.

これまでのあらすじ

abrakatabura.hatenablog.com

一筋縄では解決しないと思い、気長に、HTTP2のハッカソンに参加したり、別の処理系でのHTTP2を動かすなどの活動をしていた。

きっかけ

エラー処理が動いていた

メモリ使用量に着目して、h2oや、nghttp2のpythonバインディングによるサーバーを作っては、これらでは同様の条件にしても、ある程度メモリ使用量に増加は見られるが、減少することもあり、trusterd(mruby-http2)でのそれとは異なる挙動を示していた。 が、valgrindでもleakが検出されないし、正直お手上げ状態だった。

本来はこのあたり、ここにペタペタ貼りたかったが、だいぶ期間を置いてしまったのと、Docker上のコンテナで作業していたものの一部が、VMごと、消し飛んでしまい。詳細を記録化することができない。

h2loadで負荷をかけるとエラーが発生することがある

h2loadでクライアント数や多重化数を増やすとOSXをデフォルトで使っていると簡単にサーバー側でエラーが発生する。 Docker使ってLinuxでも検証していたが、こちらでも負荷が増えるとエラーが発生していたようだった。

しかし、これに気付かず、h2loadを繰り返し動かし、その後のメモリ使用量を表示するツールまで作成し、HTTPリクエストの処理結果は気にしていなかった。65536バイト返す単純なものなので、まさかエラーが発生することがあるとは思いもしなかった。

今回特定できたLeak箇所

Http2サーバーでリクエストに対して処理中エラーが発生した際に、確保していた構造体自身の領域の解放だった。

まとめ

  • サーバー処理は、負荷が一定以上超えるとリクエストが正常に処理できない状況が発生する
  • エラー処理でもきちんと不要となったメモリの解放処理を行う
  • メモリ使用量はエラーレスポンスを返す状況も含めて確認する
  • id:matsumoto_r さんすごい!

github.com