クライアントとサーバーの通信に Akka を使用することを考えており、データ転送のベンチマークを試みています。現在、各メッセージが 8 つの文字列フィールドを持つケース クラスである 100 万のメッセージを送信しようとしています。
現時点では、許容できるパフォーマンスを得るのに苦労しています。クライアントとサーバーで約 600KB/s の転送速度とアイドル状態の CPU が見られるため、何か問題が発生しています。多分それは私たちのネット設定です。
これは私たちの akka 設定です
Server {
akka {
extensions = ["akka.contrib.pattern.ClusterReceptionistExtension"]
loggers = ["akka.event.slf4j.Slf4jLogger"]
loglevel = "DEBUG"
logging-filter = "akka.event.slf4j.Slf4jLoggingFilter"
log-dead-letters = 10
log-dead-letters-during-shutdown = on
actor {
provider = "akka.cluster.ClusterActorRefProvider"
}
remote {
enabled-transports = ["akka.remote.netty.tcp"]
netty.tcp {
hostname = "instance.myserver.com"
port = 2553
maximum-frame-size = 1000 MiB
send-buffer-size = 2000 MiB
receive-buffer-size = 2000 MiB
}
}
cluster {
seed-nodes = ["akka.tcp://server@instance.myserver.com:2553"]
roles = [master]
}
contrib.cluster.receptionist {
name = receptionist
role = "master"
number-of-contacts = 3
response-tunnel-receive-timeout = 300s
}
}
}
Client {
akka {
loggers = ["akka.event.slf4j.Slf4jLogger"]
loglevel = "DEBUG"
logging-filter = "akka.event.slf4j.Slf4jLoggingFilter"
actor {
provider = "akka.remote.RemoteActorRefProvider"
}
remote {
enabled-transports = ["akka.remote.netty.tcp"]
netty.tcp {
hostname = "127.0.0.1"
port = 0
maximum-frame-size = 1000 MiB
send-buffer-size = 2000 MiB
receive-buffer-size = 2000 MiB
}
}
cluster-client {
initial-contacts = ["akka.tcp://server@instance.myserver.com:2553/user/receptionist"]
establishing-get-contacts-interval = "10s"
refresh-contacts-interval = "10s"
}
}
}
アップデート:
最後に、シリアライゼーションに関する議論 (以下を参照) にもかかわらず、ペイロードを変換してバイト配列を使用するようにしました。これにより、シリアライゼーションはテストに影響しません。jeroMQ を使用した 24 GB RAM のコア i7 (つまり、Java で再実装された zeroMQ - まだ最速ではない) で、生の akka (つまり、zeroMQ プラグインなし) で約 200k メッセージ/秒または約 20 MB/秒が一貫して見られることがわかりました。約 10k メッセージ/秒、つまり 1MB/秒弱でした。akka + zeroMQ を試してみると、パフォーマンスが悪化しました。