読者です 読者をやめる 読者になる 読者になる

( ꒪⌓꒪) ゆるよろ日記

( ゚∀゚)o彡°オパーイ!オパーイ! ( ;゚皿゚)ノシΣ フィンギィィーーッ!!!

GAE/JでのScalaのSpinUp時間を計ってみた

scala GAE

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のコードでは、オーバーヘッドが約200cpu_ms。
  • Scala Libray APIを利用する場合で、オーバーヘッドが約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