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

Nginxにgprof掛けて、HTTP/2周りの関数呼び出し順を確認したりした

本記事は http2 Advent Calendar 2015 の 13 日目の記事となります。


すみません、すみません。。。
以前、nginx 1.9.3 のHTTP/2部分のコードを読んでいたのですが、続きを出来てなかったので続きをやろうと思いましたが、間に合いませんでした。。。

gprofした

以前の記事は、コードを読む一方でしたがちゃんとツールを使ってみたいなと思って、gprofとやらにかけてみました。そこから得られたデータでこんな感じの関数の呼び出し順を確認できます。




また、呼び出し回数及び処理時間なども確認できます。

vagrant@vagrant:~$ gprof ./nginx-1.9.9/objs/nginx --no-graph |grep -e v2 -e time
 time   seconds   seconds    calls  ms/call  ms/call  name
  7.41      0.02     0.02    25784     0.00     0.00  ngx_http_v2_send_output_queue
  3.70      0.07     0.01    90244     0.00     0.00  ngx_http_v2_get_indexed_header
  3.70      0.08     0.01    90244     0.00     0.00  ngx_http_v2_state_process_header
  3.70      0.15     0.01    12892     0.00     0.00  ngx_http_v2_close_stream
  3.70      0.18     0.01     6446     0.00     0.00  ngx_http_v2_send_settings
  0.00      0.27     0.00   112805     0.00     0.00  ngx_http_v2_parse_int
  0.00      0.27     0.00    90244     0.00     0.00  ngx_http_v2_state_header_block
  0.00      0.27     0.00    90244     0.00     0.00  ngx_http_v2_state_header_complete
  0.00      0.27     0.00    51568     0.00     0.00  ngx_http_v2_write_int
  0.00      0.27     0.00    48345     0.00     0.00  ngx_http_v2_get_node_by_id
  0.00      0.27     0.00    38676     0.00     0.00  ngx_http_v2_state_complete
  0.00      0.27     0.00    38676     0.00     0.00  ngx_http_v2_state_head
  0.00      0.27     0.00    29007     0.00     0.00  ngx_http_v2_node_children_update
  0.00      0.27     0.00    29007     0.00     0.00  ngx_http_v2_set_dependency
  0.00      0.27     0.00    22561     0.00     0.00  ngx_http_v2_state_field_len


以前読んだ時は1.9.3の時でしたが、ngx_http_v2_set_dependency といった優先処理の部分が追加されていること。
レスポンスを生成するFilter部分の処理の流れ。等が確認できました。

使い方

configureする時に 「--with-cc-opt="-pg" --with-ld-opt="-pg"」 つけてビルドする

./configure  --with-cc-opt="-pg" --with-ld-opt="-pg" --with-http_v2_module
make


nginx.confで、daemonとmaster_processを無効化しておく

daemon off;
master_process off;


バイナリを実行すると、gmon.outが生成されるので、gprofに掛ける。
https://github.com/jrfonseca/gprof2dot でグラフ化出来ます。

./nginx-1.9.9/objs/nginx

gprof ./nginx-1.9.9/objs/nginx ./gmon.out #プロファイル結果
gprof ./nginx-1.9.9/objs/nginx --no-static | ./gprof2dot/gprof2dot.py |dot -Tpng -o output.png #グラフ化する


こんな感じです。ngx_google_perftools_module というものもあるようですが、なんか上手く動かなかったです。

次回は、nginxのpriority周りの話と、レスポンス部分について読み進められたいです(白目