可以监控STM的争用级别吗?

vem*_*emv 7 clojure stm

有没有办法来评估Clojure的STM交易是否正在重试,以及以什么速度进行?

liw*_*iwp 2

您可以观察history countref 的 ,这将表明存在争用:

user=> (def my-ref (ref 0 :min-history 1))
#'user/my-ref
user=> (ref-history-count my-ref)
0
user=> (dosync (alter my-ref inc))
1
user=> (ref-history-count my-ref)
1
Run Code Online (Sandbox Code Playgroud)

历史计数并不直接代表争用。相反,它表示为了服务并发读取而维护的过去值的数量。

历史记录的大小受minmax值的限制。默认情况下,它们分别是010,但您可以在创建时更改它们ref(见上文)。由于默认min-history情况下0,您通常不会看到ref-history-count返回非零值,除非引用存在争用。

在此处查看更多讨论history counthttps://groups.google.com/forum/?fromgroups #!topic/clojure/n_MKCoa870o

我认为目前没有任何方法clojure.core可以观察STM交易的速率。你当然可以做一些类似于 @Chouser 在他的历史压力测试中所做的事情:

(dosync
    (swap! try-count inc)
    ...)
Run Code Online (Sandbox Code Playgroud)

即在事务内增加一个计数器。每次尝试交易时都会发生增量。如果try-count大于1,则重试事务。