GAE/JでのScalaのSpinUp時間を計ってみた
GAE/JでのScalaのSpinUp時間を計ってみました。
appengine ja night #6 Beer Talk : ATNDでLTしたときに言っちゃいましたのでね。
java-ja温泉第2回の成果その1ですお。
測定方法
測定パターンは以下の4パターンです。
simplescala | Scalaで書いた単純なFilterで、Responseに直に"Hello World"を出力 |
listscala | Scalaで書いた単純なFilterで、Listを使って1から10までResponseに直に出力 |
slim3scala | ScalaでSlim3のControllerを用意し、Responseに直に"Hello World"を出力 |
slim3listscala | ScalaでSlim3のControllerを用意し、Listを使って1から10までResponseに直に出力 |
単純なコードだと、コンパイルした結果のclassファイルがJavaとあまり変わらなくなると思われたので、Listを使ってScala Library APIを使うパターンも用意しました。
これらのパターンを同じApplicationIDで、それぞれ違うバージョンにデプロイしてクライアントから3分おきにcurlでリクエストを計50回投げて、ログに記録されたcpu_msを集計してみました。
測定結果
測定結果:
app | ave | max | min | overhead |
---|---|---|---|---|
simplescala | 896cpu_ms | 971cpu_ms | 777cpu_ms | 196cpu_ms |
listscala | 1224cpu_ms | 1341cpu_ms | 1088cpu_ms | 524cpu_ms |
slim3scala | 1323cpu_ms | 1458cpu_ms | 1225cpu_ms | 623cpu_ms |
slim3listscala | 1688cpu_ms | 1827cpu_ms | 1458cpu_ms | 988cpu_ms |
結果を見ると、最も単純なパターンでは約900cpu_msで、素のJava Servletの約700cpu_msから200cpu_ms程度のオーバーヘッドです。
Listを用いた場合は約1200cpu_msで、500cpu_msのオーバーヘッドです。これは、Scala Libray APIのjarファイルからのクラスロードがオーバーヘッドになっていると思われます。
ActorやSwingなどGAEで使えないパッケージをjarから削除してスリムにすれば、これは多少の改善が見込まれるかもしれません。今度試してみます。
slim3をscalaから使った場合の最も単純なケースでは約1300cpu_ms、slim3が約1100cpu_msですので200cpu_msのオーバーヘッド。最初のパターンと同じですね。
slim3とscalaで、Listを使ってScala Libray APIを使った場合では約1700cpu_ms。Slim3からの差が約600cpu_ms。
この結果からわかることは、
現実問題、Scala Libray APIを利用しないことはないので、Scalaを使う場合のオーバーヘッドは約600cpu_msである、と言えるでしょう。
この程度であれば許容範囲だと思いますので、GAE/JでのScalaは充分に実用に耐えると思います。
現時点で、ScalaのWebフレームワークLiftは、SpinUp時間は7,8秒らしく、しかもFunctionMappingでサーバ側のセッションに状態を持ってしまうため、インスタンスがSpinUpしたタイミングで異なるサーバにリクエストが振られてしまう場合はエラーが起きる可能性がある、という問題もあり、実用的ではありません。
GAEでScalaを使う場合でも、やはりSlim3が最も適しているのではないでしょうか。
測定に使用したコードはこれです。
yuroyoro/scala-spinup-check · GitHub
@shin1ogawaさんの測定方法を参考にさせてもらいました。
参考:
404 shin1のつぶやき ないわー Not Found: slim3と素のJavaで #appengine のspinupを比較してみた
App Engineではどの言語を使えばいいのか - Hyper Great Creator やすを
測定結果のログ:
simplescala --------------------------------------- max : 971cpu_ms min : 777cpu_ms ave : 896cpu_ms --------------------------------------- 0 : 894 1 : 894 2 : 913 3 : 913 4 : 933 5 : 952 6 : 952 7 : 913 8 : 913 9 : 875 10 : 933 11 : 816 12 : 913 13 : 913 14 : 855 15 : 875 16 : 855 17 : 875 18 : 855 19 : 816 20 : 952 21 : 952 22 : 933 23 : 875 24 : 971 25 : 875 26 : 913 27 : 835 28 : 894 29 : 855 30 : 894 31 : 894 32 : 777 33 : 952 34 : 933 35 : 933 36 : 933 37 : 913 38 : 913 39 : 933 40 : 913 41 : 875 42 : 875 43 : 855 44 : 875 45 : 894 46 : 933 47 : 894 48 : 913 49 : 796 listscala --------------------------------------- max : 1341cpu_ms min : 1088cpu_ms ave : 1224cpu_ms --------------------------------------- 0 : 1341 1 : 1244 2 : 1302 3 : 1244 4 : 1225 5 : 1205 6 : 1263 7 : 1225 8 : 1127 9 : 1263 10 : 1166 11 : 1166 12 : 1263 13 : 1244 14 : 1088 15 : 1225 16 : 1108 17 : 1185 18 : 1225 19 : 1185 20 : 1263 21 : 1185 22 : 1166 23 : 1263 24 : 1225 25 : 1146 26 : 1146 27 : 1263 28 : 1302 29 : 1341 30 : 1263 31 : 1205 32 : 1302 33 : 1283 34 : 1244 35 : 1263 36 : 1321 37 : 1283 38 : 1302 39 : 1244 40 : 1225 41 : 1108 42 : 1146 43 : 1185 44 : 1185 45 : 1283 46 : 1225 47 : 1127 48 : 1244 49 : 1263 50 : 1166 slim3scala --------------------------------------- max : 1458cpu_ms min : 1225cpu_ms ave : 1323cpu_ms --------------------------------------- 0 : 1400 1 : 1302 2 : 1341 3 : 1380 4 : 1380 5 : 1302 6 : 1438 7 : 1321 8 : 1283 9 : 1263 10 : 1321 11 : 1321 12 : 1263 13 : 1321 14 : 1225 15 : 1341 16 : 1321 17 : 1321 18 : 1341 19 : 1321 20 : 1321 21 : 1360 22 : 1341 23 : 1458 24 : 1360 25 : 1263 26 : 1225 27 : 1244 28 : 1360 29 : 1321 30 : 1283 31 : 1302 32 : 1302 33 : 1419 34 : 1360 35 : 1360 36 : 1283 37 : 1321 38 : 1341 39 : 1360 40 : 1400 41 : 1225 42 : 1321 43 : 1341 44 : 1263 45 : 1263 46 : 1380 47 : 1244 48 : 1302 49 : 1438 50 : 1244 slim3listscala --------------------------------------- max : 1827cpu_ms min : 1458cpu_ms ave : 1688cpu_ms --------------------------------------- 0 : 1691 1 : 1458 2 : 1671 3 : 1710 4 : 1691 5 : 1671 6 : 1730 7 : 1671 8 : 1594 9 : 1633 10 : 1652 11 : 1652 12 : 1633 13 : 1710 14 : 1613 15 : 1769 16 : 1594 17 : 1594 18 : 1691 19 : 1788 20 : 1769 21 : 1691 22 : 1730 23 : 1594 24 : 1769 25 : 1613 26 : 1633 27 : 1691 28 : 1730 29 : 1750 30 : 1788 31 : 1827 32 : 1808 33 : 1730 34 : 1458 35 : 1730 36 : 1633 37 : 1730 38 : 1827 39 : 1575 40 : 1691 41 : 1730 42 : 1730 43 : 1730 44 : 1710 45 : 1710 46 : 1788 47 : 1652