isucon nginx + alp で access log performance を計測する nginx の設定
ISUCON 本で紹介されているログ形式。
自分が確認したいログの項目を log_format json に追加すればいい。
Docker の場合
code:nginx
# json という名前でログ形式を定義する
log_format json escape=json '{"time":"$time_iso8601",'
'"host":"$remote_addr",'
'"port":"$remote_port",'
'"method":"$request_method",'
'"uri":"$request_uri",'
'"status":"$status",'
'"body_bytes":$body_bytes_sent,'
'"referer":"$http_referer",'
'"ua":"$http_user_agent",'
'"request_time":"$request_time",'
'"response_time":"$upstream_response_time"}';
server {
listen 80;
# json というログ形式を使う(上記で定義している)
access_log /var/log/nginx/access.log json;
}
インスタンスの場合
http の場合は http 句のなかで log_format を定義しないとだめそう
code: nginx
http {
log_format json escape=json '{"time":"$time_iso8601",'
'"host":"$remote_addr",'
'"port":"$remote_port",'
'"method":"$request_method",'
'"uri":"$request_uri",'
'"status":"$status",'
'"body_bytes":$body_bytes_sent,'
'"referer":"$http_referer",'
'"ua":"$http_user_agent",'
'"request_time":"$request_time",'
'"response_time":"$upstream_response_time"}';
##
# Logging Settings
##
access_log /var/log/nginx/access.log json;
にもログ形式が記載されているため、自分の出したいログの情報を考慮してフォーマットを決める
上記の設定を追記したら、 systemctl で nginx を restart する
nginx ログをローテートする
nginx のログを Rotate することによって、ISUCON app 改善後のパフォーマンスを計測できるようにする code: bash
DT=$(date +%Y-%m-%d-%H-%M-%S)
mv /var/log/nginx/access.log /var/log/nginx/access.$DT.log
nginx -s reopen
alp で計測する
alp は access log profiler であり、 isucon で主に用いられている。
ISUCON のベンチマークなど、非常に短期間のログを集計したい場合に利用する。
https://scrapbox.io/files/672813d35d7c01c3cfaffd7c.png
code:bash
❯ cat logs/nginx/access.log | alp json --body-bytes-key=body_bytes --matching-groups="/image/\d+\.(jpg|png),/posts/\d+,/@\w+" -r --sort=avg
+-------+-----+-----+-----+-----+-----+--------+-----------------------+-------+-------+-------+-------+-------+-------+-------+--------+-----------+-------------+--------------+------------+
| COUNT | 1XX | 2XX | 3XX | 4XX | 5XX | METHOD | URI | MIN | MAX | SUM | AVG | P90 | P95 | P99 | STDDEV | MIN(BODY) | MAX(BODY) | SUM(BODY) | AVG(BODY) |
+-------+-----+-----+-----+-----+-----+--------+-----------------------+-------+-------+-------+-------+-------+-------+-------+--------+-----------+-------------+--------------+------------+
| 3 | 0 | 3 | 0 | 0 | 0 | GET | / | 1.462 | 1.650 | 4.681 | 1.560 | 1.650 | 1.650 | 1.650 | 0.077 | 34771.000 | 35612.000 | 105185.000 | 35061.667 |
| 4 | 0 | 4 | 0 | 0 | 0 | GET | /@\w+ | 0.032 | 0.668 | 0.901 | 0.225 | 0.668 | 0.668 | 0.668 | 0.261 | 1961.000 | 12809.000 | 14770.000 | 3692.500 |
| 1 | 0 | 0 | 1 | 0 | 0 | POST | /login | 0.196 | 0.196 | 0.196 | 0.196 | 0.196 | 0.196 | 0.196 | 0.000 | 0.000 | 0.000 | 0.000 | 0.000 |
| 8 | 0 | 7 | 0 | 1 | 0 | GET | /posts/\d+ | 0.070 | 0.588 | 1.321 | 0.165 | 0.588 | 0.588 | 0.588 | 0.161 | 1601.000 | 4199.000 | 15827.000 | 1978.375 |
| 78 | 0 | 78 | 0 | 0 | 0 | GET | /image/\d+\.(jpg|png) | 0.003 | 0.518 | 6.006 | 0.077 | 0.196 | 0.233 | 0.518 | 0.085 | 46721.000 | 1057927.000 | 16159238.000 | 207169.718 |
| 3 | 0 | 0 | 3 | 0 | 0 | POST | /comment | 0.023 | 0.055 | 0.105 | 0.035 | 0.055 | 0.055 | 0.055 | 0.014 | 0.000 | 0.000 | 0.000 | 0.000 |
| 1 | 0 | 1 | 0 | 0 | 0 | GET | /img/ajax-loader.gif | 0.027 | 0.027 | 0.027 | 0.027 | 0.027 | 0.027 | 0.027 | 0.000 | 673.000 | 673.000 | 673.000 | 673.000 |
| 1 | 0 | 1 | 0 | 0 | 0 | GET | /login | 0.007 | 0.007 | 0.007 | 0.007 | 0.007 | 0.007 | 0.007 | 0.000 | 1166.000 | 1166.000 | 1166.000 | 1166.000 |
+-------+-----+-----+-----+-----+-----+--------+-----------------------+-------+-------+-------+-------+-------+-------+-------+--------+-----------+-------------+--------------+------------+