diff options
| author | Scott Ostler <scottbot9000@gmail.com> | 2010-06-14 18:33:57 -0400 |
|---|---|---|
| committer | Scott Ostler <scottbot9000@gmail.com> | 2010-06-14 18:33:57 -0400 |
| commit | cc9a396d87ffbaaa7c4a3f61cd356244bb4faa97 (patch) | |
| tree | 8847902a2d31827a3cfa6e11e1f9d45e926d65e9 /test/dumpfm | |
| parent | 409fa6db8aa74e0f67b20acd6349f2df7516f5f4 (diff) | |
More millstone features
Diffstat (limited to 'test/dumpfm')
| -rw-r--r-- | test/dumpfm/millstone.clj | 102 |
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] |
