基准测试+线上监控图形+报警阈值
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 | 测试生成文件的大小 | ||||||||||
|
对于一个磁盘来说,读取的size大小确定,那么它的最大iops就应该是确定的,最大iops确定,那它每秒的最大吞吐量其实也是确定的。
因为,很明显每秒的吞吐量=每秒的io次数(iops)* 每次读取的数据块大小(io size)
指标:
传输速度(Transfer Rate)/吞吐率(Throughput)
吞吐率 = 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表:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通