您的位置:首页 > 编程语言 > PHP开发

PHP-FPM优化及压力测试

2014-12-25 13:01 381 查看


PHP-FPM优化及压力测试

 

Fay

 

2014年8月30日

八月 30th, 2014

 

发表评论

 

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%

 





php-fpmtesting

 





php-fpmtesting1

 

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

 





php-fpmtesting2

 





php-fpmtesting3

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: