Nginx网络架构实战学习笔记(六):服务器集群搭建、集群性能测试

时间:2023-03-08 16:33:24

服务器集群搭建

fpm是一个独立的进程,独立进程是由父进程管理子进程,子进程没人用就回收了,对于高并发网站,几乎每时每刻都有人用,所以不让回收

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

Nginx网络架构实战学习笔记(六):服务器集群搭建、集群性能测试

如上图,在很多个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 ../sbin
ls
php-fpm
cd ..
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
//通过脚本重启php
pkill -9 php
./start.sh

进行一些高并发的调试

ulimit 30000
echo 50000 > /proc/sys/net/core/somaxconn
echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
echo 0 > /proc/sys/net/ipv4/tcp_syncookies
vi test.php
<?php
	for($sum=0,$1<10;$i++){
		$sum+=$i;
	}
echo $sum;

202机器

cd /usr/local/nginx
vi 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 30000
echo 50000 > /proc/sys/net/core/somaxconn
echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
echo 0 > /proc/sys/net/ipv4/tcp_syncookies

201机器



局域网内关闭防火墙,防火墙在高并发的时候,也是一个阻碍的因素。

service iptable stop //四台都关掉
service mysql start
mysql -h 192.168.1.201 -uroot -p
mysql>show databalse;
mysql>use big_data
mysql>show tablesdesc lx_com
mysql>select count(*) from 1x_com;
//发现一共10000+条数据

今晚就动手-。-

203机器

<? php
if 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.php

upstream 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并发不是问题,因为网卡和服务器性能,基本上在几百毫秒,不是很满意,但这是硬件的限制了。