7
votes

Peut-on surveiller le niveau de contention de STM?

Y a-t-il un moyen de sonder si les transactions STM de Clojure sont en cours de récupération et à quel taux?


3 Réponses :


2
votes

Vous pouvez observer le nombre d'historique code> d'une référence qui indiquera qu'il y aura de la conflit:

(dosync
    (swap! try-count inc)
    ...)


1 commentaires

Jamais pensé à utiliser le nombre d'historique, ni des atomes au sein de TXS. Merci pour les suggestions!



2
votes

en introduisant nommé des blocs dosync em> et commettes em> (Times une DOSYNC nommée a réussi), on peut très facilement garder une trace des threads des temps a réessayé une transaction donnée .

;; {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 commentaires

0
votes

Cette implémentation supplémentaire est sensiblement plus simple.

;; {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)))
    ~@body))


0 commentaires