【问题标题】:How to discover if a transaction is frequently aborting?如何发现事务是否经常中止?
【发布时间】:2015-11-11 23:40:07
【问题描述】:

我正在尝试调试使用 STM 的程序。正如您在此处看到的,ThreadScope 读数指出了非常高的 CPU 活动:

所以我试图找出这是否是由于经常中止的事务而发生的。我想到的第一件事就是用这样的东西来测试:

atomically $ do
  someWork 
  ...
`orElse` do
  unsafeIOToSTM $ traceEventIO "transaction aborted!"
  retry

但我不确定这是否正确,或者这是否是在 STM 场景中进行调试的最佳方法。有什么想法吗?

【问题讨论】:

  • 这也是我的做法。
  • 您从这种方法中得到了什么结果?
  • 没有痕迹。如果此方法正确,则不会中止任何事务。

标签: haskell ghc stm


【解决方案1】:

使用stm-stats 包。它提供了您应该使用的trackSTM 而不是atomically,而dumpSTMStats :: IO () 将提供如下内容:

STM transaction statistics (2011-10-09 12:28:37.188951 UTC):
Transaction     Commits    Retries      Ratio
_anonymous_           1          0       0.00
reader                1         23      23.00
writer               23          0       0.00

(交易名称会自动生成,但有助手可以自己设置。)

【讨论】:

  • 抱歉,回复延迟太久。这个包好像很久没有更新了。我会看看他们如何检查重试。谢谢!
  • 我不会担心缺少更新: 1) Joachim,维护者,在社区中很有名; 2) 包在 Stackage LTS 中,这意味着它至少可以构建。
  • 刚刚有时间测试stm-stats,它运行良好!问题确实是交易经常中止。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-02
  • 2013-07-15
相关资源
最近更新 更多