问题描述
检查腾讯云数据库 MongoDB 实例 dirty cache 脏页的比例是否大于cache size 的20%,如果超过20%,用户线程将参与刷盘,阻塞业务的请求。
解决方案
如果cache dirty 持续>20%,说明淘汰压力过大,这个时候用户线程会阻塞参与page 淘汰,请求时延就会增加。
方法一:
1、这个时候可以扩容规格 这个通过扩容内存,来降低由于内存规格太小,cache dirty 过小而导致的频繁触发dirty cache大于20%的可能。
- 登录 MongoDB 控制台。
- 在左侧导航栏 MongoDB 的下拉列表中,选择副本集实例或者分片实例。 副本集实例与分片实例操作类似。
- 在右侧实例列表页面上方,选择地域。
- 在实例列表中,找到目标实例。
- 在目标实例的操作列,在配置调整的下拉列表中,选择配置调整。
- 在配置调整页面,可以重新调整节点内存、节点中容量、Oplog 容量。如下图(以分片实例)所示。
方法二:
建议业务控制并发请求,如果是4.0以上的实例,可以通过下面的参数来优化刷脏能力 1. 将worker线程 刷盘阈值,和 app 线程 刷盘阈值 的间隔调大。尽量避免用户线程参与 2. 调大eviction线程数,利用多核优势,防止刷不过来
建议优化配置:
db.runCommand({"setParameter":1, "wiredTigerEngineRuntimeConfig":"eviction_dirty_target=4,eviction_dirty_trigger=50,eviction_target=60,eviction_trigger=95,eviction_checkpoint_target=5,eviction=(threads_max=16,threads_min=12)"})
注意事项
配置调整可能会产生数据库连接的闪断,留意变更配置时的提醒,并确保程序侧具备断线重连的机制。
参数调整的时候需要结合业务场景,不能盲目调整。