CentOS中PHP-FPM优化及压力测试示例

php fastcgi进程管理器,相比fastcgi静态的唤起cgi,fpm能根据访问的压力动态的唤起cgi进程和销毁以到达动态的调整cgi数量,这样可以有效的使用内存。除此之外还有其它的一些优点,比如,fpm还可以平滑的重载php配置;由于fpm是使用Unix-Socket来和服务器通讯,所以也不用再配置cgi端口;fpm有更好的状态输出和slowlog日志,502的时候能给出更多的错误细节。

 本文谈谈有关PHP-FPM的配置细节以及基于一个实际环境来做压力测试:

服务器配置如下:
    4核心4G内存
    Nginx版本为1.7.0
    PHP版本为5.3.27
 

Nginx配置文件如下

 代码如下 复制代码
user  www www;
worker_processes  8;
error_log   /var/log/nginx/error.log  warn;
worker_rlimit_nofile 204800;
pid        logs/nginx.pid;
events {
    use epoll;
    worker_connections  204800;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    index index.shtml index.php index.html index.htm;
    server_names_hash_bucket_size 128;
    client_header_buffer_size 32k;
    open_file_cache max=204800 inactive=20s; 
    ###我这边测试,这个开启后对php处理性能有15%提升###
    open_file_cache_valid 30s;
    open_file_cache_min_uses 1;
    large_client_header_buffers 4 32k;
    client_max_body_size 300m;
    sendfile        on;
    tcp_nopush     on;
    keepalive_timeout  60;
    tcp_nodelay    on;
    server_tokens  off;
    client_body_buffer_size 512k;
    fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m;
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;
    fastcgi_cache TEST; 
    ###这个开启后感觉效果非常明显,有效的降低cpu负载,提高了php的处理能力###
    fastcgi_cache_use_stale error timeout invalid_header http_500;
    fastcgi_intercept_errors on;
    fastcgi_cache_valid 200 302 1h;
    fastcgi_cache_valid 301 1d;
    fastcgi_cache_valid any 1m;
    fastcgi_cache_min_uses 1;
gzip  on;
gzip_min_length 1k;
    gzip_buffers    4 16k;
    gzip_http_version 1.1;
    gzip_comp_level 2;
    gzip_vary on;
    include /usr/local/nginx/conf.d/*.conf;
    ssi on;
    ssi_silent_errors on;
    ssi_types text/shtml;
    upstream phpbackend {
     server unix:/dev/shm/php-fpm.sock weight=100 max_fails=10 fail_timeout=30;
     server unix:/dev/shm/php-fpm2.sock weight=100 max_fails=10 fail_timeout=30;
     server unix:/dev/shm/php-fpm3.sock weight=100 max_fails=10 fail_timeout=30;
    }
    server {
        listen       80;
        server_name  10.168.41.2 default backlog=204800;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
        location ~ .php$ {
            fastcgi_pass   phpbackend;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /usr/local/nginx/html$fastcgi_script_name;
            include        fastcgi_params;
        }
    }
}
 

优化后的php-fpm配置如下:我开启了3个php-fpm实例,每个实例为60个进程,使用socket连接FastCGI,这个可以根据自己的服务器配置进行调整

 代码如下 复制代码
listen = /dev/shm/php-fpm.sock 
###/dev/shm是内存文件系统,放在内存中肯定会快###
pm.start_servers = 60
pm.min_spare_servers = 40
pm.max_spare_servers = 80
###Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2###
pm.max_requests = 204800
rlimit_files = 102400
listen.backlog = 102400 
###队列等待长度,如果出现11: Resource temporarily unavailable错误,可以把这个值调高一点,分别对应系统内核backlog,nginx的backlog###
 

内核参数优化如下

 代码如下 复制代码
net.ipv4.tcp_max_tw_buckets = 250000
###同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息###
net.ipv4.tcp_sack = 1
###通过有选择地应答乱序接收到的报文来提高性能,让发送者只发送丢失的报文段,(对于广域网通信来说)这个选项应该启用,但是会增加对CPU的占用###
net.ipv4.tcp_window_scaling = 1
###支持更大的TCP窗口 如果TCP窗口最大超过65535(64K)必须设置该数值为1###
net.ipv4.tcp_rmem = 4096 87380 4194304
###这个参数定义了TCP接收缓存(用于TCP接收滑动窗口)的最小值、默认值、最大值###
net.ipv4.tcp_wmem = 4096 16384 4194304
###这个参数定义了TCP发送缓存(用于TCP发送滑动窗口)的最小值、默认值、最大值###
net.core.wmem_default = 8388608
###这个参数表示内核套接字发送缓存区默认的大小###
net.core.rmem_default = 8388608
###这个参数表示内核套接字接收缓存区默认的大小###
net.core.rmem_max = 16777216
###这个参数表示内核套接字接收缓存区的最大大小###
net.core.wmem_max = 16777216
###这个参数表示内核套接字发送缓存区的最大大小###
net.core.netdev_max_backlog = 262144
###当网卡接收数据包的速度大于内核处理的速度时,会有一个队列保存这些数据包,这个参数表示该队列的最大值###
net.core.somaxconn = 262144
###socket监听(listen)的backlog上限,在高并发的请求中可能会导致链接超时或者触发重传###
net.ipv4.tcp_max_orphans = 3276800
###设定系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上,超过了会print to message###
net.ipv4.tcp_max_syn_backlog = 262144
###这个参数表示TCP三次握手建立阶段接收SYN请求队列的最大长度,默认是1024,将其设置的大一些可以使出现Nginx繁忙来不及Accept新连接的情况时,Linux不至于丢失客户端发起的连接请求###
net.ipv4.tcp_timestamps = 0
###开启对于TCP时间戳的支持,其时间戳在(请参考RFC 1323)TCP的包头增加12个字节###
net.ipv4.tcp_synack_retries = 1
###SYN-ACK握手状态重试次数,默认为5,遭受syn-flood攻击时改为1或2###
net.ipv4.tcp_syn_retries = 1
###外向syn握手重试次数,默认为4###
net.ipv4.tcp_tw_recycle = 1
###表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭###
net.ipv4.tcp_tw_reuse = 1
###表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭###
net.ipv4.tcp_mem = 94500000 915000000 927000000
###三个文本字段,超过第三个的字段TCP会拒绝SOCKET,其单位是内存页###
net.ipv4.tcp_fin_timeout = 1
###这个参数表示当服务器主动关闭连接时,socket保持在FIN-WAIT-2状态的最大时间###
net.ipv4.tcp_keepalive_time = 30
###当keepalive启用时,TCP发送keepalive消息的频度,默认是2小时,若将其设置的小一些,可以更快的清理无效的连接###
net.ipv4.ip_local_port_range = 1024 65000
###这个参数定义了在UDP和TCP连接中本地(不包括连接的远端)端口取值范围###
net.netfilter.nf_conntrack_tcp_timeout_established = 36000
###established的超时时间###
net.nf_conntrack_max = 655360
###这个值决定了你作为网关的工作能力上限,默认65536###
net.ipv4.tcp_syncookies = 0
###关闭SYN Cookies,默认关闭###
 

调高linux内核打开文件数量

 代码如下 复制代码
echo ‘ulimit -HSn 102400′ >> /etc/profile
echo ‘ulimit -HSn 102400′ >> /etc/rc.local
source /etc/profile

 

使用ab压力测试(页面为纯php页面,未读取数据库)

开启缓存后的效果:1W3的ops,cpu负载为20%

 

开启缓存后的效果:1W3的ops,cpu负载为20%

 

 

php-fpmtesting1

 

关闭缓存后的效果:ops为:9700,cpu负载为100%

 

php-fpmtesting2

 

php-fpmtesting3

 

 

时间: 2024-09-20 05:33:39

CentOS中PHP-FPM优化及压力测试示例的相关文章

Linux中如何对服务器进行压力测试

http_load是基于Linux平台的一种性能测工具.它是以并行复用的方式运行,仅适用于Web页面的性能测试,不适用于访问数据库,而且测试结果分析是有限的,平台依赖Linux .http_load可以简单地通过txt文本文件中记录的参数来对HTTP服务器进行压力测试,那是如何对服务器进行压力测试的呢?下面我们就来介绍 Linux中如何安装使用http_load对服务器进行压力测试的教程. 具体方法步骤如下: 1.下载 官方网站:http://acme.com/software/http_loa

大型网站压力测试及优化方案

木桶理论应用在系统优化中   木桶理论又称短板理论,其核心思想是一只木桶盛水多少,并不取决于最高的木板,而取决于最短的那块木板. 木桶原理应用在系统分析中,即系统的最终性能取决于系统中性能表现最差的组件,为了提升系统整体性能,对系统中表现最差的组件进行优化可以得到最好的效果.     在网站系统中,用户的访问请求到达服务器,然后服务器返回数据并展示给用户,这个过程要经过很多处理,每一个过程的低效都会影响系统整体表现出来的性能.   按照木桶理论,如果一台服务器性能非常强大,拥有充足的内存资源和C

使用sysbench压力测试MySQL(二)

   昨天有了第一篇的测试之后,仅仅是一个开始.    我接下来做sysbench压测的主要思路是根据现有的配置作出调整,能够持续性的优化和压力测试达到目的,而不是简单的去对比连接数在不同数量级会有多大的差别,所以你会在里面看到一些问题的排查,一些问题的解决,可能有些又不是压测相关的.    压测连接数300跑不上去   我设置了max_connections为3000,但是压测的时候到了300个线程就跑不上去了.这个问题很有典型性. sysbench抛出的错误如下: FATAL: mysql_

Web网站压力测试教程

Web服务处于分布式计算的核心位置,它们之间的交互通常很难测试.分布式开发.大型的开发者团队以及对代码日益组件化的期望都有可能使 Web 服务的开发变得越来越容易隐藏错误.这些类型的错误极难检测出来.压力测试是检测这类代码错误的一种有效方法,但是只有在压力系统设计得比较有效的情况下才能发挥作用.本文将让您深入了解一下这种压力系统的基本要求. 测试方法 传统的测试方法包括某种形式的简单单元测试,通常由开发人员执行.设计这些测试需要了解软件的内部知识,并且这些测试几乎总是针对产品的非常小的.特定的部

Web 应用性能和压力测试工具 Gor

常见的 Web 应用的压力测试工具 Web 应用压力测试工具有很多,比如 Apache ab,node-ab,Apache JMeter, LoadRunner, httperf.但是这些工具都没能解决一个问题: 如何正确模拟生产环境的流量 如今 Web 应用的架构变得非常复杂,内部包含复杂的各种负载均衡. 服务和 RPC 调用关系,简单的发送 GET 请求到某些 URL 或者 API 接口完全无法模拟真实的流量.假如回放 HTTP 日志,操作又异常麻烦.Tcpcopy 虽然能够复制实时流量,但

Jmeter:图形界面压力测试工具

国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私募机构九鼎控股打造,九鼎投资是在全国股份转让系统挂牌的公众公司,股票代码为430719,为"中国PE第一股",市值超1000亿元.  ------------------------------------------------------------------------------

压力测试中存在的问题

压力测试中存在的问题 (What) 什么是压力测试 软件压力测试是一种基本的质量保证行为,它是每个重要软件测试工作的一部分.软件压力测试的基本思路很简单: 不是在常规条件下运行手动或自动测试,而是在计算机数量较少或系统资源匮乏的条件下运行测试. 通常要进行软件压力测试的资源包括内部内存.CPU 可用性.磁盘空间和网络带宽. 压力测试涵盖,性能测试,负载测试,并发测试等等,这些测试点常常交织耦合在一起. 压力测试存在那些问题 我归纳一下又几点: 操作系统默认安装,在未做任何优化的情况下实施压力测试

Apache的压力测试以及web性能优化的常用知识总结_Linux

什么是带宽? 误解:"数据在线路中的移动速度"."数据的传输速度" 我们所说的带宽是指数据的发送速度,比如百兆网卡,指网卡的最大发送速度是100Mbps,也就是说网卡在一秒钟最多可以发送100Mb的数据:相关的因素: 数据发送装置将二进制信号传送到线路的能力,也称信号传输频率,以及另一端数据接收装置对二进制信号接收的能力,也包括线路对传输频率的支持程度: 数据传输介质的并行度,等价于计算机系统总线宽度的概念:   习惯与约定 b:比特单位 bit: B:字节单位 B

windows系统中安装Jmeter压力测试工具

  Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测试但后来扩展到其他测试领域. 它可以用于测试静态和动态资源例如静态文件.Java 小服务程序.CGI 脚本.Java 对象.数据库, FTP 服务器, 等等.JMeter 可以用于对服务器.网络或对象模拟巨大的负载,来自不同压力类别下测试它们的强度和分析整体性能. JMeter的作用 1.能够对HTTP和FTP服务器进行压力和性能测试, 也可以对任何数据库进行同样