Nginx网络架构实战学习笔记(六):服务器集群搭建、集群性能测试
服务器集群搭建
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 ../sbin
ls
php-fpm
cd ..
vim 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并发不是问题,因为网卡和服务器性能,基本上在几百毫秒,不是很满意,但这是硬件的限制了。
Nginx网络架构实战学习笔记(六):服务器集群搭建、集群性能测试的更多相关文章
- Nginx网络架构实战学习笔记(三):nginx gzip压缩提升网站速度、expires缓存提升网站负载、反向代理实现nginx+apache动静分离、nginx实现负载均衡
文章目录 nginx gzip压缩提升网站速度 expires缓存提升网站负载 反向代理实现nginx+apache动静分离 nginx实现负载均衡 nginx gzip压缩提升网站速度 网页内容的压 ...
- Nginx网络架构实战学习笔记(五):大访问量优化整体思路、ab压力测试及nginx性能统计模块、nginx单机1w并发优化
文章目录 大访问量优化整体思路 ab压力测试及nginx性能统计模块 ab压力测试及nginx性能统计模块 ab压力测试 nginx性能统计模块 nginx单机1w并发优化 整装待发: socket ...
- 原 Nginx网络架构实战学习笔记(七):nginx性能优化小总结
文章目录 优化思路: 优化过程 Php-mysql的优化 Nginx+phjp+mysql+nginx 压力测试: 模拟 前0-10万是热数据, 10-20万是冷门数据 请求热数据 0-10,请求9次 ...
- Nginx网络架构实战学习笔记(四):nginx连接memcached、第三方模块编译及一致性哈希应用
文章目录 nginx连接memcached 第三方模块编译及一致性哈希应用 总结 nginx连接memcached 首先确保nginx能正常连接php location ~ \.php$ { root ...
- Nginx网络架构实战学习笔记(二):编译PHP并与nginx整合、安装ecshop、商城url重写实战
文章目录 编译PHP并与nginx整合 安装ecshop(这是一个多年前php的项目貌似,作为java开发的我暂时不去关心) 商城url重写实战 编译PHP并与nginx整合 安装mysql yum ...
- Nginx网络架构实战学习笔记(一):Nginx简介、安装、信号控制、nginx虚拟主机配置、日志管理、location 语法、Rewrite语法详解
文章目录 nginx简介 nginx安装 nginx信号控制 nginx虚拟主机配置 日志管理 location 语法 精准匹配的一般匹配 正则匹配 总结 Rewrite语法详解 nginx简介 Ng ...
- java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)
java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...
- openresty 学习笔记六:使用session库
openresty 学习笔记六:使用session库 lua-resty-session 是一个面向 OpenResty 的安全和灵活的 session 库,它实现了 Secure Cookie Pr ...
- Java IO学习笔记六:NIO到多路复用
作者:Grey 原文地址:Java IO学习笔记六:NIO到多路复用 虽然NIO性能上比BIO要好,参考:Java IO学习笔记五:BIO到NIO 但是NIO也有问题,NIO服务端的示例代码中往往会包 ...
随机推荐
- Chrome-谷歌页面翻译增强插件开发
最近想做一个 Chrome 的插件(看别的博客说其实叫插件不准确,应该叫拓展,大家叫习惯了就按习惯的来吧).一开始咱先直接看了[Chrome 开发(360 翻译)](http://open.chrom ...
- Python Django 编写一个简易的后台管理工具4-添加admin模版
导入admin后台模版 可以在网上任意搜索模版,我这里也提供一个地址github 拷贝admin后台的html文件至项目的templates文件夹 创建static文件夹,将admin后台的js,im ...
- Python笔记(十一)_匿名函数与map()、filter()
匿名函数 无需显式定义函数名,和函数过程,使代码更精简的lambda表达式 函数没有命名,不用担心函数名的冲突 冒号前面代表函数的参数,后面表示计算过程 >>>func=lambda ...
- 模拟用户登录含注册——python第8天
print('欢迎登录尚雅梦想python学习系统'.center(30)) print('******' * 8) flag = True while flag: order = input(''' ...
- 常用css代码(scss mixin)
溢出显示省略号 参过参数可以只是单/多行. /** * 溢出省略号 * @param {Number} 行数 */ @mixin ellipsis($rowCount: 1) { @if $rowCo ...
- asciinema.org -Record Your Terminal Share it with no fuss
紀錄 Terminal 下指令的過程 http://asciinema.org/
- java虚拟机规范(se8)——class文件格式(一)
第四章 class文件格式 本章介绍了java虚拟机的class文件格式.每一个class文件包含一个单独的类或者接口的定义.虽然类和接口不一定都定义在文件中(比如类和接口亦可以通过类加载器直接生成) ...
- 【摘】Linux虚拟地址空间布局以及进程栈和线程栈总结
在CSDN上看到的一篇文章,讲的还是满好的. 原文地址:Linux虚拟地址空间布局以及进程栈和线程栈总结 一:Linux虚拟地址空间布局 (转自:Linux虚拟地址空间布局) 在多任务操作系统中,每个 ...
- Asp.net core 使用log4net作为日志组件,记录日志到本地。
原文:Asp.net core 使用log4net作为日志组件,记录日志到本地. GitHub demo :https://github.com/zhanglilong23/Asp.NetCore.D ...
- WPF多线程更新UI的一个解决途径
那么该如何解决这一问题呢?通常的做法是把耗时的函数放在线程池执行,然后切回主线程更新UI显示.前面的updateTime函数改写如下: private async void updateTime() ...