Google App Engine のインスタンス生存時間

Google App Engine では負荷の状況によってインスタンスの数を自動的に調整してくれるわけですが、数秒アイドルしただけでインスタンスが落とされるのか、数分程度は許されるのか、興味があるところです。

ということで、GAE/J のインスタンスがどの程度保持されるかの簡単な実験をしてみました。
(詳細は付録に参照のこと)

実行結果

アクセスインスタンスの状態
初回初期インスタンス生成
10秒後初期インスタンスのまま
20秒後初期インスタンスのまま
30秒後初期インスタンスのまま
40秒後初期インスタンスのまま
50秒後初期インスタンスのまま
60秒後初期インスタンスのまま
2分後初期インスタンスのまま
3分後初期インスタンスのまま
4分後初期インスタンスのまま
5分後新規インスタンス生成
10分後新規インスタンス生成

上記の結果から、5分という時間が怪しいですね。

ということで、最終アクセスから4分50秒後と5分10秒後のアクセスを何度か試行してみました。

実行結果

アクセスインスタンスの状態
初回初期インスタンス生成
4分50秒後(1回目)初期インスタンスのまま
5分10秒後(1回目)新規インスタンス生成
4分50秒後(2回目)新規インスタンス生成
5分10秒後(2回目)新規インスタンス生成
4分50秒後(3回目)初期インスタンスのまま
5分10秒後(3回目)新規インスタンス生成

微妙な結果になりました。

1回だけですが、最終アクセスから4分50秒後のアクセスでも新規にインスタンスが生成されています。

最終アクセスからインスタンスがシャットダウンされるまでの時間は5分前後かつあまり厳密ではないということでしょうか。

ということで、今度は最終アクセスから4分後と6分秒後のアクセスを10回ずつ試行してみました。

実行結果(4分後)

アクセスインスタンスの状態
4分後(1回目)初期インスタンスのまま
4分後(2回目)初期インスタンスのまま
4分後(3回目)初期インスタンスのまま
4分後(4回目)初期インスタンスのまま
4分後(5回目)新規インスタンス生成
4分後(6回目)初期インスタンスのまま
4分後(7回目)初期インスタンスのまま
4分後(8回目)初期インスタンスのまま
4分後(9回目)初期インスタンスのまま
4分後(10回目)初期インスタンスのまま

実行結果(6分後)

6分後(1回目)初期インスタンスのまま
6分後(2回目)新規インスタンス生成
6分後(3回目)新規インスタンス生成
6分後(4回目)新規インスタンス生成
6分後(5回目)新規インスタンス生成
6分後(6回目)新規インスタンス生成
6分後(7回目)新規インスタンス生成
6分後(8回目)新規インスタンス生成
6分後(9回目)初期インスタンスのまま
6分後(10回目)初期インスタンスのまま

これまた、微妙な結果ですね、、、。

最終アクセス時刻から約4分後の場合と約6分後の場合で、新規インスタンス生成の頻度に明らかな差が出たということは言えると思います。

上記までのデータから言えることは、『約5分間アクセスがないインスタンスはシャットダウンされる可能性が高い』ということでしょうか、、、。



付録

GoogleAppEngine 側の Servlet
public class Initialize_testServlet extends HttpServlet {
private static final Date initDate = new Date();
private static String initialDateStr = new SimpleDateFormat("yyyyMMdd hh:mm:ss.SSS").format(initDate);
private static int count = 1;
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
Date currentDate = new Date();
String currentDateStr = new SimpleDateFormat("yyyyMMdd hh:mm:ss.SSS").format(currentDate);
long uptime = currentDate.getTime() - initDate.getTime();
resp.setContentType("text/plain");
resp.getWriter().println("Initial Date = " + initialDateStr + "\nCurrent Date = " + currentDateStr + "\nuptime = " + uptime + "\ncount = " + (count++));
}
}

呼び出し側の groovy スクリプト1

int[] intervals = [0, 10, 20, 30, 40, 50, 60, 120, 180, 240, 300, 600]
intervals.each{
sleep(it * 1000);
println(new URL("http://.appspot.com/initialize_test").text)
}

実行結果1

Initial Date = 20100324 01:10:04.736
Current Date = 20100324 01:10:04.737
uptime = 1
count = 1

Initial Date = 20100324 01:10:04.736
Current Date = 20100324 01:10:16.141
uptime = 11405
count = 2

Initial Date = 20100324 01:10:04.736
Current Date = 20100324 01:10:36.676
uptime = 31940
count = 3

Initial Date = 20100324 01:10:04.736
Current Date = 20100324 01:11:07.177
uptime = 62441
count = 4

Initial Date = 20100324 01:10:04.736
Current Date = 20100324 01:11:48.297
uptime = 103561
count = 5

Initial Date = 20100324 01:10:04.736
Current Date = 20100324 01:12:39.432
uptime = 154696
count = 6

Initial Date = 20100324 01:10:04.736
Current Date = 20100324 01:13:40.550
uptime = 215814
count = 7

Initial Date = 20100324 01:10:04.736
Current Date = 20100324 01:15:42.093
uptime = 337357
count = 8

Initial Date = 20100324 01:10:04.736
Current Date = 20100324 01:18:42.732
uptime = 517996
count = 9

Initial Date = 20100324 01:10:04.736
Current Date = 20100324 01:22:43.184
uptime = 758448
count = 10

Initial Date = 20100324 01:27:45.387
Current Date = 20100324 01:27:45.388
uptime = 1
count = 1

Initial Date = 20100324 01:37:47.074
Current Date = 20100324 01:37:47.075
uptime = 1
count = 1

呼び出し側の groovy スクリプト2

int[] intervals = [0, 290, 310, 290, 310, 290, 310]
intervals.each{
sleep(it * 1000);
println(new URL("http://.appspot.com/initialize_test").text)
}

実行結果2

Initial Date = 20100324 01:45:59.017
Current Date = 20100324 01:45:59.018
uptime = 1
count = 1

Initial Date = 20100324 01:45:59.017
Current Date = 20100324 01:50:49.644
uptime = 290627
count = 2

Initial Date = 20100324 01:56:02.002
Current Date = 20100324 01:56:02.003
uptime = 1
count = 1

Initial Date = 20100324 02:00:53.746
Current Date = 20100324 02:00:53.748
uptime = 2
count = 1

Initial Date = 20100324 02:06:06.200
Current Date = 20100324 02:06:06.200
uptime = 0
count = 1

Initial Date = 20100324 02:06:06.200
Current Date = 20100324 02:10:57.901
uptime = 291701
count = 2

Initial Date = 20100324 02:16:09.484
Current Date = 20100324 02:16:09.485
uptime = 1
count = 1

呼び出し側の groovy スクリプト2

int[] intervals = [0, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360]
intervals.each{
sleep(it * 1000);
println(new URL("http://.appspot.com/initialize_test").text)
}

実行結果3

Initial Date = 20100324 04:24:52.316
Current Date = 20100324 04:24:52.317
uptime = 1
count = 1

Initial Date = 20100324 04:24:52.316
Current Date = 20100324 04:28:54.485
uptime = 242169
count = 2

Initial Date = 20100324 04:24:52.316
Current Date = 20100324 04:32:55.286
uptime = 482970
count = 3

Initial Date = 20100324 04:24:52.316
Current Date = 20100324 04:36:55.806
uptime = 723490
count = 4

Initial Date = 20100324 04:24:52.316
Current Date = 20100324 04:40:57.665
uptime = 965349
count = 5

Initial Date = 20100324 04:45:01.927
Current Date = 20100324 04:45:01.928
uptime = 1
count = 1

Initial Date = 20100324 04:45:01.927
Current Date = 20100324 04:49:04.288
uptime = 242361
count = 2

Initial Date = 20100324 04:45:01.927
Current Date = 20100324 04:53:06.267
uptime = 484340
count = 3

Initial Date = 20100324 04:45:01.927
Current Date = 20100324 04:57:08.374
uptime = 726447
count = 4

Initial Date = 20100324 04:45:01.927
Current Date = 20100324 05:01:11.439
uptime = 969512
count = 5

Initial Date = 20100324 04:45:01.927
Current Date = 20100324 05:05:13.838
uptime = 1211911
count = 6

Initial Date = 20100324 04:45:01.927
Current Date = 20100324 05:11:16.103
uptime = 1574176
count = 7

Initial Date = 20100324 05:17:19.835
Current Date = 20100324 05:17:19.836
uptime = 1
count = 1

Initial Date = 20100324 05:23:24.557
Current Date = 20100324 05:23:24.559
uptime = 2
count = 1

Initial Date = 20100324 05:23:24.557
Current Date = 20100324 05:29:26.754
uptime = 362197
count = 2

Initial Date = 20100324 05:35:30.020
Current Date = 20100324 05:35:30.022
uptime = 2
count = 1

Initial Date = 20100324 05:41:32.569
Current Date = 20100324 05:41:32.570
uptime = 1
count = 1

Initial Date = 20100324 05:47:36.381
Current Date = 20100324 05:47:36.382
uptime = 1
count = 1

Initial Date = 20100324 05:53:38.953
Current Date = 20100324 05:53:38.954
uptime = 1
count = 1

Initial Date = 20100324 05:53:38.953
Current Date = 20100324 05:59:41.886
uptime = 362933
count = 2

Initial Date = 20100324 05:53:38.953
Current Date = 20100324 06:05:43.462
uptime = 724509
count = 3