3

6 ノードの Cassandra クラスターで Clojure の Alia のパフォーマンスをテストしています。マルチスレッドの場合でも、約 400 書き込み/秒しか取得できません。Firebrand Cassandra ドライバーと Java で手動でスレッドを処理することにより、96 スレッドで毎秒 5000 回の書き込みを実現できます。

ここでのエージェントの使用に何か問題がありますか? これが実行されているマシンの CPU 使用率はわずか 25% で、非常に低いようです。

更新: Alia の提案の著者によると、生のステートメントの代わりに準備されたステートメントを利用することで、同期シングルスレッド方式で最大 2500/秒の利益が実現しました。Clojure でマルチスレッド化し、Alia/基盤となる Java ドライバーに組み込まれている非同期関数を個別に利用して、どちらが高速かを確認することで、これをテストする必要があります。

更新 2: ドライバーに組み込まれている非同期機能をさらに利用することで、以下の mpenet と同様の結果が得られるようになりました。

(ns alia-perf-test.core
  (:gen-class)
  (:require [qbits.alia :as alia]
            [qbits.hayt :as hayt]))

(defn exec-query [session query]
  (alia/execute session (hayt/->raw query)))

(defmacro time-query
  [expr]
  `(let [start# (. System (nanoTime))
         ret# ~expr]
     (/ (double (- (. System (nanoTime)) start#)) 1000000.0)))

(defn write-entity
  [total-time session entity]
  (let [query (hayt/->raw (hayt/insert :entities (hayt/values entity) (hayt/using :timestamp 1234)))
        query-time (time-query (alia/execute session query))]
      (+ total-time query-time)))

(defn generate-entity []
  {:id (str (java.util.UUID/randomUUID)) :num 0})

(defn write-something
  [write-agent session]
  (send-off write-agent write-entity
        session 
        (generate-entity)))

(defn -main [& args]
  (let [cluster (alia/cluster ["server1"
                               "server2" 
                               "server3" 
                               "server4" 
                               "server5" 
                               "server6"]
                              :pooling-options {:core-connections-per-host [:local 16 :remote 16]
                                                :max-connections-per-host  [:local 1000 :remote 1000]
                                                :max-simultaneous-requests-per-connection [:local 32 :remote 32]
                                                :min-simultaneous-requests-per-connection [:local 16 :remote 16]})
        session (alia/connect cluster)]
    (alia/set-consistency! :any)
    (exec-query session (hayt/create-keyspace :aliaperftest
                                              (hayt/with {:replication
                                                          {:class "NetworkTopologyStrategy"
                                                           :dc1 3 :dc2 3}})))
    (exec-query session (hayt/use-keyspace :aliaperftest))
    (exec-query session (hayt/create-table :entities
                                           (hayt/column-definitions {:id :varchar
                                                                     :num :int
                                                                     :primary-key [:id]})))
    (let [num-entities 10000
          write-agent (agent 0)]
      (dotimes [n num-entities]
        (write-something write-agent session))
      (await write-agent)
      (println "Wrote" num-entities "entities in" @write-agent "ms -"
           (* (/ num-entities @write-agent) 1000.0) "ops/sec"))

    (exec-query session (hayt/drop-table :entities))
    (exec-query session (hayt/drop-keyspace :aliaperftest))
    (alia/shutdown session)
    (alia/shutdown cluster)
    (shutdown-agents)))
4

1 に答える 1

0

更新: 非同期モードで 8 秒以内に 100,000 件のリクエストを処理し (エイリアスの成功ハンドラーを使用して、単一のノードで)、atom を使用して結果を受け取り、すべての応答が到着するのを待ちます。

セットアップとバッチ処理に応じてカスタム executor を使用することで、パフォーマンスをさらに引き出すことも可能かもしれませんが、私はそこまで行っていません。参照: https://github.com/mpenet/alia/blob/master/docs/guide.md#executors

于 2013-03-01T22:04:06.867 に答える