summaryrefslogtreecommitdiff
path: root/test/dumpfm/millstone.clj
diff options
context:
space:
mode:
authorScott Ostler <scottbot9000@gmail.com>2010-06-14 18:33:57 -0400
committerScott Ostler <scottbot9000@gmail.com>2010-06-14 18:33:57 -0400
commitcc9a396d87ffbaaa7c4a3f61cd356244bb4faa97 (patch)
tree8847902a2d31827a3cfa6e11e1f9d45e926d65e9 /test/dumpfm/millstone.clj
parent409fa6db8aa74e0f67b20acd6349f2df7516f5f4 (diff)
More millstone features
Diffstat (limited to 'test/dumpfm/millstone.clj')
-rw-r--r--test/dumpfm/millstone.clj102
1 files changed, 67 insertions, 35 deletions
diff --git a/test/dumpfm/millstone.clj b/test/dumpfm/millstone.clj
index e693729..e13ebe3 100644
--- a/test/dumpfm/millstone.clj
+++ b/test/dumpfm/millstone.clj
@@ -33,21 +33,26 @@
(set! *cookies* (merge *cookies* (:cookies res))))
res))
+(defn- success? [resp]
+ (= (:code resp) 200))
+
(defnk do-request! [path
:params nil
- :method :GET]
+ :method "GET"]
(let [[ms resp] (with-timing
- (do-base-request (:server *spec*)
- path
- method
- *cookies*
- params))
+ (try (do-base-request (:server *spec*)
+ path
+ method
+ *cookies*
+ params)
+ (catch Exception e
+ (log (format "Exception for %s - %s" path (.getMessage e)))
+ {:code "?" :msg "EXCEPTION"})))
result {:path path
- :ms ms}]
+ :ms ms
+ :error (if (success? resp) nil [(:code resp) (:msg resp)])}]
(dosync
(commute *results* conj result))
- (if (:cookies resp)
- (log "should set cookies" (:cookies resp)))
resp))
(defn build-client! [spec client-id]
@@ -57,6 +62,9 @@
{:client-id client-id
:cookies *cookies*}))
+(defn join [s lst]
+ (apply str (interpose s lst)))
+
(defn sum [nums]
(reduce + nums))
@@ -64,45 +72,69 @@
(float (/ (sum nums) (count nums))))
(defn print-run-results [spec results elapsed-ms]
- (log (format "\nFinished\n--------\n%s requests in %.02f s (%.02f r/s)\n%s clients"
- (:requests spec)
+ (log (format "\nResults\n--------\n%s requests in %.02fs (%.02f r/s)\n%s clients"
+ (count results)
(/ elapsed-ms 1000)
- (/ (:requests spec) (/ elapsed-ms 1000))
+ (/ (count results) (/ elapsed-ms 1000))
(:clients spec)))
+ (let [avg-in-req (/ (sum (map :ms results)) (:clients spec))]
+ (log (format "\nTime spent in requests per worker : %.02fs (%.02f%%)"
+ (/ avg-in-req 1000)
+ (* (/ avg-in-req elapsed-ms) 100))))
(doseq [[path rs] (group-by :path results)]
- (let [nums (map :ms rs)]
- (log (format "\n%s:\nmin: %.02f ms\navg: %.02f ms\nmax: %.02f ms"
- path
- (apply min nums)
- (avg nums)
- (apply max nums)))))
+ (let [nums (map :ms rs)
+ errors (filter identity (map :error rs))]
+ (log (format "\n%s:\n#: %s\nmin: %.02f ms\navg: %.02f ms\nmax: %.02f ms"
+ path
+ (count rs)
+ (apply min nums)
+ (avg nums)
+ (apply max nums)))
+ (if-let [threshhold (:max-latency spec)]
+ (let [timeouts (count (filter #(> % threshhold)
+ (map :ms rs)))]
+ (if (not (zero? timeouts))
+ (log (format "timeouts: %s (> %sms)" timeouts threshhold)))))
+ (if (not (empty? errors))
+ (log (format "errors: %s (%s)"
+ (count errors)
+ (join " " (sort (set errors))))))))
(log ""))
(defn build-func-list [routes]
(flatten (for [[n f] routes]
(repeat n f))))
+(def num-updates 10)
+
+(defn update-markers [reqs num]
+ (set (map #(int (* % (/ reqs num))) (range 1 (inc num)))))
+
(defn grind! [spec]
(binding [*spec* spec]
- (let [clients (doall
- (for [id (range (:clients spec))]
- (build-client! spec id)))
+ (let [clients (doall
+ (for [id (range (:clients spec))]
+ (build-client! spec id)))
+ reqs (:requests spec)
funcs (build-func-list (:funcs spec))
results (ref [])
- counter (atom (:requests spec))
- threads (doall
- (for [c clients]
- (Thread.
- (fn []
- (binding [*spec* spec
- *cookies* (:cookies c)
- *results* results]
- (loop []
- (if (> (swap! counter dec) 0)
- (let [f (rand-elt funcs)]
- (f)
- (recur)))))))))]
- (println "Finished setup")
+ counter (atom 0)
+ update-on (update-markers reqs num-updates)
+ threads (doall
+ (for [c clients]
+ (Thread.
+ (fn []
+ (binding [*spec* spec
+ *cookies* (:cookies c)
+ *results* results]
+ (loop []
+ (let [c (swap! counter inc)]
+ (if (<= c reqs)
+ (do ((rand-elt funcs))
+ (if (contains? update-on c)
+ (log (format "Completed %s requests" c)))
+ (recur))))))))))]
+ (log "Finished setup")
(let [[elapsed _] (with-timing
(do
(doseq [t threads]