2020年5月15日金曜日

Lambda のインスタンス寿命

C++ lambdaをColdStart出来ればよいのですが、制御できる方法は見つけられませんでした。

実験してみると、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)はされた、と考えられます。(別なインスタンスの新規起動かもしれない可能性は残ります。)
 
 
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 件のコメント:

コメントを投稿