• Nginx 学习笔记(四)之 内存占用过高分析


    一、内存占用查看情况

     执行如下命令确定 nginx 主进程

    #查看主进程

    ps aux|grep nginx

    # 查看主进程下所有子进程占用内存情况,以此来进行统计

    ps --ppid <pid> U

    (1) 查找主进程看

    命令 ps aux|grep nginx

     

     从上图可以看到 master process 有好几个,这是因为本服务器安装了多个nginx软件的缘故,这里主要统计 进程为 88657 的 nginx.

    (2) 统计 所有子进程 内存

    命令:ps --ppid 88657 u |awk 'BEGIN{a=0;}{a+=$6}END{a=a/1024;print a}'

     

     命令 ps --ppid 88657 u 可以看到 88657 下所有子进程的内存情况

     

     通过 awk 对子进程 RSS(内存值)进行累加,从上图中可以看到其实累加后 值为:2476572K,再转换为 M为:2418.53M

    (2) 统计内存

     命令 ps aux|grep 88657 查询主进程内存占用情况

     可以看到占用内存为 14192K 

    因此 nginx 占用内存为:所有 work process 内存和 + master process = 2476572K + 14192K = 2490764K ,转换为 M单位为 :2432.38M 

    二、知识点

     查阅资料:

    https://blog.csdn.net/sh2018/article/details/84025355
    https://www.cnblogs.com/caicairui/p/8507472.html

    了解到 nginx 内存占有情况 和 work_processes 及 work_connections 这两个配置有关系,可以得到如下结论:

    • work_connections 表示 并发支持的最大连接数,每个连接大概为 0.4K -0.5K 大小;
    • work_processes 设置为 auto 时,其数量会随着不同CPU核数自动调整,本案例中服务器有 128 核(cat /proc/cpuinfo | grep processor),因此 work_processes 有128个,每个 work_process 会占用一个 CPU处理请求
    • 每个 work_process 支持最大并发数为 work_connections,这是在某个时候,nginx 将所有请求都交给一个 work_process 处理才会出现,不过很少出现该种情况
    • nginx 内存大小计算方式为:work_connections*0.5K*work_processes + master process内存大小

    三、解决方式

     调整 work_connections、work_processes 配置值,主要是参考 https://www.cnblogs.com/xwgli/p/12322791.html

    # 设置 nginx 的工作进程数量(默认值:1)
    # 最大为CPU的逻辑处理器数量,比如6核心12线程的CPU,最大设置就是12,如果是6核心6线程,则为6。
    # 需要考虑系统资源分配,每多一个运行进程,内存占用都要多一份(比如一个进程为400M,两个就是400M*2=800M)
    worker_processes  1;
    
    # 设置 nginx 最大文件描述符打开限制
    # 在 Linux 系统中,每建立一个连接都是打开一个文件描述符(作为反向代理或负载均衡连接数量会翻倍,因为内外各一个)
    # 所以文件的打开限制决定了 nginx 的最大连接数(应大于 worker_processes * worker_connections)
    # 此处配置需要参考系统的限制(ulimit -n),不能超过系统的最大限制
    worker_rlimit_nofile 65535;
    
    events {
    
        # 此为 Linux 系统特为处理大批量文件描述符而作改进的 poll 事件模型
        use epoll;
        
        # 设置每个工作进程可处理的最大连接数量
        # 此设置将直接影响工作进程的内存固定占用,每个连接大概占用内存 0.4~0.5KB 左右
        # 此值应小于 worker_connections / worker_processes
        worker_connections 65535;
        
        # 允许同时接受多个网络连接
        multi_accept on;
    }
    
    http {
        # 配置文件类型映射,以及默认的 mime 类型
        include       mime.types;
        default_type  application/octet-stream;
        
        # 设置请求头缓冲区大小,超过后会使用下面的配置大小
        # client_header_buffer_size 1K
        # 设置更大的请求头缓冲区大小,如果请求头超出可能会返回 HTTP 414
        # large_client_header_buffers 8K
        
        # 设置请求体缓冲区大小,大于此缓冲区大小的,将写入磁盘文件
        # client_body_buffer_size 16K
        # 设置请求体最大大小(此项影响上传文件的最大大小)
        client_max_body_size 1000m;
    
        # 提供了一种减少拷贝次数,提升文件传输性能的方法。(静态文件由内核直接发送给 socket,而不是由进程读取到内存再发送)
        sendfile        on;
        
        # 降低数据包发送频率,当数据包满时再发送,减少网络数据包数量,降低网络拥塞情况,仅在 sendfile on 时生效
        tcp_nopush     on;
        
        # 为 http 请求保持 tcp 连接,避免短时间内多次 http 请求反复三次握手来建立 tcp 连接
        # 配置保持连接的数量(默认值:100)
        keepalive_requests 100;
        # 配置保持连接的时长
        keepalive_timeout  10;
    
        gzip on;                        # 开启 gzip,会增加对 cpu 的资源消耗
        gzip_min_length 1k;                # 低于 1kb 的资源不压缩
        gzip_comp_level 2;                # 压缩级别 1-9,越大压缩率越高,同时消耗 cpu 资源也越多。
        # 需要压缩哪些响应类型的资源,多个空格隔开。有些格式的文件压缩效率较低,不建议压缩。
        gzip_types text/plain application/json application/javascript application/x-javascript text/javascript text/xml text/css;
        gzip_disable "MSIE [1-6].";    # 配置禁用 gzip 条件,支持正则。此处表示 ie6 及以下不启用 gzip(因为 ie 低版本不支持)
        gzip_vary on;                    # 配置添加 Vary 响应头
        
        # 暂不知道用途,主要用来解决:could not build the proxy_headers_hash 错误
        proxy_headers_hash_max_size 51200;
        proxy_headers_hash_bucket_size 6400;
    
        server {
            listen       80;
            
            server_name  demo.psy-cloud.com;
    
            location * {
                return 404;
            }
        }
    }
  • 相关阅读:
    react 组件间通信,父子间通信
    微信公众号配置及微信jsAPI支付
    Vue 幸运大转盘
    Hystrix断路器配置属性解析
    使用熔断器仪表盘监控(hystrix)
    使用熔断器防止服务雪崩
    创建服务消费者(Feign)
    Spring Cloud Ribbon配置详解
    创建服务消费者(Ribbon)
    创建服务提供者
  • 原文地址:https://www.cnblogs.com/sandyflower/p/14349649.html
Copyright © 2020-2023  润新知