专栏名称: InfoQ
有内容的技术社区媒体。
目录
相关文章推荐
新浪科技  ·  【净利跌两成,均价降4万! ... ·  16 小时前  
51好读  ›  专栏  ›  InfoQ

如何挖掘Nginx日志中隐藏的金矿?

InfoQ  · 公众号  · 科技媒体  · 2016-09-13 08:00

正文

请到「今天看啥」查看全文


流量速率分析

Nginx日志如果开启,除了请求时间,一般会包含响应时间、页面尺寸等字段,据此很容易计算出网络流量、速率。

等等,你可能会有疑问,上面的请求访问分析,这里的流量速率分析,按时间轴画出来,不就是监控系统干的事儿吗,何苦这么麻烦查询Nginx日志?

的确如此,监控系统提供了更实时、更直观的方式。而Nginx日志文件的原始数据,可以从不同维度分析,使用得当,会如大浪淘沙般,发现属于我们的金子。

对一般网站来说,带宽是最珍贵的资源,可能一不小心,某些资源如文件、图片就占用了大量的带宽,执行命令检查一下:

less static.log | awk 'url=$7; requests[url]++;bytes[url]+=$10} END{for(url in requests){printf("%sMB %sKB/req %s %s\n", bytes[url] / 1024 / 1024, bytes[url] /requests[url] / 1024, requests[url], url)}}' | sort -nr | head -n 15

备注:Nginx配置文件中日志格式使用了$body_sent_size,指HTTP响应体的大小,如果想查看整个响应的大小,应该使用变量$sent_size。

不出意外,静态资源、图片类(如果还没有放CDN)占据榜首,自然也是优化的重点:是否可以再压缩,某些页面中是否可以用缩略图片代替等。

与之相比,后台调用、API接口等通常消耗更多的CPU资源,按照一贯“先衡量、再优化”的思路,可以根据响应时间大体了解某个URL占用的CPU时间:

less main.log | awk '{url=$7; times[url]++} END{for(url in times){printf("%s %s\n", times[url], url)}}' | sort -nr | more`    40404 /page/a?from=index    1074 /categories/food    572 /api/orders/1234.json

不对,发现一个问题:由于拥有服务号、App、PC浏览器等多种前端,并且使用不规范,URL的格式可能乱七八糟。比如`/page/a`页面,有的带有.html后缀,有的未带,有的请求路径则带有参数;分类页/categories/food带有`slug`等信息;订单、详情或个人中心的URL路径则有`ID`等标记...。

借助sed命令,通过三个方法对URL格式进行归一化处理:去掉所有的参数;去掉`.html`及`.json`后缀;把数字替换为`*`。可以得到更准确的统计结果,:

less main.log | awk '{print $7}' |sed -re 's/(.*)\?.*/\1/g' -e 's/(.*)\..*/\1/g' -e 's:/[0-9]+:/*:g' | awk '{requests[$1]++;time[$1] +=$2} END{for(url in requests){printf("%smin %ss/req %s %s\n", time [url] / 60, time[url] /requests[url], requests[url], url)}}' | sort -nr | head -n 50

备注:这里使用了扩展正则表达式,GNU sed的参数为-r,BSD sed的参数为-E。

那些累计占用了更多响应时间的请求,通常也耗用了更多的CPU时间,是性能优化重点照顾的对象。







请到「今天看啥」查看全文