正文
Nginx网络架构实战学习笔记(六):服务器集群搭建、集群性能测试
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
文章目录
- 服务器集群搭建
- Nginx---->php-fpm之间的优化
- 302机器
- 202机器
- 压力测试
- 搭建memcached、mysql(数据准备)
- 今晚就动手-。-
- 集群性能测试
服务器集群搭建
fpm是一个独立的进程,独立进程是由父进程管理子进程,子进程没人用就回收了,对于高并发网站,几乎每时每刻都有人用,所以不让回收
Nginx---->php-fpm之间的优化
如上图,在很多个nginx来访问fpm时, fpm的进程要是不够用, 会生成子进程.
生成子进程需要内核来调度,比较耗时,
如果网站并发比较大,
我们可以用静态方式一次性生成若干子进程,保持在内存中.
方法 – 修改php-fpm.conf
Pm = static 让fpm进程始终保持,不要动态生成
Pm.max_children= 32 始终保持的子进程数量
302机器
cd /php/etc
php-fpm9000.conf php-fpm9001.conf php-fpm90002conf php-fpm90003conf
部分配置如下
pm =static//给固定的子进程,还可以是dynamic,dynamic就是可以回收的pm.max_children=16//设置16个子进程,32个子进程,大概需要1g的内存。listen = 192.168.xx.xx:9000 //设置为相应的9001 9002 9003,监听不同的端口
大概有80个进程
cd ../sbinlsphp-fpmcd ..vim start.sh
start.sh
//-y的意思是通过不同的配置文件启动fpm#!/bin/sh/usr/1ocal/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/usr/local/php/sbin/php-fpm -y /usr/local/php/etc/php-fpm9002.conf/usr/local/php/sbin/php-fpm -y /usr/local/php/etc/php-fpm9003.conf/usr/local/php/sbin/php-fpm -y /usr/local/php/etc/php-fpm9004.conf
//通过脚本重启phppkill -9 php./start.sh
进行一些高并发的调试
ulimit 30000echo 50000 > /proc/sys/net/core/somaxconnecho 1 > /proc/sys/net/ipv4/tcp_tw_recycleecho 1 > /proc/sys/net/ipv4/tcp_tw_reuseecho 0 > /proc/sys/net/ipv4/tcp_syncookies
vi test.php<?phpfor($sum=0,$1<10;$i++){$sum+=$i;}echo $sum;
202机器
cd /usr/local/nginxvi conf/nginx
http{upstream phpserver{server 192.168.1.200:9000;server 192.168.1.200:9001;server 192.168.1.200:9002;server 192.168.1.200:9003;server 192.168.1.200:9004;}location ~ \-phps {root html;fastcgi pass phpserver;fastcgi index index-php;fastcgi param SCRIPT FILENAME/scriptssfastcgi_script_name;include fastcgi params;}}
./sbin/nginx/reload
访问:http://192.168.1.202/test.php ,发现访问的是203服务器的php说明成功了。
压力测试
在204和201机器上分别5000个并发
//因为加入了php,所以并发量降低一点//-c 2000个并发,-n 测试60000次./bin/ab -c 2000 -n 60000 http://192.168.1.202/test.php
访问http://192.168.1.202/status
查看状态,发现有只有100以内
ab日志看直接超时了
在202机器查看错误日志
tail logs/error.log
搭建memcached、mysql(数据准备)
202机器
start.sh 脚本 (启动memcached)
//-c2000每个最多允许两千个并发连接,-m每人占512m#!/bin/bash/usr/local/memcached/bin/memcached -u nobody -c 2000 -p 11211 -m 512 -d/usr/local/memcached/bin/memcached -u nobody -c 2000 -p 11212 -m 512 -d/usr/local/memcached/bin/memcached -u nobody -c 2000 -p 11213 -m 512 -d/usr/local/memcached/bin/memcached -u nobody -c 2000 -p 11214 -m 512 -d/usr/local/memcached/bin/memcached -u nobody -c 2000 -p 11215 -m 512 -d/usr/local/memcached/bin/memcached -u nobody -c 2000 -p 11216 -m 512 -d/usr/local/memcached/bin/memcached -u nobody -c 2000 -p 11217 -m 512 -d/usr/local/memcached/bin/memcached -u nobody -c 2000 -p 11218 -m 512 -d
pkill -9 memecached//执行高并发的命令ulimit 30000echo 50000 > /proc/sys/net/core/somaxconnecho 1 > /proc/sys/net/ipv4/tcp_tw_recycleecho 1 > /proc/sys/net/ipv4/tcp_tw_reuseecho 0 > /proc/sys/net/ipv4/tcp_syncookies
201机器
局域网内关闭防火墙,防火墙在高并发的时候,也是一个阻碍的因素。
service iptable stop //四台都关掉service mysql startmysql -h 192.168.1.201 -uroot -pmysql>show databalse;mysql>use big_datamysql>show tablesdesc lx_commysql>select count(*) from 1x_com;//发现一共10000+条数据
今晚就动手-。-
203机器
<? phpif this file be requested,it's mean that the memcached was missed;so we need set the value into memcached and output#print_r(S_SERVER);$mem =new memcache();Smem->addserver('192.168.1.204',11211);$mem->addserver('192.168.1.204',11212);$mem->addserver('192.168.1.204',11213);$mem->addserver('192.168.1.204',11214);Smen->addserver('192.168.1.204',11215);$mem->addServer('192.168.1.204',11216);$men->addserver('192.168.1.204',11217);$mem->addserve('192.168.1.204',11218)$uri = $_SERVERI'REQUEST_URI'];if(Suri == '/index.html') {Scont = 'this is index.html';$mem->add($uri,$cont,false,300);echo $cont;else if(substr($uri,1,3) == 'com') {$comid = substr($uri,4,-5);#echo 'you want to see ',Scomid,'company';$conn = mysql pconnect('192.168.1.201','root',"))if(!$conn) {exit('conn mysql fail');}$sql= 'use big_data';mysql_query($sql,$conn);}echo 'from mysql'
用url当做key,去mysql中取,放到memcached中
202机器
vi conf/nginx.phpupstream mcserver{consistent hash Srequest_uri;server 192.168.1.204:11211;server 192.168.1.204:11212;server 192.168.1.204:11213;server 192.168.1.204:11214;server 192.168.1.204:11215;server 192.168.1.204:11216;server 192.168.1.204:11217;server 192.168.1.204:11218;}location / {set $memcached_key $request_uri;memcached_pass mcserver;error page 404 /callback.php;# root html:index index.html ihdex.htm;./sbin/nginx -s reload
访问 http://192,168,1,202/index.html
第一次 this is index.html from mysql
第二次 this is index.html
访问 http://com122.html
返回数据库中的内容
集群性能测试
在201 204 分别进行压力测试
因为真正的访问有热门数据,有冷门数据
所以
模拟 前0-10万是热数据,
10- n万是冷门数据
vi bench.php
$mem =new memcache();Smem->addserver('192.168.1.204',11211);$mem->addserver('192.168.1.204',11212);$mem->addserver('192.168.1.204',11213);$mem->addserver('192.168.1.204',11214);Smen->addserver('192.168.1.204',11215);$mem->addServer('192.168.1.204',11216);$men->addserver('192.168.1.204',11217);$mem->addserve('192.168.1.204',11218)Smin = 13423237;//百分之九十五的情况下查询前十万条数据if(mt_rand(0,100) <=95){$comid = $min + mt rand(0,100000);}else[//八分之五的情况下查询后面的数据Scomid = mt_rand(0,$min);}if(!($cont=$mem->get('com'.$comid))){Sconn = mysql pconnect('192.168.1.201','root','');if(!Sconn) {exit('conn mysql fail');}$sql ='use big_data';mysql_query($sql,$conn);Ssql = 'set names utf8';mysql_query($sql,$conn);Ssql ='select id,name,address from lx_com where id='. $comid://$sql = 'select id,name,address from lx_com where id=' . $comid;srs=mysql_query($sql,$conn);Sinfo = mysql_fetch_assoc($rs);if(empty($infol){echo 'no this company':exiti}Scont = '':$cont = '<h1>'. Sinfol'name"] .'</h1>':$cont .= '<h2>' . $infol'address'] .'</h2>':sem->add('com.$comid',$cont,0,300)echo $cont;echo '~~ from mysql';}else{echo $cont}
访问 http://192.168.1.201/bench.php
有时会输出
no this company
有时会输出
常州xxx公司 武汉xxx公司
201机器
./ab -c 3000 -n 600000 http://192.168.1.202/bench.php
访问:http://102.168.1.202/status
保持在3000左右的并发
总耗时十分钟
访问600000
失败581069(注意ab第一次请求的内容认为是正常的内容,以后的内容都和第一次请求作比较,不一样就认为请求失败,所以这里并不是真正的请求失败)
百分之75是在1.5s左右
./ab -c 2000 -n 300000 http://192.168.1.202/bench.php
66%在1s以内
./ab -c 1500 -n 300000 http://192.168.1.202/bench.php
75%在1s以内
大部分时间耗在了连接memcached上了
修改上面的脚本
//加上true代表做持久连接Smem->addserver('192.168.1.204',11211,true);$mem->addserver('192.168.1.204',11212,true);$mem->addserver('192.168.1.204',11213,true);$mem->addserver('192.168.1.204',11214,true);Smen->addserver('192.168.1.204',11215,true);$mem->addServer('192.168.1.204',11216,true);$men->addserver('192.168.1.204',11217,true);$mem->addserve('192.168.1.204',11218,true)
时间上有毫秒级别的改进
nginx10000并发压力不大,加上php mysql memcached之后,2000-3000并发不是问题,因为网卡和服务器性能,基本上在几百毫秒,不是很满意,但这是硬件的限制了。