Linux做施压机的最大线程数,奔跑吧 | Mongodb集群压力测试与性能调优

实验设备

用于mongodb集群节点的设备

主机:8台

CPU:8核Intel(R) Xeon(R) CPU E5-2650 v3 @ 2.30GHz

内存:32G

磁盘:SSD

系统:Linux 3.10.0-229.el7.x86_64 CentOS 7.1

运行环境

集群:使用mongodb-3.2.6,每台主机一个shard组成分片集群,每台主机一个路由(mongos)作为入口。

准备工作,参考官方文档:

关闭透明大页。

关闭atime。

增加mongodb运行用户的最大进程数。

实验数据和方法

数据库和集合开启分片后导入bson格式数据文件。

小文档数据:

data : 697.67MiB docs : 17013091 avg obj size :43B

大文档数据:

data : 64.33GiB docs : 22504206 avg obj size :3KiB

施压端程序用java语言编写,mongodb-java-driver使用3.2版本,源码见这里,支持操作如下:

find_first:根据主键id查询数据。

find_in:根据一批主键批量查询数据,批量大小为40。

find:根据主键id大于随机值的一批数据,限制返回100到10100条。

find_update:根据键id查询数据,并保持原状执行更新(即包含一次查询和一次更新)。

find_insert:根据键id查询数据,并插入到同结构的copy表(即包含一次查询和一次插入)。

find_delete:根据键id查询数据,并根据id从copy表删除数据(即包含一次查询和一次删除)。

实验用例

用例一

仅向一台主机的mongos施压,根据实际情况调整线程数为接近最优(即再增加施压主机或增大线程数,每秒并发完成数增加不明显甚至造成每次耗时增大)。

【操作】

【数据】

【线程数】

【每秒并发完成数】

【每次耗时(毫秒)】

【入网流量(MBit/s)】

【出网流量(MBit/s)】

【负载】

find_first

80

26000+

3

700+

700+

16+

find_update

80

13000+

6

700+

700+

16+

find_first

80

37000+

2

130+

130+

17+

find_update

80

21000+

3

130+

170+

19+

find

4

70+

50+

1010+ 占满

200+

3+

find_first

(4核主机部署的mongos)

80

25000+

3

100+

100+

15+

初步结论:

mongos的吞吐量直接与CPU性能、数据文档大小关联。CPU性能越高核数越多、文档越小,吞吐量越大。

集群环境下使用不能通过片键定位某个shard的条件查询时,mongos会向所有shard发起请求,汇总数据加工处理后再返回给客户端。此时如果符合条件的数据集较大,会造成mongos机的入网带宽压力变大,甚至成为瓶颈。

用例二

测试关闭tuned服务对集群性能的影响,施压过程中关闭tuned观察变化。

systemctl stop tuned

systemctl status tuned

调整后以find_first小文档数据为例,发现每秒并发完成数由37000下降到23000。

【操作】

【数据】

【线程数】

【每秒并发完成数】

【每次耗时(毫秒)】

【入网流量(MBit/s)】

【出网流量(MBit/s)】

【负载】

find_first

80

23000+

2

90+

90+

9+

对比前后的sysctl配置如下图:

# 输出sysctl配置到文件

sysctl -a > sysctl.002

# 对比文件差异

diff sysctl.001 sysctl.002

a803bbd1df5f3543e08e2077d5b525fb.png

发现kernel.sched_min_granularity_ns和kernel.sched_wakeup_granularity_ns变化明显。实际上这两个参数是tuned进程在动态调优过程中自动调整到合适的值(10000000和15000000),关闭tuned后动态调整的参数恢复原样(3000000和4000000)。关闭tuned后如果手动调整者两个参数将起到同样调优效果。

sysctl -w kernel.sched_min_granularity_ns=10000000

sysctl -w kernel.sched_wakeup_granularity_ns=15000000

初步结论:

一般情况下借住tuned可以自动调优。

mongodb集群性能受kernel.sched_min_granularity_ns和kernel.sched_wakeup_granularity_ns影响。

用例三

测试均衡软中断对集群性能的提升。

在未做调整前,观察到由于网络IO引起的CPU每秒中断次数较多。统计显示软中断集中由CPU的某一个核处理(通常是第0或者第1个),该核空闲率几乎为0造成瓶颈,而其他核空闲率相对较高,由此造成CPU资源没有充分利用。如下图:

top

# 然后输入1

341af5484f5549be3dcfb97e31d2f2e9.png

或者

mpstat -P ALL 2

9ba2ea186b1685abce7c12227a0d7829.png

CentOS从6.1开始支持RPS(Receive Packet Steering),通过修改RPS配置来调优。参考

查看/sys/class/net/eth0/queues/rx-0/rps_cpus的值为00,表示软中断由第一个核处理。该值计算方法如下:对于8核来讲,第一个是00000001,第二个是00000010,依次类推,第8个是10000000。如果要所有核负担则相加8个值,得到的数值为11111111,转十六进制是ff。如果要后7个核负担则得到数值11111110,转十六进制是fe。

#echo ff > /sys/class/net/eth0/queues/rx-0/rps_cpus

echo fe > /sys/class/net/eth0/queues/rx-0/rps_cpus

调整后如下图(尽管不是很均衡,但是优化后效果明显~):

fccbaabf46a238e97c081bc38d33d32e.png

044141f6a841e7f7dc5dbc3a76dcdf93.png

以find_first小文档数据为例,发现每秒并发完成数由37000提高到44000。

【操作】

【数据】

【线程数】

【每秒并发完成数】

【每次耗时(毫秒)】

【入网流量(MBit/s)】

【出网流量(MBit/s)】

【负载】

find_first

80

44000+

2

160+

160+

26+

初步结论:

多核CPU主机通过均衡软中断在核之间的分布可以有效提高CPU利用率,提升mongodb集群吞吐量。

用例四

使用多个施压主机分别向四个mongos施压,所有主机均已完成上述调优。

以小文档数据为例,四台主机的表现如下,整体带来乘以4的每秒并发完成数。

【操作】

【数据】

【线程数】

【每秒并发完成数】

【每次耗时(毫秒)】

【入网流量(MBit/s)】

【出网流量(MBit/s)】

【负载】

find_first

80

31000+

2

140+

140+

21+

find_update_one

80

17000+

4

140+

140+

20+

find_in

80

3000+

24

130+

170+

40+

初步结论:

mongodb集群环境的整体性能还是比较出色的。

mongos和shard都是多线程的方式处理请求的。mongos启动时会根据CPU核数启动相应个数的主线程,负责向各个shard发起数据请求并接收响应,而客户端进来的请求首先通过mongos创建的新线程接收,然后交给前面的主线程处理,完成后再由该新线程将结果返回给客服端。所以并发较高的时候通常都是向shard分发请求的那几个mongos线程比较繁忙。

dea62e88d86236b8395c28ad683d1367.png

本文基于署名-非商业性使用-相同方式共享 4.0许可协议发布,欢迎转载、使用、重新发布,但请保留文章署名wanghengbin(包含链接:https://wanghengbin.com),不得用于商业目的,基于本文修改后的作品请以相同的许可发布。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值