目的:测试Haproxy压测情况

环境:

Ha服务器:8核16G虚机,后端6个2核4G,压测客户端3个2核4G

安装和优化:

一、Haproxy

#cd /opt/soft
#wget http://www.haproxy.org/download/1.8/src/haproxy-1.8.14.tar.gz
#tar zxvf haproxy-1.8.14.tar.gz
#cd haproxy-1.8.14
安装:
#make TARGET=linux2628 ARCH=X86_64 PREFIX=/usr/local/haproxy
#make install PREFIX=/usr/local/haproxy
添加用户:
#useradd -s /sbin/nologin -M haproxy
id haproxy
#mkdir /etc/haproxy/
配置systemctl
#cp /opt/soft/haproxy-1.8.14/examples/haproxy.init /etc/init.d/haproxy
#chmod +x /etc/init.d/haproxy
#vi /etc/init.d/haproxy

/etc/init.d/haproxy

#!/bin/sh
#
# chkconfig: - 85 15
# description: HA-Proxy is a TCP/HTTP reverse proxy which is particularly suited \
# for high availability environments.
# processname: haproxy
# config: /etc/haproxy/haproxy.cfg
# pidfile: /var/run/haproxy.pid # Source function library.
if [ -f /etc/init.d/functions ]; then
. /etc/init.d/functions
elif [ -f /etc/rc.d/init.d/functions ] ; then
. /etc/rc.d/init.d/functions
else
exit 0
fi # Source networking configuration.
. /etc/sysconfig/network # Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0 # This is our service name
BASENAME=`basename $0`
if [ -L $0 ]; then
BASENAME=`find $0 -name $BASENAME -printf %l`
BASENAME=`basename $BASENAME`
fi BIN=/usr/sbin/$BASENAME CFG=/etc/$BASENAME/$BASENAME.cfg
[ -f $CFG ] || exit 1 PIDFILE=/var/run/$BASENAME.pid
LOCKFILE=/var/lock/subsys/$BASENAME RETVAL=0 start() {
quiet_check
if [ $? -ne 0 ]; then
echo "Errors found in configuration file, check it with '$BASENAME check'."
return 1
fi echo -n "Starting $BASENAME: "
daemon $BIN -D -f $CFG -p $PIDFILE
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch $LOCKFILE
return $RETVAL
} stop() {
echo -n "Shutting down $BASENAME: "
killproc $BASENAME -USR1
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && rm -f $LOCKFILE
[ $RETVAL -eq 0 ] && rm -f $PIDFILE
return $RETVAL
} restart() {
quiet_check
if [ $? -ne 0 ]; then
echo "Errors found in configuration file, check it with '$BASENAME check'."
return 1
fi
stop
start
} reload() {
if ! [ -s $PIDFILE ]; then
return 0
fi quiet_check
if [ $? -ne 0 ]; then
echo "Errors found in configuration file, check it with '$BASENAME check'."
return 1
fi
$BIN -D -f $CFG -p $PIDFILE -sf $(cat $PIDFILE)
} check() {
$BIN -c -q -V -f $CFG
} quiet_check() {
$BIN -c -q -f $CFG
} rhstatus() {
status $BASENAME
} condrestart() {
[ -e $LOCKFILE ] && restart || :
} # See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
reload)
reload
;;
condrestart)
condrestart
;;
status)
rhstatus
;;
check)
check
;;
*)
echo $"Usage: $BASENAME {start|stop|restart|reload|condrestart|status|check}"
exit 1
esac exit $?

  Haproxy配置:

global
group root
user root
daemon
nbproc 7
log 127.0.0.1 local3
pidfile /var/run/haproxy/pid/haproxy.pid
ulimit-n 1000000 ##这里增大文件打开数
max-spread-checks 1000ms
maxconn 3000000 ##这里放开限制
maxconnrate 3000000
maxsessrate 3000000
#maxsslconn 3000000
#maxsslrate 3000000
spread-checks 20
stats timeout 60s
stats maxconn 500
stats socket /var/run/haproxy/sock/haproxy.sock mode 600 level admin process 1 #---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
mode http
#mode tcp
maxconn 3000000 ##这里最好与上面一致,否则默认限制2000,找了好久
option abortonclose
option redispatch
option forwardfor
balance roundrobin
log 127.0.0.1 local3 err
retries 3
option clitcpka
option srvtcpka
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
listen 172.28.20.102:81
balance roundrobin
bind *:81
option tcp-check
option httplog
#option dontlognull
#test
timeout http-keep-alive 70s
timeout http-request 70s
timeout connect 100000
timeout queue 100000
timeout client 100000
timeout server 100000
timeout check 100000
cookie SERVERID insert indirect nocache
server 105_1 172.28.20.105:8282 check
server 105_2 172.28.20.105:8283 check
server 105_3 172.28.20.105:8284 check
server 105_4 172.28.20.105:8285 check
server 105_5 172.28.20.105:8286 check
server 105_6 172.28.20.105:8287 check
server 108_1 172.28.20.108:8282 check
server 108_2 172.28.20.108:8283 check
server 108_3 172.28.20.108:8284 check
server 108_4 172.28.20.108:8285 check
server 108_5 172.28.20.108:8286 check
server 108_6 172.28.20.108:8287 check
server 167_1 172.28.16.167:8282 check
server 167_2 172.28.16.167:8283 check
server 167_3 172.28.16.167:8284 check
server 168_1 172.28.16.168:8282 check
server 168_2 172.28.16.168:8283 check
server 168_3 172.28.16.168:8284 check
server 169_1 172.28.16.169:8282 check
server 169_2 172.28.16.169:8283 check
server 169_3 172.28.16.169:8284 check
server 170_1 172.28.16.170:8282 check
server 170_2 172.28.16.170:8283 check
server 170_3 172.28.16.170:8284 check

 #内核参数优化(haproxy,后端服务器,客户端均要)

#vi /etc/sysctl.conf

### 系统中所允许的文件句柄的最大数目
fs.file-max = 12553500
### 单个进程所允许的文件句柄的最大数目
fs.nr_open = 12453500
### 内核允许使用的共享内存大 Controls the maximum number of shared memory segments, in pages
kernel.shmall = 4294967296
###单个共享内存段的最大值 Controls the maximum shared segment size, in bytes
kernel.shmmax = 68719476736
### 内核中消息队列中消息的最大值 Controls the maximum size of a message, in bytes
kernel.msgmax = 65536
### 系统救援工具
kernel.sysrq = 0
### 在每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到缓存队列的数据包的最大数目
net.core.netdev_max_backlog = 2000000
### 默认的TCP数据接收窗口大小(字节)
net.core.rmem_default = 699040
### 最大的TCP数据接收窗口(字节)
net.core.rmem_max = 50331648
### 默认的TCP数据发送窗口大小(字节)
net.core.wmem_default = 131072
### 最大的TCP数据发送窗口(字节)
net.core.wmem_max = 33554432
### 定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数
net.core.somaxconn = 65535 ### TCP/UDP协议允许使用的本地端口号
net.ipv4.ip_local_port_range = 15000 65000
net.ipv4.ip_nonlocal_bind = 1
### 对于本端断开的socket连接,TCP保持在FIN-WAIT-2状态的时间(秒)
net.ipv4.tcp_fin_timeout = 7
### TCP发送keepalive探测消息的间隔时间(秒),用于确认TCP连接是否有效
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_max_orphans = 3276800
### 对于还未获得对方确认的连接请求,可保存在队列中的最大数目
net.ipv4.tcp_max_syn_backlog = 655360
net.ipv4.tcp_max_tw_buckets = 6000000
### 确定TCP栈应该如何反映内存使用,每个值的单位都是内存页(通常是4KB)
### 第一个值是内存使用的下限;第二个值是内存压力模式开始对缓冲区使用应用压力的上限;第三个值是内存使用的上限.
net.ipv4.tcp_mem = 94500000 915000000 927000000
### 为自动调优定义socket使用的内存。
### 第一个值是为socket接收缓冲区分配的最少字节数;
### 第二个值是默认值(该值会被rmem_default覆盖),缓冲区在系统负载不重的情况下可以增长到这个值;
### 第三个值是接收缓冲区空间的最大字节数(该值会被rmem_max覆盖)
net.ipv4.tcp_rmem = 32768 699040 50331648
### 为自动调优定义socket使用的内存。
### 第一个值是为socket发送缓冲区分配的最少字节数;
### 第二个值是默认值(该值会被wmem_default覆盖),缓冲区在系统负载不重的情况下可以增长到这个值;
### 第三个值是发送缓冲区空间的最大字节数(该值会被wmem_max覆盖)
net.ipv4.tcp_wmem = 32768 131072 33554432
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_synack_retries = 2
### 表示是否打开TCP同步标签(syncookie),同步标签可以防止一个套接字在有过多试图连接到达时引起过载
### 内核必须打开了CONFIG_SYN_COOKIES项进行编译,
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_syn_retries = 2
### 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭
net.ipv4.tcp_tw_recycle = 1
### 允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭
net.ipv4.tcp_tw_reuse = 1
### 启用RFC 1323定义的window scaling,要支持超过64KB的TCP窗口,必须启用该值(1表示启用),
### TCP窗口最大至1GB,TCP连接双方都启用时才生效,默认为1
net.ipv4.tcp_window_scaling = 1
### 最大限度使用物理内存
vm.swappiness = 0

生效下

#/sbin/sysctl -p

vi /etc/security/limits.conf

* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535

  

二、后端服务端

服务器优化,参考haproxy修改sysctl.conf和limits.conf

简单写了个springboot web端,创建springboot工程,加入以下两个类,编译成jar包。每个服务器运行3个实例

启动脚本runhellos.sh

#!/bin/sh
counter=0
while [ $counter -le 2 ]
do
port=$((8282+$counter))
java -jar helloworld-0.0.1-SNAPSHOT.jar --server.port=$port 2>&1 >/dev/null &
((counter++))
done
echo "all servers create"

  关闭:pkill java

主程序HelloController.class

package com.wwd;

import javax.servlet.http.HttpServletRequest;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer;
import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody; @Controller
@EnableAutoConfiguration
@SpringBootApplication
public class HelloController { @RequestMapping("/hello")
@ResponseBody
String home(HttpServletRequest request) {
String sleep = request.getHeader("sleep");
if(!"".equals(sleep) && null != sleep){
System.out.println("sleeptime:"+(long)((Math.random()*Integer.parseInt(sleep))));
try {
Thread.sleep((long)((Math.random()*Integer.parseInt(sleep))));
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
} return "Hello ,spring boot!";
} public static void main(String[] args) throws Exception {
SpringApplication.run(HelloController.class, args);
//运行之后在浏览器中访问:http://localhost:8080/hello
} /* @Override
public void customize(ConfigurableEmbeddedServletContainer configurableEmbeddedServletContainer) { }*/ }

 tomcat参数调整(因为要保持连接,设置的超时连接时间较长,不然压不上去。)

/*
* Project: helloworld
*
* File Created at 2018年10月11日
*
* Copyright 2016 CMCC Corporation Limited.
* All rights reserved.
*
* This software is the confidential and proprietary information of
* ZYHY Company. ("Confidential Information"). You shall not
* disclose such Confidential Information and shall use it only in
* accordance with the terms of the license.
*/
package com.wwd; import org.apache.catalina.connector.Connector;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.context.embedded.EmbeddedServletContainer;
import org.springframework.boot.context.embedded.ServletContextInitializer;
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;
import org.springframework.stereotype.Component; @Component()
public class MyEmbeddedServletContainerFactory extends TomcatEmbeddedServletContainerFactory {
public EmbeddedServletContainer getEmbeddedServletContainer(ServletContextInitializer... initializers) {
// 设置端口
// this.setPort(8081);
return super.getEmbeddedServletContainer(initializers);
} protected void customizeConnector(Connector connector) {
super.customizeConnector(connector);
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 设置最大连接数
protocol.setMaxConnections(8000);
// 设置最大线程数
protocol.setMaxThreads(400);
protocol.setConnectionTimeout(3000000);
}
} /**
* Revision history
* -------------------------------------------------------------------------
*
* Date Author Note
* -------------------------------------------------------------------------
* 2018年10月11日 WWD create
*/

三、压测工具

开始用jmeter和ab去压测,只能测试tps信息,连接数压不上去。

ab -c 300 -n 100000 http://172.28.20.102:81/hello

引入贝吉塔Vegeta

wget https://github.com/tsenart/vegeta/releases/download/v8.0.0/vegeta-8.0.0-linux-amd64.tar.gz
tar zxvf vegeta-8.0.0-linux-amd64.tar.gz
ln -s /opt/soft/vegeta /usr/local/sbin/vegeta

 2核4G,压测命令和参数如下,

echo "GET http://172.28.20.102:81/hello" | vegeta -cpus=2 attack -duration=10m -header="sleep:60000" -rate=2000 -workers=200 -timeout=1800s | tee reports.bin | vegeta report

-duration 10m为持续时间

-rate 2000为每秒2000个请求

-workers 200个线程  

sleep为设置后端随机响应时间,以保持连接。

四、测试对比结果

调整sleep时间和增加压测客户端数量,查看estab数量

查看命令: ss -s&&free -g

能到24W的连接数

但内存和CPU使用率不高,有待 进一步测试。

Haproxy压测的更多相关文章

  1. HAProxy压测及参数调优

    背景 小米容器云平台,在构建云厂商集群时,需要通过HAProxy将云厂商LB流量从宿主机转到容器中,但对于HAProxy的性能没有把握.参考网上的一篇HAProxy压测文章,文章中提到HAProxy ...

  2. mysql每秒最多能插入多少条数据 ? 死磕性能压测

    前段时间搞优化,最后瓶颈发现都在数据库单点上. 问DBA,给我的写入答案是在1W(机械硬盘)左右. 联想起前几天infoQ上一篇文章说他们最好的硬件写入速度在2W后也无法提高(SSD硬盘) 但这东西感 ...

  3. Http压测工具wrk使用指南

    用过了很多压测工具,却一直没找到中意的那款.最近试了wrk感觉不错,写下这份使用指南给自己备忘用,如果能帮到你,那也很好. 安装 wrk支持大多数类UNIX系统,不支持windows.需要操作系统支持 ...

  4. 使用mysqlslap对mysql进行压测,观察Azure虚拟机cpu使用率

    一直想做这个测试,原因很简单,很多人一直比较怀疑Azure的虚拟机性能,说相同的配置凭啥比阿里的虚拟机贵那么多,其实,我自己以前也怀疑过,但是接触Azure的几个月,确实发现Azure的虚拟机性能真的 ...

  5. MySQL mysqlslap压测

    200 ? "200px" : this.width)!important;} --> 介绍 mysqlslap是mysql自带的一个性能压测工具:mysqlslap用于和其 ...

  6. 真刀真枪压测:基于TCPCopy的仿真压测方案

    郑昀 基于刘勤红和石雍志的实践报告 创建于2015/8/13 最后更新于2015/8/19 关键词:压测.TCPCopy.仿真测试.实时拷贝流量 本文档适用人员:技术人员 提纲: 为什么要做仿真测试 ...

  7. Netty NIO 框架性能压测-短链接-对比Tomcat

    压测方案 准备多个文件大小分别为 1k 10k 100k 300k 使用ab分别按 [50,2000](按50逐渐叠加)压测服务,每次请求10W次 硬件信息:CPU:Intel(R) Xeon(R) ...

  8. 图解jmeter压测http接口

    此次压力测试是以一个http json的后台接口为例. 1. 创建相应的部件 2. 设置相应的参数 线程组主要用于设置一共要测试的线程数量(上图1000),每秒起的线程数(上图10),几秒内启动完单循 ...

  9. Python Locust对指定网站“一键压测”

    [本文出自天外归云的博客园] 前篇 前篇:Python Locust性能测试框架实践 本篇 承上——归纳过程 在前篇的基础上,我们可以利用Locust性能测试框架编写python脚本对指定网站或者接口 ...

随机推荐

  1. [LeetCode] 122. 买卖股票的最佳时机ii best-time-to-buy-and-sell-stock-ii(贪心算法)

    思路: 只要第二天的价格高于第一天,就进行交易.(这样的话就默认可以同一天内先卖出再买进) class Solution(object): def maxProfit(self, prices): & ...

  2. poj 2337 Catenyms 【欧拉路径】

    题目链接:http://poj.org/problem?id=2337 题意:给定一些单词,假设一个单词的尾字母与还有一个的首字母同样则能够连接.问能否够每一个单词用一次,将全部单词连接,能够则输出字 ...

  3. 【Android】资源系列(二) -- 文件原样保留的资源assets和res/raw文件夹

    这两个文件夹都能够存放文件.而在打包的时候被原样保留. 那用这两个文件夹可以做什么事呢? 1.放一个apk,要用的时候调出来.免得去下载server下载. 2.放一个sql,当app数据库非常大的时候 ...

  4. 教你怎样做个有“钱”途的測试project师

    百度百科说測试project师这一职业的待遇,薪酬上升空间很大.但測试project师也有自己的烦恼,比方在程序出错后,将问题反馈给程序猿,然后程序猿给的答复是:"oh,howisthatp ...

  5. django 笔记14 中间件

    用户请求->中间件->urls->views->返回字符串->中间件->用户浏览器 settings MIDDLEWARE里面都是中间件 有的地方叫管道 请求来的时 ...

  6. react --- 路由传参的几种方式

    1.params 优势 : 刷新地址栏,参数依然存在缺点:只能传字符串,并且,如果传的值太多的话,url会变得长而丑陋. 2.query 优势:传参优雅,传递参数可传对象:缺点:刷新地址栏,参数丢失 ...

  7. Internet Explorer Developer Channel 自动化测试 IE 浏览器

    IE 原生 Web Driver 调用,通过简单配置,即可自动化测试 IE 浏览器(目前仅限 Internet Explorer Developer Channel 版本).做一些自动化的操作,都是很 ...

  8. Struts2+MySQL登录注册

    下载地址:http://download.csdn.net/detail/qq_33599520/9777172 项目结构图: 代码: package com.mstf.action; import ...

  9. ubuntu重启网络报错

    执行:gw@ubuntu:/$ /etc/init.d/networking restart 报错:stop: Rejected send message, 1 matched rules; type ...

  10. [洛谷P2085]最小函数值

    题目大意:有n个函数,分别为F1,F2,...,Fn.定义Fi(x)=Ai*x^2+Bi*x+Ci (x∈N*).给定这些Ai.Bi和Ci,要求出所有函数的所有函数值中最小的m个(如有重复的要输出多个 ...