问题起源与分析
集群中,某台机器上的服务总是莫名挂掉,懵逼、焦灼、难受,问题最终还是要解决,深入排查日志,均在并发读取视频流时系统崩掉,问题定位--内存不足。
然而,同样的机器配置,其它机器负载同样的压力完全没问题,该机器的问题具体出在哪里?
free -m , 8G的内存 被 buff/cache 占用了近5G,问题定位--缓存过大
但是,具体缓存的是什么呢?
echo 1 > /proc/sys/vm/drop_caches 清理页面缓存,缓存骤降至300多兆,问题定位--静态资源服务器--nginx
果然,该机器部署有nginx静态资源服务器,用以每天的报表文件网络路径获取
但其本身已配置缓存的按时清理,不应该占用超过机器一半的内存,问题定位--代理文件夹路径复用
原来,每天要处理的小视频会自动下载到与静态代理文件夹相同的路径,导致当天缓存暴增,且没有清理,占用过多内存,最终导致服务内存不足而爆掉。
问题解决
至此,问题已然定位,具体解决就简单了。下面整理下解决过程中要用上的小手段
nginx缓存清理
nginx设置max-age或expires,配置缓存过期时间
在server节点下加入以下代码:
location ~* .(gif|jpg|png|bmp)$ {
expires 10d;
}
这里是设置图片的过期时间为10天。如果你的图片基本不更新可以设置的时间长一些。
个人配置:
server { listen 6666; location /apis { rewrite ^.+apis/?(.*)$ /$1 break; include uwsgi_params; proxy_pass http://127.0.0.1:14444; } location / { proxy_pass http://127.0.0.1:16666; } #20170331 cache static resource location ~* .(jpg|png){ #这里要加上proxy_pass 否则会访问不图片 #访问图片时会匹配这一条规则 而不是上一条 proxy_pass http://127.0.0.1:16666; expires 10d; } }
文件缓存占用问题
因使用的云服务器,内存关系为:
total=used+free+buff/cache
排查是否为nginx下的文件占用了大量缓存,使用linux-fincore查看Linux系统缓存哪些文件。安装来自:https://github.com/waleedmazhar/linux-ftools,执行 ./configure; make; make install 可以直接编译安装。具体可参考:https://blog.csdn.net/icycode/article/details/80200437。
使用测试如下:
可见,代理路径下的文本文件全被加载到系统缓存。
清理缓存
sync echo 1 > /proc/sys/vm/drop_caches echo 2 > /proc/sys/vm/drop_caches echo 3 > /proc/sys/vm/drop_caches
cache释放:
To free pagecache:
echo 1 > /proc/sys/vm/drop_caches
To free dentries and inodes:
echo 2 > /proc/sys/vm/drop_caches
To free pagecache, dentries and inodes:
echo 3 > /proc/sys/vm/drop_caches
说明,释放前最好 sync 一下,防止丢数据。
因为LINUX的内核机制,一般情况下不需要特意去释放已经使用的cache。这些cache起来的内容可以增加文件以及的读写速度。