Skip to content

应用性能瓶颈分析(nginx)

应用性能瓶颈分析(nginx)

性能指标

  1. CPU 负载

    • top 观察 Nginx CPU 消耗情况,同时也要观察每个 CPU 核数的情况
    • 观察 Nginx 每个 worker 进程的 CPU 消耗是否均匀。正常而言,nginx 的各个 worker 进程的 CPU 消耗应该都要比较均匀,如果相差 20% 以上,那么就一定存在 CPU 消耗不均的问题。
  2. 活跃的连数

    • 通过 netstat -s |grep active 获取当前活跃的连接,然后做差值。
  3. 连接队列数

    • 连接队列如果太小,那么需要调整系统和 nginx 的配置

安装 nginx

  1. 从官网下载 nginx
    • wget https://nginx.org/download/nginx-1.24.0.tar.gz
  2. 解压压缩包,进入 nginx 目录
    • tar -xzvf nginx-1.24.0.tar.gz
    • cd nginx-1.24.0
  3. 编译&安装
    • ./configure --with-http_stub_status_module --with-http_ssl_module
    • make&make install
  4. 配置监控模块

    server {
    listen 80;
    server_name localhost;
    location /nginx-status {
    stub_status on;
    access_log on;
    }
    }
    
  5. 启动 nginx:/usr/local/nginx/sbin/nginx

nginx 监控

  • 测试请求地址:http://127.0.0.1/api/testRandomRedis.json?maxInt=1000
  • 监控访问地址:http://127.0.0.1/nginx-status
    Active connections: 2
    server accepts handled requests
    26 26 48
    Reading: 0 Writing: 1 Waiting: 1
    
  • Active connections:与后端建立的服务连接数
  • server accepts handled requests:Nginx 总共处理了 26 个连接,成功创建了 26 次握手,总共处理了 48 个请求
  • Reading:nginx 读取到客户端的 Header 信息数
  • Writing:nginx 返回到客户端的 Header 信息数
  • Waiting:开启 Keep-alive 的情况下,这个值等于 Active -(Reading + Writing)。表示 nginx 已经处理完成,正在等候下次一次请求的连接数。
  • 正常情况下 waiting 数量是比较多的,并不能说明性能差。如果 reading+writing 数量比较多说明服务并发有问题。

日志分析

1. 配置日志格式

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
           '$status $body_bytes_sent "$http_referer" '
           '"$http_user_agent" "$http_x_forwarded_for" $request_time $upstream_response_time';
127.0.0.1 - - [05/Aug/2023:00:22:18 +0800] "GET /api/testBigMapApi.json HTTP/1.1" 200 66 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36" "-" 0.122 0.122
127.0.0.1 - - [05/Aug/2023:00:22:19 +0800] "GET /api/testBigMapApi.json HTTP/1.1" 200 66 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36" "-" 0.069 0.069

2. 参数说明

  • $remote_addr: 客户端的 ip 地址
  • $remote_user: 用于记录远程客户端的用户名称
  • $time_local: 用于记录访问时间和时区
  • $request: 用于记录请求的 url 以及请求方法
  • $status: 响应状态码
  • $body_bytes_sent: 给客户端发送的文件主体内容字节数
  • $http_referer: 可以记录用户是从哪个链接访问过来的
  • $http_user_agent: 用户所使用的浏览器信息
  • $http_x_forwarded_for: 可以记录客户端 IP,通过代理服务器来记录客户端的 ip 地址
  • $ request_time: 指的是从接受用户请求的第一个字节到发送完响应数据的时间,即$request_time 包括接收客户端请求数据的时间、后端程序响- 的时间、发送响应数据给客户端的时间
  • $upstream_response_time: 用于接收来自上游服务器的响应的时间

3. 分析日志:

  1. 根据访问 IP 统计 UV awk '{print $1}' /var/log/nginx/access.log | sort -n | uniq | wc -l
  2. 查询访问最频繁的 IP(前 10) awk '{print $1}' /var/log/nginx/access.log | sort -n |uniq -c | sort -rn | head -n 10
  3. 查看访问 100 次以上的 IP awk '{print $1}' /var/log/nginx/access.log | sort -n |uniq -c |awk '{if($1 >100) print $0}'|sort -rn
  4. 查看指定 ip 访问过的 url 和访问次数 grep "39.105.67.140" /var/log/nginx/access.log|awk '{print $7}' |sort |uniq -c |sort -n -k 1 -r
  5. 根据访问 URL 统计 PV cat /var/log/nginx/access.log |awk '{print $7}' |wc -l
  6. 查询访问最频繁的 URL(前 10) awk '{print $7}' /var/log/nginx/access.log | sort |uniq -c | sort -rn | head -n 10
  7. 查看访问最频的 URL([排除/api/appid])(前 10) grep -v '/api/appid' /var/log/nginx/access.log|awk '{print $7}' | sort |uniq -c | sort -rn | head -n 10
  8. 查看页面访问次数超过 100 次的页面 cat /var/log/nginx/access.log | cut -d ' ' -f 7 | sort |uniq -c | awk '{if ($1 > 100) print $0}' | less
  9. 查看最近 1000 条记录,访问量最高的页面 tail -1000 /var/log/nginx/access.log |awk '{print $7}'|sort|uniq -c|sort -nr|less
  10. 统计每小时的请求数,top10 的时间点(精确到小时) awk '{print $4}' /var/log/nginx/access.log |cut -c 14-15|sort|uniq -c|sort -nr|head -n 10