firebase functionsのメモリ使用量を制御する
functions
の課金方式を確認してみました。
→ Cloud Functions の料金
呼び出し回数の他にCPU時間
というのがありまして、使用メモリを下げると CPU のスペックも下がるという仕様。
2019/11/22 現在、下記のような料金体系になっています。
メモリ | CPU1 | 料金/100 ミリ秒 |
---|---|---|
128 MB | 200 MHz | $0.000000231 |
256 MB | 400 MHz | $0.000000463 |
512 MB | 800 MHz | $0.000000925 |
1,024 MB | 1.4 GHz | $0.000001650 |
2,048 MB | 2.4 GHz | $0.000002900 |
Slack
連携のためにBlazeプラン
にしたので、少しでも課金されないようにfunctions
のスペックを下げてみます。
デフォルトでは 256MB が割り当てられていますが、コメントの I/O だけではオーバースペックです。
128MB に変更してみましょう。
プログラム内でランタイムオプションを渡す
GUI コンソール無しでデプロイ時に決定できる方法です。
firebase 公式の関数のデプロイとランタイム オプションを管理するに設定方法が紹介されています。
プログラムではなく、firebase コンソールから GUI で変更したい場合は「firebase functions のメモリ使用量をコンソールから制御する」を参照してください。
const functions = require('firebase-functions')
// ランタイムオプション(メモリ割り当てなど)
const runtimeOpts = {
timeoutSeconds: 30,
memory: '128MB'
}
// 関数登録時にrunWithでランタイムオプションを設定する
exports.api = functions.runWith(runtimeOpts).https.onCall((data, ctx) => {
// do something
})
今回はメモリサイズのついでにタイムアウトも設定してみました。
なんらかの不具合で無限ループした場合や外部要因で応答がない場合は 30 秒でタイムアウトするようにしています。
メモリサイズに使える値は以下の通りで、最小構成は 128MB のようです。
- 128MB
- 256MB
- 512MB
- 1GB
- 2GB
メモリを 256MB から 128MB に落とすと CPU クロックが半分になるため、単純に処理時間がほぼ 2 倍になってしまいます。
コールドスタート時のアイドルも含めると結構長く感じます。
うーん、悩ましい。
ここまでやってみたけど、どうせアクセスも少ないので1GBにしよう。