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]
(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 $>
查看方法 使用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.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