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_dir、wal_dir 和 sophia_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 内核的数量是没有用的——唯一的解决方案是确保适当的控制纤维之间的产量。
使用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_dir、wal_dir 和 sophia_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 内核的数量是没有用的——唯一的解决方案是确保适当的控制纤维之间的产量。