服务器集群搭建以及性能测试

搭建环境介绍:


PHP服务器环境配置:

编译PHP

1.enabale-fpm , with-mysql=mysqlnd   (编译成独立fpm进程,支持mysql,)

2.下载第3方的memcached扩展 编译进来


vim /usr/local/php/etc/php-fpm.conf

写入:
pm = static#让php-fpm的子进程处于不被回收状态,因为在高并发网站上,
#每时每刻都会有人请求服务器,不回收子进程是让服务器能更快的相应请求
pm.max_children = 5#子进程数越多,占cpu资源越多

在这个目录下/usr/local/php/etc,多复制几份php-fpm.conf文件,分别命名为php-fpm9001.conf
修改php-fpm9001.conf访问端口:
listen = 非本地ip:9001

分别启动php-fpm不同的配置文件:
/usr/local/php/sbin/php-fpm -y /usr/local/php/etc/php-fpm.conf
/usr/local/php/sbin/php-fpm -y /usr/local/php/etc/php-fpm9001.conf


使用ps命令查看php-fpm子进程:
ps axu | grep php-fpm


NGINX服务器环境配置:

安装一致性哈希,安装统计模块,便于观察nginx的状态

./configure --prefix=/usr/local/nginx/ --add-module=/app/ngx_http_consistent_hash-master --with-http_stub_status_module


upstream phpserver {
        server 192.168.61.161:9000;
        server 192.168.61.161:9001;
}


location ~ \.php$ {
            root           /home/php/www;
            fastcgi_pass   phpserver;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /home/php/www/$fastcgi_script_name;
            include        fastcgi_params;

}

注意:这里如果配置了php的集群,php-fpm.conf文件必须将监听的127.0.0.1修改为能被外网访问的ip地址


1:问题  C-->A 的mysql连接很慢
解决: my.cnf中的[mysqld]节点中,添加
skip-name-resolve   // 这句话使mysql连接时忽略解析域名,在制定Mysql权限时,只能根据IP限制,不能根据域名限制.


2: 问题  当memcache中没有相应的数据,从后台回调数据时,
http的状态码是404,(虽然内容正常),这样不利于SEO
解决: nginx/conf/nginx.conf
 error_page 404  =200 /callback.php;  // 这样 404被改写成200来响应中


优化思路:
nginx响应请求
1:建立socket连接
2: 打开文件,并沿socket返回.


排查问题,也要注意观察这两点,
主要从系统的dmesg ,和nginx的error.log来观察


1:判断nginx的瓶颈
1.1: 首先把ab测试端的性能提高,使之能高并发的请求.
易出问题: too many open files
原因 :  ab在压力测试时,打开的socket过多
解决: ulimit -n 30000 (重启失效)
观察结果: nginx 不需要特殊优化的情况下, 5000个连接,1秒内响应. 
满足要求,但 wating状态的连接过多.


1.2: 解决waiting进程过多的问题.
解决办法: keepalive_timeout = 0;  
即: 请求结果后,不保留tcp连接. 
在高并发的情况下, keepalive会占据大量的socket连接.
结果: waiting状态的连接明显减少.


1.3: 解决服务端 too many open files
分析: nginx要响应, 
1是要建立socket连接,
2 是要读本地文件
这两个者限制.



由上图可看出,nginx的问题容易出在2点上:
1: nginx接受的tcp连接多,能否建立起来?
2: nginx响应过程,要打开许多文件 ,能否打开?


系统内核层面(此优化方案适合各个服务器):
net.core.somaxconn = 4096 允许等待中的监听
net.ipv4.tcp_tw_recycle = 1  tcp连接快速回收
net.ipv4.tcp_tw_reuse = 1    tcp连接重用   
net.ipv4.tcp_syncookies = 0  不抵御洪水攻击
ulimit -n 30000


Nginx层面:
解决: nginx.conf 下面: work_connection 加大
worker_connections  10240;
Worker_rlimit_nofiles 10000;
Keepalive_timeout 0;


Nginx---->php-fpm之间的优化


如上图,在很多个nginx来访问fpm时, fpm的进程要是不够用, 会生成子进程.


生成子进程需要内核来调度,比较耗时,
如果网站并发比较大, 
我们可以用静态方式一次性生成若干子进程,保持在内存中.


方法 -- 修改php-fpm.conf
Pm = static  让fpm进程始终保持,不要动态生成
Pm.max_children= 32  始终保持的子进程数量


Php-mysql的优化

Linux机器下 ,php 通过IP连接其他mysql服务器时,容易出的问题
能ping通,但connect不到.


一般是由:mysql服务器的防火墙影响的.


并发1万连接,响应时间过长.


优化思路: 同上的nginx
1: 内核层面,加大连接数,并加快tcp回收
2: mysql层面,增大连接数
3: php层面,用长连接,节省连接数
4: 用memcached缓存,减轻mysql负担


具体:
1.1  , PHP服务器增大 ulimint -n选项
1.2 mysql服务器内核配置
添加或修改如下选项
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_syncookies = 0


# syscttl -p 使修改立即生效


3.1 PHP层面 ,用长连接
Mysql_connect ---> mysql_pconnect
注: pconnect 在PHP以apache模块的形式存在时,无效果.
Nginx+phjp+mysql+nginx
在引入memcached后,性能提升不明显,甚至还略有下降


memcached使50%的请求变快了,但是一部分,反倒慢了.
原因在于--PHP->memcached也要建立tcp连接,代价挺高,
但缓存了数据之后,就省去了mysql的查询时间.


总结: memcached适合存复杂的sql,尤其是连接查询/模糊查询的sql结果


Memcached服务器的优化(集中在内核的ipv4设置上,不再重复)



  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值