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 = 1Initial Date = 20100324 01:10:04.736
Current Date = 20100324 01:10:16.141
uptime = 11405
count = 2Initial Date = 20100324 01:10:04.736
Current Date = 20100324 01:10:36.676
uptime = 31940
count = 3Initial Date = 20100324 01:10:04.736
Current Date = 20100324 01:11:07.177
uptime = 62441
count = 4Initial Date = 20100324 01:10:04.736
Current Date = 20100324 01:11:48.297
uptime = 103561
count = 5Initial Date = 20100324 01:10:04.736
Current Date = 20100324 01:12:39.432
uptime = 154696
count = 6Initial Date = 20100324 01:10:04.736
Current Date = 20100324 01:13:40.550
uptime = 215814
count = 7Initial Date = 20100324 01:10:04.736
Current Date = 20100324 01:15:42.093
uptime = 337357
count = 8Initial Date = 20100324 01:10:04.736
Current Date = 20100324 01:18:42.732
uptime = 517996
count = 9Initial Date = 20100324 01:10:04.736
Current Date = 20100324 01:22:43.184
uptime = 758448
count = 10Initial Date = 20100324 01:27:45.387
Current Date = 20100324 01:27:45.388
uptime = 1
count = 1Initial 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 = 1Initial Date = 20100324 01:45:59.017
Current Date = 20100324 01:50:49.644
uptime = 290627
count = 2Initial Date = 20100324 01:56:02.002
Current Date = 20100324 01:56:02.003
uptime = 1
count = 1Initial Date = 20100324 02:00:53.746
Current Date = 20100324 02:00:53.748
uptime = 2
count = 1Initial Date = 20100324 02:06:06.200
Current Date = 20100324 02:06:06.200
uptime = 0
count = 1Initial Date = 20100324 02:06:06.200
Current Date = 20100324 02:10:57.901
uptime = 291701
count = 2Initial 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 = 1Initial Date = 20100324 04:24:52.316
Current Date = 20100324 04:28:54.485
uptime = 242169
count = 2Initial Date = 20100324 04:24:52.316
Current Date = 20100324 04:32:55.286
uptime = 482970
count = 3Initial Date = 20100324 04:24:52.316
Current Date = 20100324 04:36:55.806
uptime = 723490
count = 4Initial Date = 20100324 04:24:52.316
Current Date = 20100324 04:40:57.665
uptime = 965349
count = 5Initial Date = 20100324 04:45:01.927
Current Date = 20100324 04:45:01.928
uptime = 1
count = 1Initial Date = 20100324 04:45:01.927
Current Date = 20100324 04:49:04.288
uptime = 242361
count = 2Initial Date = 20100324 04:45:01.927
Current Date = 20100324 04:53:06.267
uptime = 484340
count = 3Initial Date = 20100324 04:45:01.927
Current Date = 20100324 04:57:08.374
uptime = 726447
count = 4Initial Date = 20100324 04:45:01.927
Current Date = 20100324 05:01:11.439
uptime = 969512
count = 5Initial Date = 20100324 04:45:01.927
Current Date = 20100324 05:05:13.838
uptime = 1211911
count = 6Initial Date = 20100324 04:45:01.927
Current Date = 20100324 05:11:16.103
uptime = 1574176
count = 7Initial Date = 20100324 05:17:19.835
Current Date = 20100324 05:17:19.836
uptime = 1
count = 1Initial Date = 20100324 05:23:24.557
Current Date = 20100324 05:23:24.559
uptime = 2
count = 1Initial Date = 20100324 05:23:24.557
Current Date = 20100324 05:29:26.754
uptime = 362197
count = 2Initial Date = 20100324 05:35:30.020
Current Date = 20100324 05:35:30.022
uptime = 2
count = 1Initial Date = 20100324 05:41:32.569
Current Date = 20100324 05:41:32.570
uptime = 1
count = 1Initial Date = 20100324 05:47:36.381
Current Date = 20100324 05:47:36.382
uptime = 1
count = 1Initial Date = 20100324 05:53:38.953
Current Date = 20100324 05:53:38.954
uptime = 1
count = 1Initial Date = 20100324 05:53:38.953
Current Date = 20100324 05:59:41.886
uptime = 362933
count = 2Initial Date = 20100324 05:53:38.953
Current Date = 20100324 06:05:43.462
uptime = 724509
count = 3