Java服务因内存不足而爆掉之问题定位NGINX

问题起源与分析

集群中,某台机器上的服务总是莫名挂掉,懵逼、焦灼、难受,问题最终还是要解决,深入排查日志,均在并发读取视频流时系统崩掉,问题定位--内存不足。

然而,同样的机器配置,其它机器负载同样的压力完全没问题,该机器的问题具体出在哪里?

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起来的内容可以增加文件以及的读写速度。

posted @ 2019-07-24 10:58  来兮子宁  阅读(867)  评论(0编辑  收藏  举报