実験してみると、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 件のコメント:
コメントを投稿