Play Framework 2.0.2 で負荷をかけるとエラーが出まくる
これは、Play Framework で使用しているAkkaのデフォルト設定による物で、ボディパーサのタイムアウトが1秒に設定されています。
retrieveBodyParserTimeout = 1 second
なので、負荷をかけていって、一つのリクエストが1秒を超えたあたりでタイムアウトのエラーが発生してしまいます。
そこで、Akkaの設定を追加してあげれば良いのですが、どこに追加したら良いかというと
決まりは無い感じですが
confの中にあるapplication.confとか
akka.confを作ってapplication.confでincludeするかとかです。
今回は適当にapplication.confの一番下に付けちゃいます。
[text]play {
akka {
event-handlers = ["akka.event.slf4j.Slf4jEventHandler"]
loglevel = WARNING
actor {
deployment {
/actions {
router = round-robin
<span style="color: #ff0000;">nr-of-instances = 128</span>
}
/promises {
router = round-robin
nr-of-instances = 24
}
}
<span style="color: #ff0000;">retrieveBodyParserTimeout = 120 second</span>
actions-dispatcher = {
fork-join-executor {
<span style="color: #ff0000;">parallelism-factor = 100</span>
<span style="color: #ff0000;">parallelism-max = 512</span>
}
}
promises-dispatcher = {
fork-join-executor {
parallelism-factor = 1.0
parallelism-max = 24
}
}
websockets-dispatcher = {
fork-join-executor {
parallelism-factor = 1.0
parallelism-max = 24
}
}
default-dispatcher = {
fork-join-executor {
parallelism-factor = 1.0
parallelism-max = 24
}
}
}
}
}[/text]
適当にretrieveBodyParserTimeoutですが、適当に120秒と指定してみました。
長すぎですね。。
続いて、負荷をかけていくと、まだCPU、メモリ共にマシンに余裕がありそうな感じなので
Play Frameworkの処理スレッド数を増やしてみました。
actions-dispatcherという所の
parallelism-factorを100に
parallelism-maxを512に
設定してみました。
factorの方は、マシンのCPU数×factorの数値分スレッドを増やしますよ、という設定らしく、これも大きすぎですね。まぁいいや。
で、maxの方は、action-dispatcherでは、最大スレッド数をmaxの値までに制限しますよ、という事らしいです。
ようするに、512スレッドまでしか増えないという感じでしょうか。
スレッド数、いくつがちょうど良いんでしょうね。
環境毎に試行錯誤が必要な気がします。
それにしても、まだCPUには余裕があるのは何故なんだ。。
もう少しくらい負荷がかかっても余裕なのに。。