実験してみると、10分程度以内に再アクセスがある場合、インスタンスを再利用するようです。
これをHotStartと呼んでいるようです。インスタンスをプロセスから立ち上げる場合が、ColdStartとなります。これを避けるために、常にHotな状態にする、つまり常にアクセスするなどの対策が取る場合もあるようです。
で、C++の場合の問題なのですが、メモリマネージをちゃんとしないといけないという問題です。
今まで、一回CALLごとにプロセスを立ち上げたので、その必要はなかったのですが、インスタンスを再利用するとなると、メモリリークを潰す必要があります。
仮に、メモリ取得のピークが一瞬でも設定最大の3GBを超えると落ちてしまいます。どんな具合か、とりあえずAWS上で、ピークメモリを取得してみました。メモリ取得ソースは以下です。
インスタンスは、サンプルで添付している正循環8回です。(Windows上での実行時間とほぼ同じ時間70sec程度となっていますので、性能的には、通常PCで行うのと大差ないと思われます。
ちなみに、AWS上の性能は、メモリ設定に比例するらしいので、最大性能でもPC程度と推定されます。AWSの設定は、3GB、タイムアウト15分にしています。
)
static inline int memReadPeak(void)
{
char name[256];
pid_t pid = getpid();
sprintf(name, "/proc/%d/status", pid);
FILE* in = fopen(name, "rb");
if (in == NULL) return 0;
// Find the correct line, beginning with "VmPeak:":
int peak_kb = 0;
while (!feof(in) && fscanf(in, "VmPeak: %d kB", &peak_kb) != 1)
while (!feof(in) && fgetc(in) != '\n')
;
fclose(in);
return peak_kb;
}
double memUsedPeak() {
double peak = memReadPeak() / (double)1024;
return peak;
}
インクメンタルにSleep時間を増やして、メモリ取得量の変化をみます。AWS CLIで、Lambdaの起動をかけています。(AWS SC3ユーザでもこの方法はできません) 結果がJsonで返ってきてピークメモリをログしています。
メモリ取得が最初の状態に戻ったときが、インスタンス再起動されたと推測できます。この結果では、700sec後に起動したときに、メモリがほぼ初期値に戻っているので、プロセス再起動(ColdStart)はされた、と考えられます。(別なインスタンスの新規起動かもしれない可能性は残ります。)
メモリ取得が最初の状態に戻ったときが、インスタンス再起動されたと推測できます。この結果では、700sec後に起動したときに、メモリがほぼ初期値に戻っているので、プロセス再起動(ColdStart)はされた、と考えられます。(別なインスタンスの新規起動かもしれない可能性は残ります。)
Invoke AWS after sleep(i)
Calling lambda..SC3_Lambda_Engine 最小回数8回正循環.json clientConfig.requestTimeoutMs=900000sec
1:{
2: "peak_memory": "455.812500MB",
3: "key2": "value2",
4: "key3": "value3"
5:}
Elapsed time(C++):73177[ms]
0sec
Calling lambda..SC3_Lambda_Engine 最小回数8回正循環.json clientConfig.requestTimeoutMs=900000sec
1:{
2: "peak_memory": "633.902344MB",
3: "key2": "value2",
4: "key3": "value3"
5:}
Elapsed time(C++):70138[ms]
60sec
Calling lambda..SC3_Lambda_Engine 最小回数8回正循環.json clientConfig.requestTimeoutMs=900000sec
1:{
2: "peak_memory": "766.136719MB",
3: "key2": "value2",
4: "key3": "value3"
5:}
Elapsed time(C++):70010[ms]
120sec
Calling lambda..SC3_Lambda_Engine 最小回数8回正循環.json clientConfig.requestTimeoutMs=900000sec
1:{
2: "peak_memory": "898.433594MB",
3: "key2": "value2",
4: "key3": "value3"
5:}
Elapsed time(C++):70021[ms]
180sec
Calling lambda..SC3_Lambda_Engine 最小回数8回正循環.json clientConfig.requestTimeoutMs=900000sec
1:{
2: "peak_memory": "1030.652344MB",
3: "key2": "value2",
4: "key3": "value3"
5:}
Elapsed time(C++):69835[ms]
240sec
Calling lambda..SC3_Lambda_Engine 最小回数8回正循環.json clientConfig.requestTimeoutMs=900000sec
1:{
2: "peak_memory": "1153.636719MB",
3: "key2": "value2",
4: "key3": "value3"
5:}
Elapsed time(C++):69957[ms]
300sec
Calling lambda..SC3_Lambda_Engine 最小回数8回正循環.json clientConfig.requestTimeoutMs=900000sec
1:{
2: "peak_memory": "1276.550781MB",
3: "key2": "value2",
4: "key3": "value3"
5:}
Elapsed time(C++):69994[ms]
360sec
Calling lambda..SC3_Lambda_Engine 最小回数8回正循環.json clientConfig.requestTimeoutMs=900000sec
1:{
2: "peak_memory": "1399.472656MB",
3: "key2": "value2",
4: "key3": "value3"
5:}
Elapsed time(C++):70917[ms]
420sec
Calling lambda..SC3_Lambda_Engine 最小回数8回正循環.json clientConfig.requestTimeoutMs=900000sec
1:{
2: "peak_memory": "1531.652344MB",
3: "key2": "value2",
4: "key3": "value3"
5:}
Elapsed time(C++):70442[ms]
480sec
Calling lambda..SC3_Lambda_Engine 最小回数8回正循環.json clientConfig.requestTimeoutMs=900000sec
1:{
2: "peak_memory": "1663.828125MB",
3: "key2": "value2",
4: "key3": "value3"
5:}
Elapsed time(C++):69519[ms]
540sec
Calling lambda..SC3_Lambda_Engine 最小回数8回正循環.json clientConfig.requestTimeoutMs=900000sec
1:{
2: "peak_memory": "1796.054688MB",
3: "key2": "value2",
4: "key3": "value3"
5:}
Elapsed time(C++):69959[ms]
600sec
Calling lambda..SC3_Lambda_Engine 最小回数8回正循環.json clientConfig.requestTimeoutMs=900000sec
1:{
2: "peak_memory": "1919.246094MB",
3: "key2": "value2",
4: "key3": "value3"
5:}
Elapsed time(C++):70013[ms]
700sec
Calling lambda..SC3_Lambda_Engine 最小回数8回正循環.json clientConfig.requestTimeoutMs=900000sec
1:{
2: "peak_memory": "489.402344MB",
3: "key2": "value2",
4: "key3": "value3"
5:}
Elapsed time(C++):70774[ms]
800sec
0 件のコメント:
コメントを投稿