nginx-优化1-httpd-tools测试两万并发


 

一,不同CPU内核绑定不同nginx进程

worker_processes  2;   #修改
worker_cpu_affinity 0001 0010;  #修改
worker_rlimit_nofile 65535;  #修改
events {
    worker_connections  65535;  #修改
}

(1)为什么要绑定nginx进程到不同的CPU上

CPU调度的时候两个进程有可能被分配达到一个CPU上,从而会导致一个非常的空闲,一个非常的忙,无法充分发挥CPU的运算能力

(2)如何分配不同的nginx进程给不同的CPU处理

[root@centos7 ~]# cat /usr/local/nginx/conf/nginx.conf
user  nginx;
worker_processes  2;  #IO密集型:调整worker进程数 = CPU的核心数*2
worker_cpu_affinity 0001 0010;   #修改
events {
    worker_connections  1024;   #默认,线程能够处理的最大连接数
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    server {
        listen       8888;    ## 该端口为storage.conf中的http.server_port相同
        server_name  localhost;
        location ~/group[0-9]/ {
            ngx_fastdfs_module;
    }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
        root   html;
        }
    }
}

 最终

[root@centos7 ~]# cat /usr/local/nginx/conf/nginx.conf
user  nginx;
worker_processes  2;
worker_cpu_affinity 0001 0010;
worker_rlimit_nofile 65535;
events {
    worker_connections  65535;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    server {
        listen       8888;    ## 该端口为storage.conf中的http.server_port相同
        server_name  localhost;
        location ~/group[0-9]/ {
            ngx_fastdfs_module;
    }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
        root   html;
        }
    }
}

 

/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf -s reload

测试两万并发

[root@centos7 ~]# ab -n 20000 -c 20001 http://192.168.80.128:8888/index.html
ab: Invalid Concurrency [Range 0..20000]

 

二,Nginx最大打开文件数优化

(1)nginx报错打开文件数过多,原因是什么?

超过每个线程能够处理的最大连接数

修改之后压测每个worker进程的并发数(实际上达不到1024,还是在1021就会报错,修改没有生效)

安装ab 压测工具:yum -y install httpd-tools 

报错打开文件数过多,那为什么刚好1024也会报错呢,nginx内部的工作线程数也会占用

[root@centos7 ~]# ab -n 1024 -c 1021 http://192.168.80.128:8888/index.html
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 192.168.80.128 (be patient)
socket: Too many open files (24)

 在Linux下有时会遇到Socket/File : Can’t open so many files的问题。其实Linux是有文件句柄限制的,而且Linux默认一般都是1024(阿里云主机默认是65535)。在生产环境中很容易到达这个值,因此这里就会成为系统的瓶颈

[root@centos7 ~]# ab -n 1024 -c 1020 http://192.168.80.128:8888/index.html #未报错

 

ab常用参数的介绍:
-n :即requests,总共的请求执行数,缺省是1;
-c: 即concurrency,并发数,缺省是1;
-t:即timelimit,等待响应的最大时间,秒为单位,缺省50000s
-p:即postfile,发送POST请求时需要上传的文件,此外还必须设置-T参数。
-T 即content-type,用于设置Content-Type请求头信息。
-w: 以HTML表的格式输出结果。
-h 显示用法信息,其实就是ab -help。
执行测试用例:ab -n 1000 -c 100 -w http://localhost/index.php >>d:miss.html
上面的测试用例表示100并发的情况下,共测试访问index.php脚本1000次,并将测试结果保存到d:miss.html文件中。

 

nginx配置文件并发数调整

/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf -s reload

worker_rlimit_nofile 2000; #添加
events {
    worker_connections  2000;  #修改默认值
}

内核参数也要修改

2、参数介绍:
-H 设置硬件资源限制.
-S 设置软件资源限制.
-a 显示当前所有的资源限制.
-c size:设置core文件的最大值.单位:blocks
-d size:设置数据段的最大值.单位:kbytes
-f size:设置创建文件的最大值.单位:blocks
-l size:设置在内存中锁定进程的最大值.单位:kbytes
-m size:设置可以使用的常驻内存的最大值.单位:kbytes
-n size:设置内核可以同时打开的文件描述符的最大值.单位:n
-p size:设置管道缓冲区的最大值.单位:kbytes
-s size:设置堆栈的最大值.单位:kbytes
-t size:设置CPU使用时间的最大上限.单位:seconds
-v size:设置虚拟内存的最大值.单位:kbytes
-u number:设置用户最大进程数 (max user processes)

 

[root@centos7 ~]# ulimit -a  
open files                      (-n) 1024    #查看每个进程可打开的文件数
max user processes              (-u) 15064   #设置用户最大进程数 (max user processes)
ulimit -n 2000  #修改每个进程可打开的文件数
[root@centos7 ~]# cat  /etc/security/limits.conf  #修改内核参数
* soft nofile 2000
* hard nofile 2000

reboot 生效

 

解除 Linux 系统的最大进程数和最大文件打开数限制
vi /etc/security/limits.conf,添加如下的行
*   soft noproc   65535  #打开进程数
*   hard noproc   65535  #打开进程数
*   soft nofile   65535  #
*   hard nofile   65535 
说明:* 代表针对所有用户
noproc 是代表最大进程数
nofile 是代表最大文件打开数

 

其中,*号表示任何用户  修改完之后查看操作系统支持的最大文件数:

[root@centos7 ~]# ab -n 1900 -c 1900 http://192.168.80.128:8888/index.html
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>

 

1,linux最大文件打开数

查看方法 使用ulimit -a 或者 ulimit -n

open files (-n) 1024 是linux操作系统对一个进程打开的文件句柄数量的限制(也包含打开的套接字数量)

这里只是对用户级别的限制,其实还有个是对系统的总限制,查看系统总线制:

# cat /proc/sys/fs/file-max

man proc,可得到file-max的描述:

/proc/sys/fs/file-max
              This  file defines a system-wide limit on the number of open files for all processes.  (See
              also setrlimit(2),  which  can  be  used  by  a  process  to  set  the  per-process  limit,
              RLIMIT_NOFILE,  on  the  number  of  files it may open.)  If you get lots of error messages
              about running out of file handles, try increasing this value:

即file-max是设置系统所有进程一共可以打开的文件数量 。同时一些程序可以通过setrlimit调用,设置每个进程的限制。如果得到大量使用完文件句柄的错误信息,是应该增加这个值。

也就是说,这项参数是系统级别的

修改方法

临时生效

# ulimit -SHn 10000
其实ulimit 命令身是分软限制和硬限制,加-H就是硬限制,加-S就是软限制。默认显示的是软限制,如果运行ulimit 命令修改时没有加上-H或-S,就是两个参数一起改变。
软限制和硬限制的区别?
硬限制就是实际的限制,而软限制是警告限制,它只会给出警告。

永久生效

要想ulimits 的数值永久生效,必须修改配置文件/etc/security/limits.conf
在该配置文件中添加

* soft nofile 65535   
* hard nofile 65535  
echo "* soft nofile 65535"  >> /etc/security/limits.conf
echo "* hard nofile 65535"  >> /etc/security/limits.conf
* 表示所用的用户

修改系统总限制

其实上的修改都是对一个进程打开的文件句柄数量的限制,我们还需要设置系统的总限制才可以。
假如,我们设置进程打开的文件句柄数是1024 ,但是系统总线制才500,所以所有进程最多能打开文件句柄数量500。从这里我们可以看出只设置进程的打开文件句柄的数量是不行的。所以需要修改系统的总限制才可以。
echo  6553560 > /proc/sys/fs/file-max
上面是临时生效方法,重启机器后会失效;
永久生效方法:
修改 /etc/sysctl.conf, 加入
fs.file-max = 6553560 重启生效

 2,linux 最大进程数

2.1 查看

ulimit -a

max user processes              (-u) #系统限制某用户下最多可以运行多少进程或线程

2.2这个数怎么来的

root 账号下 ulimit -u 出现的max user processes 的值默认是 # cat /proc/sys/kernel/threads-max的值/2,即系统线程数的一半
普通账号下 ulimit -u  出现的max user processes的值 默认是 /etc/security/limits.d/20-nproc.conf(centos6 是90-nproc.conf)   文件中的
[root@centos7 ~]# cat /proc/sys/kernel/threads-max
30129
[root@centos7 ~]# echo 30129/2 | bc
15064
[root@centos7 ~]# ulimit -a
max user processes              (-u) 15064

2.3 怎么修改这个值

2.3.1.在/etc/security/limits.conf文件里添加如下内容

 

* soft nproc 65535   # 打开进程数  
* hard nproc 65535   # 打开进程数
操作方法:
echo "* soft nproc 65535"  >> /etc/security/limits.conf
echo "* hard nproc 65535"  >> /etc/security/limits.conf
注意:修改这里,普通用户 max  user process值是不生效的,需要修改/etc/security/limits.d/20-nproc.conf文件中的值。
如果使用*号让全局用户生效是受文件/etc/security/limits.d/20-nproc.conf中nproc值大小制约的,而如果仅仅是针对某个用户,那么就不受该文件nproc值大小的影响。

 

2.3.2 修改 /etc/security/limits.d/20-nproc.conf

因为普通用户受这个文件里的值影响

[root@centos7 ~]# cat /etc/security/limits.d/20-nproc.conf
*          soft    nproc     65535
root       soft    nproc     unlimited

2.3.3 系统总限制

其实上面的 max user processes  65535 的值也只是表象,普通用户最大进程数无法达到65535 ,因为用户的max  user processes的值,最后是受全局的kernel.pid_max的值限制。也就是说kernel.pid_max=1024  ,那么你用户的max user processes的值是127426 ,用户能打开的最大进程数还是1024。

查看全局的pid_max方法:
方法一:
cat /proc/sys/kernel/pid_max
方法二:
# sysctl kernel.pid_max
kernel.pid_max = 32768
修改这个值方法:

echo 65535 > /proc/sys/kernel/pid_max
所以以上都操作完成后,才算是正确修改了max user processes 的值
 
上面只是临时生效,重启机器后会失效
永久生效方法:
在/etc/sysctl.conf中添加kernel.pid_max = 65535
# vim /etc/sysctl.conf
kernel.pid_max = 65535
或者:
echo "kernel.pid_max = 65535" >> /etc/sysctl.conf
然后重启机器。

 

总结

[root@centos7 ~]# vim /etc/sysctl.conf
[root@centos7 ~]# sysctl -p
net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.ip_local_port_range = 2000 65000
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_max_orphans = 16384
net.core.somaxconn = 16384 #tcp优化
net.core.netdev_max_backlog = 16384 #tcp优化
net.ipv4.ip_forward = 1  #开启路由器功能
fs.file-max = 6553560  #系统所有进程一共可以打开的文件数量
kernel.pid_max = 65535 #修改普通用户最大进程数

修改进程数,文件数

[root@centos7 ~]# cat /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535

 查看

[root@centos7 ~]# 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) 15064
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 65535
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) 65535
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

 

原创文章,作者:254126420,如若转载,请注明出处:https://blog.ytso.com/245017.html

(0)
上一篇 2022年4月18日
下一篇 2022年4月18日

相关推荐

发表回复

登录后才能评论