搜索文章

输入关键词开始搜索

网站流量统计与问题排查

思考#程序设计#Linux#Nginx

这是早期排查一个 Web 产品流量过大的复盘记录。

当时没有先猜原因,而是先从 nginx 访问日志里确认到底是谁在吃流量,再按类型处理:能压缩的压缩,能缓存的缓存,返回了冗余数据的就减少返回内容。下面记的是当时实际遇到的问题、解决步骤和用到的排查命令。

常见流量问题

GZIP 压缩未开启

某产品页没有开启GZIP,返回的原始数据很大,开启后减少了80%的数据大小

缓存利用率低

比如该产品的首页,很多内容针对所有用户都是相同的,但是每个用户来访问,都把整个页面重新返回了,页面html有4000多行,大小150K,这会造成非常多的流量 这种情况,可以动静拆分,对静态数据做好缓存

返回冗余数据

还是该产品,请求某个列表接口时,将文章列表和每篇文章的具体数据都返回了,而文章内容只有在用户点击后才会展示 不过这个问题,根本原因应该是请求加了随机数,没有命中缓存

解决方案

  1. 开启 GZIP
  2. 开启后,发现现在流量最大的是精品内参返回的 JSON 数据。JSON 格式对于流量本身就有优化效果,仅靠 GZIP 已经不明显了,因此对数据进行拆分,按需加载,并减小自动刷新的数据返回。
  3. 首页 HTML 请求在开启 GZIP 后,流量已经大大减小,动静分离的优化效果不明显,因此暂不优化。

排查思路小结

这类流量问题排查的关键是别凭感觉猜,先让日志说话:按响应大小、耗时排序,找出最吃流量的几个请求,再逐个分析是“没压缩”“没缓存”还是“返回了用不上的数据”。命令记在这里,下次遇到同样的问题可以直接套用。

排查命令

目前 nginx 日志的格式,基本都是:

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    '$status $body_bytes_sent $request_time $cookie_userid "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for"';

所以awk解析时,$4-日期 $7-uri $10-响应数据大小 $11-响应时间 $(NF-2)-IP

查看耗时较久的请求

cat /usr/local/nginx/logs/cso.access.log|awk ’($4>“[18/Mar/2015:00:00:00” && $11>1){print $4”—“$11”—“$7}‘

统计某一天的流量大小

cat /usr/local/nginx/logs/yjs.access.log|awk ’($4>“[16/Mar/2015:00:00:00” && $4<“[17/Mar/2015:00:00:00”){c+=$10}END{print c}‘

查看某天响应数据最大的100个请求

cat /usr/local/nginx/logs/poi.access.log|awk ’($4>“[16/Mar/2015:00:00:00” && $4<“[17/Mar/2015:00:00:00”){print $10”\t\t”$7}‘|sort -n -k 1 -r|head -n 100

搜集访问某个uri的IP

cat /usr/local/nginx/logs/yjs.access.log|awk ’($7~//dxb/index/index/ && $4>“[16/Mar/2015:00:00:00” && $4<“[17/Mar/2015:00:00:00”){print $(NF-1)}’ > ip.log

统计访问最多的100个IP及访问次数

awk ‘{print $1}’ /usr/local/nginx/logs/yjs.access.log| sort | uniq -c | sort -n -k 1 -r | head -n 100