Tarantool长WAL写入

4
使用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/
2个回答

3
消息“too long wal write”的意思是在写入更新到.xlog文件时耗费了太长时间(这里的“太长”指的是超过Tarantool配置参数 too_long_threshold中指定的时间)。
有两个常见原因:1)慢磁盘 2)应用程序方面的问题。
为了确定原因,可以使用1秒间隔启动atop,并检查“too long”事件期间发生了什么:disk util表示磁盘问题;cpu util表示应用程序问题。
对于慢磁盘问题的推荐解决方案是将更改批量写入预写式日志,在单个事务中包装每个批次。这将为您提供每个事务一个磁盘写入。在这种情况下,您将不需要使用yield(有关fiber.yield的说明请参见下文的注释)。
典型的应用问题如下:
  • 您启动了太多的纤程(因此,由于连续的纤程切换,在下一次 WAL 写入之前可能会花费太多时间);

  • 在耗时操作中没有进行任何 yield 操作(例如进行完整扫描搜索、删除大量记录等)。

有关 yield 的说明:

  • 您需要使用 fiber.yield() 进行显式 yield。
  • 您不需要将耗时操作移动到专用的纤程中;您也可以在主循环中启动它们,例如 require('fiber') 并偶尔在程序周期内进行控制 yield(不要太频繁,每个指定间隔的时间执行几次是足够的)。

在优化应用程序代码时,请记住一个 Tarantool 实例只能利用一个 CPU 核心,因此增加 CPU 核心数量是无用的 —— 唯一的解决方案是确保纤程之间进行适当的控制 yield。


3

在与代理-0007的现场直接帮助和调试后,我们发现了几个问题。

大部分问题都与缓慢的虚拟环境(使用openvz)有关,这表现为不充分的io时间。

此问题也与Tarantool sphia make slow selects?有关。

此外,对于缓慢的磁盘,有以下建议: 如果可能,请将WAL、Tarantool快照或Sophia存储放置在单独的磁盘上。

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

谢谢。


谢谢您的回复。 - agent-0007

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接