应用性能瓶颈分析(nginx)
应用性能瓶颈分析(nginx)
性能指标
-
CPU 负载
- top 观察 Nginx CPU 消耗情况,同时也要观察每个 CPU 核数的情况
- 观察 Nginx 每个 worker 进程的 CPU 消耗是否均匀。正常而言,nginx 的各个 worker 进程的 CPU 消耗应该都要比较均匀,如果相差 20% 以上,那么就一定存在 CPU 消耗不均的问题。
-
活跃的连数
- 通过
netstat -s |grep active
获取当前活跃的连接,然后做差值。
- 通过
-
连接队列数
- 连接队列如果太小,那么需要调整系统和 nginx 的配置
安装 nginx
- 从官网下载 nginx
- wget https://nginx.org/download/nginx-1.24.0.tar.gz
- 解压压缩包,进入 nginx 目录
- tar -xzvf nginx-1.24.0.tar.gz
- cd nginx-1.24.0
- 编译&安装
- ./configure --with-http_stub_status_module --with-http_ssl_module
- make&make install
-
配置监控模块
server { listen 80; server_name localhost; location /nginx-status { stub_status on; access_log on; } }
-
启动 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. 分析日志:
- 根据访问 IP 统计 UV
awk '{print $1}' /var/log/nginx/access.log | sort -n | uniq | wc -l
- 查询访问最频繁的 IP(前 10)
awk '{print $1}' /var/log/nginx/access.log | sort -n |uniq -c | sort -rn | head -n 10
- 查看访问 100 次以上的 IP
awk '{print $1}' /var/log/nginx/access.log | sort -n |uniq -c |awk '{if($1 >100) print $0}'|sort -rn
- 查看指定 ip 访问过的 url 和访问次数
grep "39.105.67.140" /var/log/nginx/access.log|awk '{print $7}' |sort |uniq -c |sort -n -k 1 -r
- 根据访问 URL 统计 PV
cat /var/log/nginx/access.log |awk '{print $7}' |wc -l
- 查询访问最频繁的 URL(前 10)
awk '{print $7}' /var/log/nginx/access.log | sort |uniq -c | sort -rn | head -n 10
- 查看访问最频的 URL([排除/api/appid])(前 10)
grep -v '/api/appid' /var/log/nginx/access.log|awk '{print $7}' | sort |uniq -c | sort -rn | head -n 10
- 查看页面访问次数超过 100 次的页面
cat /var/log/nginx/access.log | cut -d ' ' -f 7 | sort |uniq -c | awk '{if ($1 > 100) print $0}' | less
- 查看最近 1000 条记录,访问量最高的页面
tail -1000 /var/log/nginx/access.log |awk '{print $7}'|sort|uniq -c|sort -nr|less
- 统计每小时的请求数,top10 的时间点(精确到小时)
awk '{print $4}' /var/log/nginx/access.log |cut -c 14-15|sort|uniq -c|sort -nr|head -n 10