0Pricing
Go Academy · レッスン

ヘルスチェックと本番環境のチューニング

コンテナでHEALTHCHECK、tini、シグナル処理を使います。

「ヘルスチェックと本番環境のチューニング」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。

ヘルスチェックエンドポイント

ヘルスチェックエンドポイントを使用すると、ロードバランサーやオーケストレーターがサービスの稼働状態とトラフィックを処理できる状態を確認できます。一般的な種類は、ライブネス(稼働しているか)とレディネス(リクエストを処理できるか)の 2 つです。

ライブネスエンドポイント

プロセスが稼働していれば 200 OK を返します。プロセスが起動していることだけで十分な、常に成功する単純なハンドラーです。

mux.HandleFunc("/healthz/live", func(w http.ResponseWriter, r *http.Request) {
    w.WriteHeader(http.StatusOK)
})

レディネスエンドポイント

サービスの準備が完了した場合(DB への接続、キャッシュのウォームアップ、マイグレーションの完了など)にだけ 200 を返します。起動中または状態が劣化している場合は 503 を返します。

mux.HandleFunc("/healthz/ready", func(w http.ResponseWriter, r *http.Request) {
    if err := db.PingContext(r.Context()); err != nil {
        w.WriteHeader(http.StatusServiceUnavailable); return
    }
    w.WriteHeader(http.StatusOK)
})

Kubernetes のプローブ

Kubernetes の Deployment 仕様で、ライブネスプローブとレディネスプローブを設定します。

livenessProbe:
  httpGet: { path: /healthz/live, port: 8080 }
  initialDelaySeconds: 5
  periodSeconds: 10
readinessProbe:
  httpGet: { path: /healthz/ready, port: 8080 }
  initialDelaySeconds: 3
  periodSeconds: 5

GOMAXPROCS の調整

コンテナ内では、GOMAXPROCS はコンテナの CPU 制限ではなくホストの CPU 数をデフォルト値として使用します。go.uber.org/automaxprocsを使用すると、cgroup の制限に基づいて正しく設定できます。

import _ "go.uber.org/automaxprocs"

メモリ制限

GOMEMLIMIT(Go 1.19 以降)をコンテナのメモリ制限に設定すると、OOM キラーが作動する前に GC がより積極的にメモリを使用できるようになります。

import "runtime/debug"
debug.SetMemoryLimit(512 * 1024 * 1024) // 512 MiB

GC の調整

GOGC を設定して GC の頻度を制御します。デフォルト値は 100 で、ヒープが 2 倍になると GC が実行されます。値を下げると、GC の頻度が増える代わりにメモリ使用量が減ります。値を上げると、メモリ使用量が増える代わりに GC の頻度が減ります。

os.Setenv("GOGC", "200") // allow heap to grow 2× before GC

コネクションプールの調整

コンテナのリソース制限と、データベースの max_connections に適したデータベース接続プールの上限を設定します。

db.SetMaxOpenConns(25)
db.SetMaxIdleConns(10)
db.SetConnMaxLifetime(5 * time.Minute)

メトリクスの公開

Prometheus のメトリクスは、メインの API ポートとは別のポートで公開し、内部データが外部クライアントに漏洩するのを防ぎます。

go func() {
    http.Handle("/metrics", promhttp.Handler())
    http.ListenAndServe(":9090", nil)
}()

Kubernetes でのグレースフルシャットダウン

シャットダウンのタイムアウトに十分な時間を確保できるよう、Pod 仕様でterminationGracePeriodSecondsを設定します。SIGTERM を受信したら、レディネスプローブから直ちに 503 を返します。

本番環境でのプロファイリング

pprof は認証付きの非公開ポートで有効にします。内部状態が露出し、サービスへの DoS 攻撃に悪用される可能性があるため、決して公開しないでください。

クイックチェック

GOMAXPROCS をホストの CPU 数ではなく、コンテナの CPU 制限に基づいて設定する必要があるのはなぜですか。

まとめ:ヘルスチェックと本番環境の調整

要点:

  • ライブネスはプロセスの稼働状態、レディネスはサービスがトラフィックを処理できる状態を示します
  • automaxprocs はコンテナの CPU 制限に基づいて GOMAXPROCS を設定します
  • GOMEMLIMIT は OOM による強制終了を防ぎ、GOGC は GC の頻度を調整します
  • メトリクスは内部専用の別ポートで公開します

よくある質問

「ヘルスチェックと本番環境のチューニング」レッスンは無料ですか?

はい。「ヘルスチェックと本番環境のチューニング」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。

「ヘルスチェックと本番環境のチューニング」で何を学びますか?

コンテナでHEALTHCHECK、tini、シグナル処理を使います。 ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Go Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「ヘルスチェックと本番環境のチューニング」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このGo Academyレッスンでコードを書いて実行できますか?

はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Go向けマルチステージDockerビルド
  2. 環境設定とシークレット
  3. ローカル開発のためのDocker Compose
  4. ヘルスチェックと本番環境のチューニング
← Go Academyに戻る