tarantool 长 WAL 写入

tarantool long WAL write

使用tarantool,为什么我记录这个奇怪的消息:

2016-03-24 16:19:58.987 [5803] main/493623/http/XXX.XXX.XXX.XXX:57295 txn.cc:214 W> too long WAL write: 0.527 sec
2016-03-24 16:20:09.841 [5803] main/493714/http/XXX.XXX.XXX.XXX:57346 txn.cc:214 W> too long WAL write: 0.605 sec
2016-03-24 16:20:12.988 [5803] main/493716/http/XXX.XXX.XXX.XXX:57347 txn.cc:214 W> too long WAL write: 1.682 sec
2016-03-24 16:20:15.023 [5803] main/493717/http/XXX.XXX.XXX.XXX:37825 txn.cc:214 W> too long WAL write: 3.373 sec
2016-03-24 16:20:35.145 [5803] main/494145/http/

通过agent-0007直接上门帮助调试,我们发现了几个问题。

其中大部分与缓慢的虚拟环境(使用了 openvz)有关,这表明 io 时序不足。

这个问题也与

有关

此外还有关于慢速磁盘的建议: 如果可能,请尝试将 WAL 和 Tarantool 快照或 Sophia 存储放在不同的磁盘上。

snap_dirwal_dirsophia_dir 选项: http://tarantool.org/doc/book/configuration/index.html#basic-parameters

谢谢。

消息 "too long wal write" 表示在将更新写入 .xlog 文件之间经过了太多时间("too much" 这里表示 "more than specified in Tarantool's configuration parameter too_long_threshold")。

有两个常见原因:1) 磁盘速度慢 2) 应用程序方面的问题。

要找出原因的本质,以 1 秒的间隔启动 atop 并查看 "too long" 事件期间发生的情况: disk util 表示磁盘问题; cpu util 表示应用程序问题。

针对慢速磁盘问题的推荐解决方案是将更改分批写入预写日志,其中每批都包含在单个事务中。这将为您每个事务只写一个磁盘。在这种情况下,您不需要收益(请参阅有关 fiber.yield 的注释)。

典型应用问题如下:

  • 你启动的光纤太多(所以,由于连续的光纤切换,太 在下一次 WAL 写入之前可能会经过很多时间);

  • 你在 time-consuming 操作中没有收益(比如制作完整的 扫描搜索,删除大量记录等)。

产量说明:

  • 您需要使用 fiber.yield() 进行显式收益。
  • 您不需要将 time-consuming 操作移动到专用的 纤维;你也可以在主循环中启动它们,比如 require('fiber') 并且偶尔会在您的程序中产生控制权 循环(虽然不是太频繁,每个指定的时间间隔几次 在 too_long_threshold 中就足够了。

在优化应用程序代码时,请记住一个 Tarantool 实例只能使用一个 CPU 内核,因此增加 CPU 内核的数量是没有用的——唯一的解决方案是确保适当的控制纤维之间的产量。