更多优质内容
请关注公众号

Nginx优化篇 Linux内核参数、Nginx配置和php-fpm配置优化汇总 (二十一)-张柏沛IT博客

正文内容

Nginx优化篇 Linux内核参数、Nginx配置和php-fpm配置优化汇总 (二十一)

栏目:其他内容 系列:Nginx入门系列 发布时间:2020-02-18 09:38 浏览量:3212

Linux内核参数调优:
fs.file-max     # 每一个连接都是文件句柄,所以Linux容纳的文件句柄数的上限,即Linux能够同时打开的文件数量
本机默认183961

 

net.ipv4.ip_local_port_range    # 建立连接时端口可用范围。一般系统作为客户端请求上游服务时,系统每建立发起一个连接都会占用一个端口。
本机默认32768~60999

 

net.ipv4.tcp_max_syn_backlog    # 限制的半连接数量,建议设为1024以上,最好为2的幂次方
默认128

 

net.core.somaxconn    #accept队列容纳的已完成的连接的上限数量
默认128,建议设为1024以上,一般和tcp_max_syn_backlog一致。

 

net.core.netdev_max_backlog  #在每个网络接口接收数据包的速率比内核处理这些包的速率快时,会有一个队列保存这些数据包,该参数表示该队列的最大值
默认1000,我会设为tcp_max_syn_backlog+somaxconn

 

net.ipv4.tcp_tw_reuse = 1  # 允许重用TIME_WAIT状态的套接字用于新的TCP连接,默认为0,表示关闭。
使用keepalive时,当服务器作为客户端请求时就会作为主动断开tcp连接的一方,此时服务端会出现time_wait的socket(套接字),如果time_wait的socket太多会严重影响处理能力。此时可以修改这个参数来优化

不使用keepalive就会出现大量time_wait的套接字,因为短连接只发送一个请求就会断开,断开就会出现time_wait,所以应该启用keepalive长连接。

 

net.ipv4.tcp_max_tw_buckets = 10000
#表示系统保持TIME_WAIT套接字的最大数量,超过这个数量的TCP连接会立刻断开,这个值应该设小一些,如设为5000;

tcp_keepalive_time   # TCP发送keepalive探测消息的间隔时间(秒),用于确认TCP连接是否有效。默认7200(2小时),建议改为1800

net.ipv4.tcp_syncookies  = 1    # 开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理。在高并发测试时应该关闭,否则发起测试的客户端会被认为是对服务端进行洪水攻击。

 

ulimit -n查询的结果表示单个进程允许打开的最大文件句柄数,可用ulimit -n xxx调大该参数值。

# ulimit -n

# ulimit -n xxx

通过在/etc/sysctl.conf修改。

 


Nginx 参数调优

worker_processes auto;  # 配置worker进程数等于系统cpu核数

worker_cpu_affinity auto;   # 设置一个worker进程和一个cpu核绑定,上下文:main

worker_connections 10240;  # 单个worker进程的最大并发连接数限制。该参数值不能大于worker_rlimit_nofile

use epoll;  # 使用epoll模型,在events块中

tcp_nodelay on; # 关闭TCP的Nagle算法(on才是关闭Nagle算法)。吞吐量优先则启用Nagle算法(off),低时延则关闭Nagle算法(on)。上下文:http

worker_rlimit_nofile 102400;   # 设定单个worker进程能打开的文件句柄数上限。这里限制的值应该和ulimit -n 的值一样。上下文main

worker_priority 0;  # 设置nginx的静态优先级,最好设为-20,即最高的优先级。上下文main

listen 端口 backlog=20480;    # 设置backlog值,即syn队列和accept队列的大小。设成一两万就好,不要太大。

keepalive_requests 1000;    # 一个tcp连接可以传送的http请求上限

# 作为反向代理请求上游服务时开启keepalive
proxy_http_version 1.1;     
proxy_set_header Connection "";
upstream {
    ...
    keepalive 256;  # 与上游服务保持keepalive的连接数量
}

gzip on;        # 开启压缩
gzip_min_length 20;     # 对小于20字节的包体不进行压缩
gzip_comp_level 3;  # 压缩率

aio on;  # 使用异步IO

sendfile on;    # 使用零拷贝


PHP-FPM配置

动态模式
pm = dynamic;   # 使用fpm动态模式
pm.max_children = 300;  # 限制动态模式下最大worker进程数
pm.start_servers = 20;  # 启动php-fpm时,worker进程的初始数量
pm.min_spare_servers = 5;    # 闲置时worker进程数量的最小值,这个值肯定比start_servers小
pm.max_spare_servers = 35;
# 闲置时worker进程数量的最大值,这个值肯定要比start_servers大

动态模式下,按照上面的配置,在fpm启动时会创建20个worker进程。如果请求较多,则会自动增加,并且保证空闲的进程数不小于pm.min_spare_servers;请求不多的时候,如果进程数较多,也会进行相应清理,保证空闲的进程数不多于pm.max_spare_servers;
可以将max_spare_servers设置的比start_servers大个10%。min_spare_servers可以设置为start_servers的10%


静态模式
pm = static;    # 使用静态模式
pm.max_children=300;    # 开启固定个数的worker进程

静态模式下,如果设置为300,则无论有没有请求进来,fpm都会保持300个进程数。

一个worker进程处理一个请求,php-fpm的worker进程数越高,就能处理越多nginx发过来的PHP请求,从而应对高并发。每个worker进程最多会消耗20M的内存(一个worker进程会消耗多少内存要看这个worker进程处理过多少个请求才被杀死再生出新worker进程),所以worker进程的个数由你的系统内存大小决定,例如2G 内存你可以让php-fpm的worker进程占用1.6G,留个0.4G给其他进程使用。
1600/20=80个worker进程。创建80个worker进程就可以处理80个并发的PHP请求。

 

如果是使用静态模式,则设置pm.max_children=80;


如果是使用动态模式,则可以看情况设置,如

pm.start_servers=40;
pm.max_spare_servers=60;
pm.min_spare_servers=10;    

 

假如此时80个并发请求进来,fpm有80个进程在处理请求,但是要保证10个进程空闲,所以此时会有90个worker进程。
当请求处理完,就会从90个减到60个进程

对于内存大的服务器(比如8G以上)来说,指定静态的max_children实际上更为妥当,因为这样不需要进行额外的进程数目控制,会提高效率。
因为频繁开关php-fpm进程也会有时滞,所以内存够大的情况下开静态效果会更好。

对于内存较小的服务器比如1~2G的,推荐使用动态模式。

其他的fpm参数:
pm.max_requests = 1000;

nginx+php-fpm配置过程中最大问题是内存泄漏(内存泄漏即因为疏忽或错误造成程序未能释放已经不再使用的内存的情况)出问题:服务器的负载不大,但是内存占用迅速增加,很快吃掉内存接着开始吃交换分区,系统很快挂掉!

每个worker进程每处理完1个请求,内存不会释放给操作系统,所以处理了越多个请求之后,该worker进程占用的内存会越来越多。此时需要关闭这个worker进程释放内存再重新生成一个worker进程。

官方的解决办法是设置max_requests,该值的意思是worker进程处理了多少个请求后会重启该进程,我们需要适当降低这个值,用以让php-fpm自动的释放内存。默认是不限制worker进程的最大请求数,建议设置小一点如1000。实际上还有另一个跟它有关联的值max_children,这个是每次php-fpm会建立多少个进程,这样实际上的内存消耗是max_children*max_requests*每个请求使用的内存。

# 每个请求的最大执行时间
request_terminate_timeout = 30;

# 增加php-fpm打开文件描述符的限制。设为和ulimit一样大。php7.2版本默认是1024
rlimit_files = 10240; 

# 连接队列的长度
listen.backlog ;    # 建议设置大一些,设为1024以上,为2的幂次方,设置的和net.core.somaxconn一样,但不要太大,不要超过20万。php7.2版本的fpm默认是511

# 静态优先级
process.priority = -19      # -20~19 ,越小优先级越高

# php-fpm 重载配置(平滑重启)
service php-fpm reload 

可以通过 
ps -aux|grep php-fpm 
查看fpm的worker进程数。显示的结果除了一个master进程,其他的都是worker进程。


PS:
一般会将 nginx的backlog和php-fpm的backlog设为和系统参数tcp_max_syn_backlog,somaxconn一致。
将nginx的worker_rlimit_nofile和php-fpm的rlimit_files设置的与系统的ulimit -n的值一致

 




更多内容请关注微信公众号
zbpblog微信公众号

如果您需要转载,可以点击下方按钮可以进行复制粘贴;本站博客文章为原创,请转载时注明以下信息

张柏沛IT技术博客 > Nginx优化篇 Linux内核参数、Nginx配置和php-fpm配置优化汇总 (二十一)

热门推荐
推荐新闻