本記事は 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周りの話と、レスポンス部分について読み進められたいです(白目