zoukankan      html  css  js  c++  java
  • 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起来的内容可以增加文件以及的读写速度。

  • 相关阅读:
    python服务注册到nacos
    springboot设置响应状态码
    nio 实现群聊小系统
    记一次maven问题(把maven仓库打包后在离线环境另一个机器导入不成功)
    客户端查看sql的执行时间
    java 运行python脚本
    http访问支持websocket
    ”真实项目“ 与“作业”
    工厂方法模式
    idea 开发 SSM jar包找不到
  • 原文地址:https://www.cnblogs.com/nyatom/p/11236657.html
Copyright © 2011-2022 走看看