MongoDB WiredTiger的读/写ticket

发布时间 2023-10-18 10:15:38作者: abce

在WiredTiger中,读/写ticket控制着并发性。也就是说,读/写ticket控制着有多少读写操作可以同时在存储引擎上执行。这是WiredTiger特有的设置,因此不会影响数据库中并发操作的数量。MongoDB有单独的机制来保存操作进度,可以退让给其他操作。

 

默认值

读/写ticket的默认值都是128。这个值足够大,以至于在典型的服务器硬件上,WiredTiger的并发性不会成为瓶颈。

由于这些设置的值限制了并发操作,因此我们有理由认为,增加 WiredTiger 的读/写ticket将减轻操作队列压力。

然而,在大多数情况下,WiredTiger并发性只是队列压力的症状,而不是原因。在这种情况下,增加WiredTiger的读/写ticket数量会导致系统其他部分(如 CPU 和 I/O)的排队情况比正常情况更不可控。

 

读/写ticket数量耗尽

当可用读/写ticket数降为零时,并发运行的操作数等于配置的读/写值。这意味着任何其他操作都必须等到其中一个运行线程完成其在存储引擎上的工作后才能执行。

在大多数情况下,读/写ticket数降为零表示负载增加或性能缓慢(例如硬件速度慢或查询索引不佳),导致操作运行时间比预期长很多。

长时间运行的操作可能会导致可用ticket数量减少,从而降低系统并发性。例如,如果读取ticket数量在减少,那么很有可能存在一些长期运行的缺乏索引的操作。如果想找出哪些操作速度较慢,可以使用第三方工具。可以根据系统的需要调整ticket的增减,并确定对性能的影响

 

更改读/写ticket的默认值

只有在经过全面评估后,才建议更改读/写ticket的值。在不是问题原因的情况下增加读/写ticket可能会导致性能持续下降。将值改为太大的数字(远高于可用内核)还可能迫使 CPU 将更多时间用于执行昂贵的上下文切换,而不是实际工作。这将导致吞吐量下降,队列压力增加。

 

查看tickets的使用情况

> db.serverStatus().wiredTiger.concurrentTransactions
{
  write: { out: 0, available: 128, totalTickets: 128 },
  read: { out: 0, available: 128, totalTickets: 128 }
}

 

修改ticket的值

可以动态修改,不需要重启实例

db.adminCommand( { setParameter: 1,
   wiredTigerConcurrentReadTransactions: xx } )
db.adminCommand( { setParameter: 1,
   wiredTigerConcurrentWriteTransactions: xx } )