有沒有什麼辦法可以調查Clojure的STM交易是否正在重試,並且以什麼比率?可以監視STM的爭用級別嗎?
7
A
回答
2
你可以觀察一個參考,這將表明,有競爭就可以了history count
:
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
歷史計數並不直接代表爭。相反,它代表爲維護併發讀取而保留的過去值的數量。
歷史記錄的大小受限於min
和max
值。默認情況下,分別爲0
和10
,但創建ref
時可以更改它們(請參閱上文)。由於min-history
默認爲0
,因此除非參考文件上存在爭用,否則通常不會看到ref-history-count
返回非零值。
查看history count
這裏更多的討論:https://groups.google.com/forum/?fromgroups#!topic/clojure/n_MKCoa870o
我不認爲有什麼辦法,由clojure.core
提供,此刻,觀察STM交易的速度。當然,你可以做類似於@Chouser他history stress test做了一些:
(dosync
(swap! try-count inc)
...)
即遞增事務中的計數器。每次嘗試交易時都會發生增量。如果try-count
大於1
,則交易被重試。
+0
沒有想過使用歷史數量或txs內的原子。感謝您的建議! – vemv
2
通過引入命名dosync塊和提交計數(名爲dosync成功次數),可以很容易地保持時間線程軌道已重試給定的事務。
(def ^{:doc "ThreadLocal<Map<TxName, Map<CommitNumber, TriesCount>>>"}
local-tries (let [l (ThreadLocal.)]
(.set l {})
l))
(def ^{:doc "Map<TxName, Int>"}
commit-number (ref {}))
(def history ^{:doc "Map<ThreadId, Map<TxName, Map<CommitNumber, TriesCount>>>"}
(atom {}))
(defn report [_ thread-id tries]
(swap! history assoc thread-id tries))
(def reporter (agent nil))
(defmacro dosync [tx-name & body]
`(clojure.core/dosync
(let [cno# (@commit-number ~tx-name 0)
tries# (update-in (.get local-tries) [~tx-name] update-in [cno#] (fnil inc 0))]
(.set local-tries tries#)
(send reporter report (.getId (Thread/currentThread)) tries#))
[email protected]
(alter commit-number update-in [~tx-name] (fnil inc 0))))
考慮下面的例子...
(def foo (ref {}))
(def bar (ref {}))
(defn x []
(dosync :x ;; `:x`: the tx-name.
(let [r (rand-int 2)]
(alter foo assoc r (rand))
(Thread/sleep (rand-int 400))
(alter bar assoc (rand-int 2) (@foo r)))))
(dotimes [i 4]
(future
(dotimes [i 10]
(x))))
... @history
計算結果爲:
;; {thread-id {tx-name {commit-number tries-count}}}
{40 {:x {3 1, 2 4, 1 3, 0 1}}, 39 {:x {2 1, 1 3, 0 1}}, ...}
0
這額外的實施基本上是簡單的。
;; {thread-id retries-of-latest-tx}
(def tries (atom {}))
;; The max amount of tries any thread has performed
(def max-tries (atom 0))
(def ninc (fnil inc 0))
(def reporter (agent nil))
(defn report [_ tid]
(swap! max-tries #(max % (get @tries tid 0)))
(swap! tries update-in [tid] (constantly 0)))
(defmacro dosync [& body]
`(clojure.core/dosync
(swap! tries update-in [(.getId (Thread/currentThread))] ninc)
(commute commit-id inc)
(send reporter report (.getId (Thread/currentThread)))
[email protected]))
相關問題
- 1. Mockito可以模擬包級別可視化界面嗎?
- 2. Clojure的STM模型可以用於多個JVM嗎?
- 3. 可以訪問Clojure的STM的值歷史嗎?
- 4. 我可以監視對VisualBasic 6 ActiveX控件的COM調用嗎?
- 5. 我可以使用api級別低於9的DownloadManager類嗎?
- 6. 使用Spring可以確定控制器級別的sessionFactory嗎?
- 7. Netcool可以監視Tomcat 6.0
- 8. 我們可以將iphone sdk 3.1升級到更高級別嗎?
- 9. 可以使用Jconsole來監視IBM JDK嗎?
- 10. 可以監視條件是一個方法調用嗎?
- 11. 可以狡猾地監視Grails應用程序嗎?
- 12. 在純HTML5中可以使用高級可視化編程嗎?
- 13. 我可以監視線程的消息隊列的大小嗎?
- 14. 在戰爭級別初始化,戰爭的「主要」
- 15. 可以使用JMX監視TIBCO Rendzevous
- 16. 在Vista上調用CoCreateInstance時可以降低權限級別嗎?
- 17. 我們可以在用戶級別註冊圖標疊加嗎?
- 18. 可以在目錄級別使用php.ini文件嗎?
- 19. 春季安全ACL可以應用於域類級別嗎?
- 20. WMIC可以用來設置UAC級別嗎?
- 21. 我可以使用屬性ReDim模塊級別數組嗎?
- 22. 我可以在API級別19中調用Bundle#putString方法嗎?
- 23. 我可以監視JSF/Seam中的隱藏值更改嗎?
- 24. 我可以監視HTML DIV上的更改嗎?
- 25. 我可以監視Linux上的文件重命名事件嗎?
- 26. 泄漏活動監視器可靠嗎?
- 27. 我可以在3級或更多級別使用一個對象嗎?
- 28. D3中父級/子級別中的多級映射可能嗎?
- 29. 我可以更改Oracle中的隔離級別嗎?
- 30. 我們可以指定確切的winston級別登錄嗎?
參見:http://stackoverflow.com/questions/4792197/how-can-i-see-the-number-of-rollbacks-in-my-stm-in-clojure – noahlz