背景
需要虚拟1万个网元做性能测试,前提是已经有网元模拟器,可以在服务器上批量起虚拟IP, 每个虚拟IP对应一个网元进程,但是一台服务器的CPU数量有限,不可能起1万个模拟器进程。于是结合haproxy,将frontend的1万个IP映射到backend的40个虚拟IP (CPU数量>40)。
查看CPU数量
# grep -c ^processor /proc/cpuinfo
40
# lscpu | grep ^CPU\(s\)
CPU(s): 40
说明:grep -c 只输出匹配行的数量
IP地址规划
前端 1万个虚拟IP
47.0.1.1 ~ 47.0.1.250
47.0.2.1 ~ 47.0.2.250
...
47.0.40.1 ~ 47.0.40.250
后端 40个虚拟IP,对应40个线程(40个CPU)
47.0.1.1 ~ 47.0.1.20
47.0.2.1 ~ 47.0.2.20
修改ARP缓存表大小
# echo "512" > /proc/sys/net/ipv4/neigh/default/gc_thresh1
# echo "2048" > /proc/sys/net/ipv4/neigh/default/gc_thresh2
# echo "10240" > /proc/sys/net/ipv4/neigh/default/gc_thresh3
说明:
1.使用echo写入
2.gc_thresh1,gc_thresh2和gc_thresh3
gc_thresh1:最小可保留的邻居表项数量。如果邻居表项的数量小于此值,垃圾回收(Garbage Collector)不会执行回收操作。默认值为 128;
gc_thresh2:当邻居表项数量超过此值时,垃圾回收将会清空大于5秒的表项。默认值为 512;
gc_thresh3:表示最大可允许的非永久表项数量。如果系统拥有大量接口或直连了许多设备,应该增大此值。默认值为 1024。
haproxy配置
/etc/haproxy/haproxy.cfg
global
...
maxconn 10000 # 改大连接数 5000 -> 10000
...
defaults
mode tcp # http -> tcp
log global
#option httplog # 注释掉或删掉
option tcplog
option dontlognull
...
frontend pcscfsim
mode tcp #tcp
bind *:1830 #前端端口
acl dst_ip1 dst 47.0.1.0/24
acl dst_ip2 dst 47.0.2.0/24
...
acl dst_ip19 dst 47.0.19.0/24
acl dst_ip20 dst 47.0.20.0/24
use_backend backapp1 if dst_ip1
use_backend backapp2 if dst_ip2
...
use_backend backapp1 if dst_ip19
use_backend backapp2 if dst_ip20
backend backapp1
balance roundrobin #轮询方式
server app1 47.0.1.1:1831 check #后端端口1831
server app2 47.0.1.2:1831 check
...
server app19 47.0.1.19:1831 check
server app20 47.0.1.20:1831 check
backend backapp2
balance roundrobin
server app21 47.0.2.1:1831 check
server app22 47.0.2.2:1831 check
...
server app39 47.0.2.19:1831 check
server app40 47.0.2.20:1831 check
说明:
前端 47.0.1.0/24 即模拟器对应的 47.0.1.1:1830 ~ 47.0.1.250:1830 等10段IP, 会以roundrobin的方式映射到后端的app1~app20,即47.0.1.1:1831 ~ 47.0.1.20:1831;
前端 47.0.2.0/24 即模拟器对应的 47.0.2.1:1830 ~ 47.0.2.250:1830 等10段IP, 会以roundrobin的方式映射到后端的app21~app40,即47.0.2.1:1831 ~ 47.0.2.20:1831
后端的 47.0.1.1:1831 ~ 47.0.1.20:1831 和 47.0.2.1:1831 ~ 47.0.2.20:1831 对应40个模拟器线程