Nginx优化篇 nginx+php-fpm压力测试实践 (二十三)-张柏沛IT博客

正文内容

Nginx优化篇 nginx+php-fpm压力测试实践 (二十三)

栏目:Linux 发布时间:2020-02-18 18:31 浏览量:240

压力测试环境准备:
系统:Linux Ubuntu 16.04.4
CPU核数:2
内存:2G
带宽:10000M/s
服务端:Nginx 1.16 + php-fpm 7.2
客户端:一台带宽50M/s的服务器。客户端的带宽不能太低。
连接监控:nginx的stub_status模块

配置参数如下:Linux内核参数:

net.ipv4.tcp_syncookies = 1
net.ipv4.ip_local_port_range = 10240 60999
net.ipv4.tcp_max_syn_backlog=10240
net.core.somaxconn=10240
net.core.netdev_max_backlog=20480
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_max_tw_buckets=5000
net.ipv4.tcp_fin_timeout=30

# /etc/security/limits.conf   (ulimit)
* soft nofile 100001
* hard nofile 100002
root soft nofile 100001
root hard nofile 100002


nginx配置:

worker_processes  auto;     #
worker_cpu_affinity auto;   #
worker_rlimit_nofile 65535; #
worker_priority -19;        #
  
events {
    worker_connections  1024;   #
    use epoll;                  #
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    tcp_nodelay on;    #
    
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '   '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';
     
    sendfile        on; #
    
    keepalive_requests 1000;    #
    keepalive_timeout  30;      #
 
    gzip  on;                   #
    gzip_min_length 20k;        #
    gzip_comp_level 2;          #
    gzip_types image/jpeg image/gif image/png;
   
    server {
        server_name www.atfxnews.com atfxnews.com;
        root /var/www/atfxnews/public;
        index index.html index.htm index.php;
        
        listen 80 backlog=1024;     #
        
        #rewrite ^(.*)$ https://www.atfxnews.com permanent;
        location / {
            if (!-e $request_filename) {
                rewrite ^(.*)$ /index.php$1 last;
            }
        }

        location ~ \.php {
            proxy_http_version 1.1;         #
            proxy_set_header Connection ""; #
            fastcgi_index index.php;
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_split_path_info ^(.+\.php)(.*)$;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
            include fastcgi_params;
        }

    }

    server {
        server_name www.atfxnews.com atfxnews.com;
        listen 443 backlog=1024 ssl;    #
        root /var/www/atfxnews/public;
        index index.html index.php index.htm;
 
        ssl_certificate /var/www/ssl/Apache/2_www.atfxnews.com.crt;
        # ssl_certificate /var/www/ssl/Apache/zbp_chain.crt;
        ssl_certificate_key /var/www/ssl/Apache/3_www.atfxnews.com.key;
         
        location / {
            if (!-e $request_filename) {
                rewrite ^(.*)$ /index.php$1 last;
            }
        }
        
        location ~ \.php {
	    proxy_http_version 1.1;             #
	    proxy_set_header Connection "";     #
            fastcgi_index index.php;
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_split_path_info ^(.+\.php)(.*)$;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
            include fastcgi_params;
        }
    }
    
    include conf.d/*.conf;
} 

标记了#的地方是优化项


php-fpm配置:

listen = 127.0.0.1:9000
listen.backlog = 10240
process.priority = -19
pm = static                 # 静态模式
pm.max_children = 100        # 因为是2G内存,按每个worker进程会消耗20M内存,分配1600M内存给worker进程,400M留给其他程序
# pm.min_spare_servers = 5
# pm.max_spare_servers = 65
pm.max_requests = 1000
slowlog = /var/log/php-fpm/www-slow.log
rlimit_files = 10240






正式测试


测试动态页面1: 10个并发请求,100个总请求,请求类型为动态请求php
ab -c10 -n100 -k https://www.atfxnewx.com/


结果如下:
服务端消耗的带宽:平均2.6M/s



CPU消耗:30%



处于运行状态的php进程数:1~2个
nginx连接数:15个左右


吞吐量:8
100个请求的总响应时间:13.3s
在10的并发请求下,平均一个请求的响应时间为:1.3s
100个请求的失败请求数:0



并发过程中在浏览器直接访问网站:流畅

结论:在10个并发请求下,CPU没有跑满,说明服务器的压力不大,行有余力;平均响应时间1.3秒,对于访问一个门户网站的首页而言,用户体验较好。


测试动态页面2: 100个并发请求,1000个总请求,请求类型为动态请求php
ab -c100 -n1000 -k https://www.atfxnewx.com/

结果如下:
服务端消耗的带宽:平均14M/s
CPU消耗:76%
处于运行状态的php进程数:最高25个
nginx连接数:最高100个
吞吐量:32
1000个请求的总响应时间:31s
在100的并发请求下,平均一个请求的响应时间为:3.1s
1000个请求的失败请求数:11
并发过程中在浏览器直接访问网站:较为卡顿

结论:在100个并发请求下,CPU占用76%,说明服务器的压力也还行;平均响应时间3.1秒,说明在100的并发下(相比于10并发),响应时间明显加长,用户体验下降;吞吐量较10个并发的时候大幅增加,说明随着并发量的增加,服务器的处理能力开始展现;带宽使用也大幅增加,这是因为相同时间内处理的请求数增加,因此返回的响应数量也增加,发送给客户端的数据流量增大了。


测试动态页面3: 200个并发请求,2000个总请求,请求类型为动态请求php
ab -c200 -n2000 -k https://www.atfxnewx.com/

结果如下:
服务端消耗的带宽:平均16M/s
CPU消耗:87%
处于运行状态的php进程数:最高43个
nginx连接数:最高162个
吞吐量:50
2000个请求的总响应时间:40s
在200的并发请求下,平均一个请求的响应时间为:4s
2000个请求的失败请求数:18
并发过程中在浏览器直接访问网站:较为卡顿

结论:在200个并发请求下,CPU占用87%,说明服务器压力山大;平均响应时间4秒,,响应时间明显加长;吞吐量较100个并发的时候又有增加(32->50),说明100并发下还不是极限,服务器还能承受比100更大的并发请求;带宽略微增加。


测试动态页面3: 500个并发请求,5000个总请求,请求类型为动态请求php
ab -c500 -n5000 -k https://www.atfxnewx.com/

结果如下:
服务端消耗的带宽:平均16M/s
CPU消耗:88%
处于运行状态的php进程数:最高39个
nginx连接数:最高450个
吞吐量:51.5
5000个请求的总响应时间:97s
在500的并发请求下,平均一个请求的响应时间为:9s
5000个请求的失败请求数:41
并发过程中在浏览器直接访问网站:9秒响应一个页面,已经很慢了

结论:在500个并发请求下,CPU占用、带宽消耗和吞吐量和200相比几乎没有变化,说明在并发为200时就已经是服务器的极限(极限很可能并发比200更小,因为500并发比200并发的CPU基本没变化,说明87%,88%的CPU占用已经达到最高,可是200并发的时候,CPU已经达到最高)。带宽消耗没变化是因为请求的处理已经达到极限,但相比于10000M/s的带宽上限来说还是远远没有利用全。


我们最重要的关注2个值:
A. 并发请求下,平均一个请求的响应时间。
B. 吞吐量(QPS),即一秒内能处理并返回了响应的请求

前者影响着用户的访问体验
后者体现了服务器处理请求的能力



php-fpm改为动态模式,并设置
max_children=128,
max_spare_servers=80,
min_spare_servers=10,
start_servers=50

再尝试500并发的请求,然而结果没有改变。
看了还是受到了CPU限制。

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

张柏沛IT技术博客 > Nginx优化篇 nginx+php-fpm压力测试实践 (二十三)

热门推荐
推荐新闻