基准测试+线上监控图形+报警阈值

1,mongodb

 

https://cloud.tencent.com/developer/article/1005399?from=15425,数据库的基准测试

 

线上监控图形

 

 

场景是,凌晨3点开始的备份,持续时间20分钟,3点05到3点25,平均iops 5000,平均MBps , 单个io size大小,

 

因为mongodb和MySQL还不太一样,MySQL是innodb引擎,mongodb默认是WiredTiger引擎.

mongo的WT引擎,内存页和磁盘的组织方式与innodb不太一样,参考袁荣喜对WT引擎源码的分析:

https://blog.csdn.net/weixin_45583158/article/details/100143033

https://github.com/yuanrongxi/wiredtiger

根据他的建议:

如果是读多写少的表在创建时我们可以尽量将 page size 设置的比较小 ,比如 16KB,如果表数据量不太大(<2G),甚至可以不开启压缩。那么 createCollection 的 configString 可以这样设置:

"internal_page_max=16KB,leaf_page_max=16KB,leaf_value_max=8KB,os_cache_max=1GB"

如果这个读多写少的表数据量比较大,可以为其设置一个压缩算法,例如:

"block_compressor=zlib, internal_page_max=16KB,leaf_page_max=16KB,leaf_value_max=8KB"

如果是写多读少的表,可以将 leaf_page_max 设置到 1MB,并开启压缩算法,也可以为其制定操作系统层面 page cache 大小的 os_cache_max 值,让它不会占用太多的 page cache 内存,防止影响读操作。

这些 MongoDB 的配置项都是和 WiredTiger 引擎数据组织相关的配置项,在了解 WiredTiger 的数据组织方式细节情况下,可以根据具体的业务场景调整 collection 的表配置属性。

总的来说,还是有这个page size大小的概念的,8kb,16kb还是多少。

 

innodb默认是以16k数据页大小进行读取,这个数据页是可配可调的(比如oracle数据库,比如修改innodb的代码),以多大数据页读取,

应该是和磁盘无关的,对于磁盘来说以4k,8k,16k,32k,64k。。。这些大小读取都可以。比如:

对于fio这个测试工具来说,可以指定块大小去读写磁盘:

Linux: yum install fio.x86_64

fio参数说明

参数说明
-direct=1 忽略缓存,直接写入磁盘
-iodepth=128 请求的IO队列深度
-rw=write 读写策略,可选值randread(随机读),randwrite(随机写),read(顺序读),write(顺序写),randrw(混合随机读写)
-ioengine=libaio IO引擎配置,建议使用libaio
-bs=4k 块大小配置,可以使用4k,8k,16k等
-size=200G 测试生成文件的大小
-numjobs=1 线程数配置
-runtime=1000 测试运行时长,单位秒
-group_reporting 测试结果汇总展示
-name=test 测试任务名称
-filename=/data/test 测试输出的路径与文件名
 

 

对于一个磁盘来说,读取的size大小确定,那么它的最大iops就应该是确定的,最大iops确定,那它每秒的最大吞吐量其实也是确定的。

因为,很明显每秒的吞吐量=每秒的io次数(iops)* 每次读取的数据块大小(io size)

 

指标:

单个IO的大小(IO Chunk Size) 

IOPS(IO per Second)

 传输速度(Transfer Rate)/吞吐率(Throughput)

 IO响应时间(IO Response Time) 

吞吐率 = iops * io chunk size

 

磁盘的 IOPS,也就是在一秒内,磁盘进行多少次 I/O 读写。

磁盘的吞吐量,也就是每秒磁盘 I/O 的流量,即磁盘写入加上读出的数据的大小。

如果一个磁盘确定,那么它的iops和吞吐量最大值是确定的,这是必然的,任何东西都有极值。那么就看场景,某个业务场景下,我们得出的最大iops和io吞吐量是多少

 

当我们要用IOPS来衡量一个IO系统的系能的时候我们一定要说清楚是在什么情况的IOPS,也就是要说明读写的方式(顺序读写还是随机读写)以及单次IO的大小,

比如这样:

对于fio测试工具来说:

IOPS性能测试(4k,4*32队列,随机读写):

读IOPS: 
fio -direct=1 -iodepth=32 -rw=randread  -ioengine=libaio -bs=4k -size=200G -numjobs=4 -runtime=1000 -group_reporting -name=test -filename=/data/test 
写IOPS:   
fio -direct=1 -iodepth=32 -rw=randwrite -ioengine=libaio -bs=4k -size=200G -numjobs=4 -runtime=1000 -group_reporting -name=test -filename=/data/test

当然在实际当中,特别是在OLTP的系统的,随机的小IO的读写是最有说服力的。测试出来的iops数据如下:

详细性能参数

参数RSSD云盘SSD云盘普通云盘本地SSD盘本地普通盘
可选容量(数据盘) 20-32000GB 20-8000GB 20-8000GB 20-1000GB 20-2000GB
随机读 (IOPS) min{1800+50 * 容量,1200000} min{1200+30 * 容量,24000} 1000 80000 8000
随机写 (IOPS) min{1800+50 * 容量,1200000} min{1200+30 * 容量,24000} 1000 15000 8000
顺序读 (MBps) min{120+0.5 * 容量,4800}MBps min{80+0.5 * 容量,260}MBps 100 2000 150
顺序写 (MBps) min{120+0.5 * 容量,4800}MBps min{80+0.5 * 容量,260}MBps 100 1000 150
平均延迟 0.1ms 0.5-3ms 10ms 0.3ms 0.3ms

 

 

IOPS的测试benchmark工具主要有Iometer, IoZone, FIO等。

常见磁盘iops表:

 

posted @ 2022-03-25 19:42  mmgithub123  阅读(96)  评论(0编辑  收藏  举报