美文网首页
Nginx 导致 Linux服务器too open many f

Nginx 导致 Linux服务器too open many f

作者: 奮鬥猿 | 来源:发表于2019-11-13 17:34 被阅读0次

    服务器运行一段时间出现了Too many open files这个错误,应用无法访问。

    原因一:Linux 的open files 数不够

    root@iZj6c3zjaww2fbthj1qxlxZ:~# ulimit -a
    core file size          (blocks, -c) 0
    data seg size           (kbytes, -d) unlimited
    scheduling priority             (-e) 0
    file size               (blocks, -f) unlimited
    pending signals                 (-i) 78454
    max locked memory       (kbytes, -l) 64
    max memory size         (kbytes, -m) unlimited
    open files                      (-n) 10240
    pipe size            (512 bytes, -p) 8
    POSIX message queues     (bytes, -q) 819200
    real-time priority              (-r) 0
    stack size              (kbytes, -s) 8192
    cpu time               (seconds, -t) unlimited
    max user processes              (-u) 31792
    virtual memory          (kbytes, -v) unlimited
    file locks                      (-x) unlimited
    
    lsof -n |awk '{print $2}'|sort|uniq -c |sort -nr|more
    #查一下当前已有的连接数,再来判断open files 为1024 是不是小
    lsof -p $java_pid | wc -l
    #加大打开的文件数
    ulimit -n 10240
    #用户级别的修改
    
    #系统级设置对所有用户有效。
    #可通过两种方式查看系统最大文件限制                 
    cat /proc/sys/fs/file-max          
    #修改配置/etc/sysctl.conf文件
    fs.file-max=10240
    #通知系统启用这项配置 
    sysctl -p
    

    修改以上配置后,服务器运行一段时间后还是出现以上问题,文件句柄数不断增加,需要查找分析以下两个方面

    原因二:代码打开文件操作未关闭(没有文件操作的可跳过)

    排查代码,如果有大量文件操作,本地压测定位代码,如若未出现则可排除
    如果web容器使用的是自己用Netty开发的请注意:出现大量的CLOSE_WAIT要把参数EpollChannelOption.SO_LINGER 改成 EpollChannelOption.SO_KEEPALIVE 具体的参数详细说明请查看以下链接
    Netty:option和childOption参数设置说明

    原因三:使用了Nginx等其它代理(端口范围监听),TCP 参数配置不对

    netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'  
    TIME_WAIT 7091
    CLOSE_WAIT 2
    ESTABLISHED 716
    LISTEN 10
    

    常用的三个状态是:ESTABLISHED 表示正在通信,TIME_WAIT 表示主动关闭,CLOSE_WAIT 表示被动关闭
    服务器保持了大量TIME_WAIT状态

    #内核参数优化
    #表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间
    net.ipv4.tcp_fin_timeout = 30
    #表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为300秒,原因是:当前都是图片,不需要建立长链接
    net.ipv4.tcp_keepalive_time = 300
    #表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭
    net.ipv4.tcp_syncookies = 1
    #表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间
    net.ipv4.tcp_tw_reuse = 1
    #表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭,当前TIME-WAIT 过多,所以开启快速回收
    net.ipv4.tcp_tw_recycle = 1
    net.ipv4.ip_local_port_range = 5000 65000
    

    以下是服务器上用的配置文件(Ubuntu18.04 单CPU 4核 8线程 8G内存)

    user  root;
    worker_processes 4;
    
    #error_log  logs/error.log;
    #error_log  logs/error.log  notice;
    #error_log  logs/error.log  info;
    
    #pid        logs/nginx.pid;
    
    events {
        use epoll;
        worker_connections  102400;
    }
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
    
        #日志每日分割
        log_format  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
        map $time_iso8601 $logdate {
          '~^(?<ymd>\d{4}-\d{2}-\d{2})' $ymd;
          default                       'date-not-found';
        }
        open_log_file_cache max=10;
    
        #缓存
        server_names_hash_bucket_size 128;
        client_header_buffer_size 2k;
        large_client_header_buffers 4 4k;
        client_max_body_size 8m;
    
        sendfile on;
        tcp_nopush    on;
        keepalive_timeout 60;
        tcp_nodelay on;
    
        ##cache##
        proxy_connect_timeout 5;
        proxy_read_timeout 60;
        proxy_send_timeout 5;
        proxy_buffer_size 16k;
        proxy_buffers 4 64k;
        proxy_busy_buffers_size 128k;
        proxy_temp_file_write_size 128k;
        proxy_temp_path /home/temp_dir;
        proxy_cache_path /home/cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;
        ##end##
    
        gzip  on;
        gzip_min_length   1k;
        gzip_buffers  4 8k;
        gzip_http_version 1.1;
        gzip_types  text/plain application/x-javascript text/css application/javascript application/json application/xml;
        gzip_disable "MSIE [1-6]\.";
    
        map $http_upgrade $connection_upgrade {
            default upgrade;
            '' close;
        }
    
        upstream flash-web {
            server 127.0.0.1:80;
            ip_hash;
        }
    
        server {
           listen       1000-10000;
           server_name  ~^(www\.)?(.+)$;
    
           access_log logs/access-$logdate.log;
           error_log 'logs/error-$logdate.log';
    
           location ~.*\.(gif|jpg|png|htm|html|css|js|flv|ico|swf)(.*) {
                 add_header Cache-Control no-cache;
                 proxy_pass http://flash-web;
                 proxy_redirect off;
                 proxy_set_header Host $host:$server_port;
                 proxy_set_header X-Real-IP $remote_addr;
                 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                 proxy_cache cache_one;
                 proxy_cache_valid 200 302 1h;
                 proxy_cache_valid 301 1d;
                 proxy_cache_valid any 1m;
                 expires 10d;
           }
    
           location / {
                uwsgi_send_timeout 600;        # 指定向uWSGI传送请求的超时时间,完成握手后向uWSGI传送请求的超时时间。
                uwsgi_connect_timeout 600;   # 指定连接到后端uWSGI的超时时间。
                uwsgi_read_timeout 600;        # 指定接收uWSGI应答的超时时间,完成握手后接收uWSGI应答的超时时间。
                fastcgi_read_timeout 240;
                proxy_pass http://flash-web;
                proxy_redirect    off;
                proxy_set_header Host $host:$server_port;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           }
        }
    }
    
    

    详细优化参数说明可参考

    配置生效后,观察结果,TIME_WAIT 明显减少。

    TIME_WAIT 8
    ESTABLISHED 16
    

    linux进程数和句柄数基础概念了解
    持续观察系统,有问题再更新

    相关文章

      网友评论

          本文标题:Nginx 导致 Linux服务器too open many f

          本文链接:https://www.haomeiwen.com/subject/ccjpyctx.html