🌞
GAEのmin_idle_instancesを設定するときはウォームアップリクエストを有効にする必要がある
先日GAEでサービスを立ち上げた際、app.yamlにmin_idle_instances: 1
を書いているにも関わらず、起動中インスタンスが0になってしまうことがありました。
アクセスがあるときだけインスタンスが起動して、その後インスタンスが0になってしまっています。しばらくアクセスがない状態でアクセスが発生するとサービスがコールドブートすることになり、リクエストからサイトの表示までに10秒くらいかかってしまうことになります。
app.yamlはこんな感じ。
app.yaml
env: standard
runtime: nodejs16
instance_class: F1
automatic_scaling:
target_cpu_utilization: 0.7
target_throughput_utilization: 0.7
max_instances: 10
min_instances: 0
max_idle_instances: 2
min_idle_instances: 1
max_pending_latency: automatic
min_pending_latency: automatic
max_concurrent_requests: 80
なんでだろうな〜と思っていたんですが、ちゃんと公式ドキュメントに書いてありました。
「min_idle_instances」のところに、
警告: この機能を適正に機能させるには、ウォームアップ リクエストが有効であることを確認する必要があります。また、アプリケーションでウォームアップ リクエストが処理されることも確認する必要があります。
なるほど。
また、min_idle_instances
と同様にmin_instances
を設定するときもウォームアップリクエストが有効な必要があるとのことですね。
ということでウォームアップリクエストを有効にしよう。
app.yaml
// 省略
+ inbound_services:
+ - warmup
server.ts
import express from 'express'
const app = express()
+ app.get('/_ah/warmup', (req, res) => {
+ res.sendStatus(200)
+ })
app.listen(3000, () => {
console.log('Start Express on port 3000.')
});
app.yamlにinbound_services: - warmup
を追記し、サーバーの方で/_ah/warmup
へのリクエストが来たら200を返すようにします。
これでデプロイすると…
デプロイ後はちゃんとインスタンスが常時1つ以上立ち上がっている状態になりました!しばらくアクセスがない状態からアクセスしても、インスタンスが起動しているときと同じくらいの表示速度になりました。
まとめ
公式ドキュメントをちゃんと読もう。
Discussion