ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

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

2022-04-13 21:35:28  阅读:159  来源: 互联网

标签:httpd max root nginx html conf 65535 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

 

标签:httpd,max,root,nginx,html,conf,65535,tools
来源: https://www.cnblogs.com/gxc888/p/16139410.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有