Membuat profil aplikasi Go

Halaman ini menjelaskan cara mengubah aplikasi Go Anda untuk mengambil data profiling dan mengirimkan data tersebut ke project Google CloudAnda. Untuk informasi umum tentang pembuatan profil, lihat Konsep pembuatan profil.

Jenis profil untuk Go:

  • Waktu CPU
  • Heap
  • Heap yang dialokasikan
  • Persaingan (Mutex Go)
  • Thread (Go goroutine)

Versi bahasa Go yang didukung:

  • Semua rilis Go yang dikelola secara resmi, kecuali jika dinyatakan lain. Untuk mengetahui informasi selengkapnya, lihat Kebijakan rilis bahasa Go.

Versi agen pembuatan profil yang didukung:

  • Rilis terbaru agen didukung. Secara umum, rilis yang lebih lama dari satu tahun tidak didukung. Sebaiknya gunakan agen versi terbaru.

Sistem operasi yang didukung:

  • Linux. Pembuatan profil aplikasi Go didukung untuk kernel Linux yang library C standarnya diimplementasikan dengan glibc atau dengan musl. Untuk informasi konfigurasi khusus kernel Linux Alpine, lihat Menjalankan di Linux Alpine.

Lingkungan yang didukung:

  • Compute Engine
  • Google Kubernetes Engine (GKE)
  • Lingkungan fleksibel App Engine
  • Lingkungan standar App Engine (memerlukan Go 1.11 atau yang lebih tinggi)
  • Di luar Google Cloud (Untuk mengetahui informasi tentang persyaratan konfigurasi tambahan, lihat Membuat profil aplikasi yang berjalan di luar Google Cloud.)

Mengaktifkan Profiler API

Sebelum menggunakan agen pembuatan profil, pastikan Profiler API yang mendasarinya diaktifkan. Anda dapat memeriksa status API dan mengaktifkannya jika perlu menggunakan Google Cloud CLI atau konsol Google Cloud :

gcloud CLI

  1. Jika Anda belum menginstal Google Cloud CLI di workstation, lihat dokumentasi Google Cloud CLI.

  2. Jalankan perintah berikut:

    gcloud services enable cloudprofiler.googleapis.com
    

Untuk informasi selengkapnya, lihat gcloud services.

Google Cloud console

  1. Enable the required API.

    Enable the API

  2. Jika API enabled ditampilkan, berarti API sudah diaktifkan. Jika belum, klik tombol Aktifkan.

Memberikan peran IAM ke akun layanan

Jika Anda men-deploy aplikasi di resource Google Cloud dan jika Anda menggunakan akun layanan default dan belum mengubah pemberian peran ke akun layanan tersebut, Anda dapat melewati bagian ini.

Jika Anda melakukan salah satu hal berikut, Anda harus memberikan peran IAM Agen Cloud Profiler (roles/cloudprofiler.agent) kepada akun layanan:

  1. Anda menggunakan akun layanan default, tetapi mengubah pemberian perannya.
  2. Anda menggunakan akun layanan yang dibuat pengguna.
  3. Anda menggunakan workload identity, berikan peran Cloud Profiler Agent ke akun layanan Kubernetes.

Anda dapat memberikan peran IAM ke akun layanan menggunakan konsolGoogle Cloud atau Google Cloud CLI. Misalnya, Anda dapat menggunakan perintah gcloud projects add-iam-policy-binding:

gcloud projects add-iam-policy-binding GCP_PROJECT_ID \
    --member serviceAccount:MY_SVC_ACCT_ID@GCP_PROJECT_ID. \
    --role roles/cloudprofiler.agent

Sebelum menggunakan perintah sebelumnya, ganti perintah berikut:

  • GCP_PROJECT_ID: Project ID Anda.
  • MY_SVC_ACCT_ID: Nama akun layanan Anda.

Untuk mengetahui informasi mendetail, lihat Mengelola akses ke project, folder, dan organisasi.

Menggunakan Cloud Profiler

Di semua lingkungan yang didukung, Anda menggunakan Profiler dengan mengimpor paket di aplikasi, lalu menginisialisasi Profiler sedini mungkin di aplikasi.

Anda dapat mengaktifkan pembuatan profil pertentangan Mutex (“Pertentangan” di antarmuka) dengan menyetel opsi konfigurasi MutexProfiling ke true.

Untuk mengetahui informasi selengkapnya tentang Profiler API, termasuk semua opsi konfigurasi, lihat dokumen API publik.

Compute Engine

Untuk Compute Engine, di profiler.Config, tetapkan Service dengan nama untuk layanan yang di-profil dan secara opsional tetapkan ServiceVersion dengan versi layanan:


// snippets is an example of starting cloud.google.com/go/profiler.
package main

import (
	"cloud.google.com/go/profiler"
)

func main() {
	cfg := profiler.Config{
		Service:        "myservice",
		ServiceVersion: "1.0.0",
		// ProjectID must be set if not running on GCP.
		// ProjectID: "my-project",

		// For OpenCensus users:
		// To see Profiler agent spans in APM backend,
		// set EnableOCTelemetry to true
		// EnableOCTelemetry: true,
	}

	// Profiler initialization, best done as early as possible.
	if err := profiler.Start(cfg); err != nil {
		// TODO: Handle error.
	}
}

Jika Anda memiliki dependensi dalam kode sumber yang diambil secara manual, maka Anda mungkin perlu menambahkan berikut ini ke skrip build atau Dockerfile:

go get cloud.google.com/go/profiler

GKE

Untuk GKE, di profiler.Config, tetapkan Service dengan nama untuk layanan yang sedang diprofilkan dan secara opsional tetapkan ServiceVersion dengan versi layanan:


// snippets is an example of starting cloud.google.com/go/profiler.
package main

import (
	"cloud.google.com/go/profiler"
)

func main() {
	cfg := profiler.Config{
		Service:        "myservice",
		ServiceVersion: "1.0.0",
		// ProjectID must be set if not running on GCP.
		// ProjectID: "my-project",

		// For OpenCensus users:
		// To see Profiler agent spans in APM backend,
		// set EnableOCTelemetry to true
		// EnableOCTelemetry: true,
	}

	// Profiler initialization, best done as early as possible.
	if err := profiler.Start(cfg); err != nil {
		// TODO: Handle error.
	}
}

Jika Anda memiliki dependensi dalam kode sumber yang diambil secara manual, maka Anda mungkin perlu menambahkan berikut ini ke skrip build atau Dockerfile:

go get cloud.google.com/go/profiler

App Engine

Untuk lingkungan fleksibel App Engine dan lingkungan standar App Engine, penambahan kode hampir sama dengan penambahan kode untuk Compute Engine dan GKE. Ada satu pengecualian. Di kedua lingkungan App Engine, parameter Service dan ServiceVersion berasal dari lingkungan, sehingga Anda tidak perlu menentukannya.


// appengine is an example of starting cloud.google.com/go/profiler on
// App Engine.
package main

import (
	"cloud.google.com/go/profiler"
)

func main() {
	// Profiler initialization, best done as early as possible.
	if err := profiler.Start(profiler.Config{
		// Service and ServiceVersion can be automatically inferred when running
		// on App Engine.
		// ProjectID must be set if not running on GCP.
		// ProjectID: "my-project",
	}); err != nil {
		// TODO: Handle error.
	}
}

Saat menjalankan aplikasi secara lokal, tetapkan parameter ProjectID (ID project Google Cloud Anda) dan Service di profiler.Config, karena parameter tersebut tidak dapat diperoleh dari lingkungan lokal. Anda tidak perlu menetapkan ServiceVersion.

Jika Anda menggunakan lingkungan standar App Engine, lihat Memigrasikan aplikasi ke Go 1.11 untuk mengetahui informasi mendetail tentang perubahan yang mungkin perlu Anda lakukan pada aplikasi. Selain itu, Anda harus menggunakan Google Cloud CLI versi 226.0.0 atau yang lebih baru. Untuk mengupdate Google Cloud CLI, jalankan perintah berikut:

gcloud components update

Untuk menjalankan aplikasi Anda:

  1. Perbarui dependensi:

    go get cloud.google.com/go/profiler
    
  2. Deploy aplikasi ke lingkungan fleksibel App Engine atau ke lingkungan standar App Engine:

    gcloud app deploy [DEPLOYMENT]
    

    dengan DEPLOYMENT adalah jalur ke file konfigurasi Anda. Misalnya, DEPLOYMENT mungkin main/app.yaml.

Menganalisis data

Setelah Profiler mengumpulkan data, Anda dapat melihat dan menganalisis data ini menggunakan antarmuka Profiler.

Di konsol Google Cloud , buka halaman Profiler:

Buka Profiler

Anda juga dapat menemukan halaman ini dengan menggunakan kotak penelusuran.

Argumen nama dan versi layanan

Saat memuat agen Profiler, Anda menentukan argumen service-name dan argumen service-version opsional untuk mengonfigurasinya.

Nama layanan memungkinkan Profiler mengumpulkan data pembuatan profil untuk semua replika layanan tersebut. Layanan profiler memastikan kecepatan pengumpulan satu profil per menit, rata-rata, untuk setiap nama layanan di setiap kombinasi versi layanan dan zona.

Misalnya, jika Anda memiliki layanan dengan dua versi yang berjalan di seluruh replika dalam tiga zona, profiler akan membuat rata-rata 6 profil per menit untuk layanan tersebut.

Jika Anda menggunakan nama layanan yang berbeda untuk replika, layanan Anda akan diprofilkan lebih sering daripada yang diperlukan, dengan overhead yang lebih tinggi.

Saat memilih nama layanan:

  • Pilih nama yang jelas mewakili layanan dalam arsitektur aplikasi Anda. Pilihan nama layanan kurang penting jika Anda hanya menjalankan satu layanan atau aplikasi. Hal ini lebih penting jika aplikasi Anda berjalan sebagai serangkaian microservice, misalnya.

  • Pastikan untuk tidak menggunakan nilai khusus proses, seperti ID proses, dalam string service-name.

  • String service-name harus cocok dengan ekspresi reguler ini:

    ^[a-z0-9]([-a-z0-9_.]{0,253}[a-z0-9])?$

Pedoman yang baik adalah menggunakan string statis seperti imageproc-service sebagai nama layanan.

Versi layanan bersifat opsional. Jika Anda menentukan versi layanan, Profiler dapat menggabungkan informasi pembuatan profil dari beberapa instance dan menampilkannya dengan benar. Tag ini dapat digunakan untuk menandai berbagai versi layanan Anda saat layanan tersebut di-deploy. UI Profiler memungkinkan Anda memfilter data menurut versi layanan; dengan begitu, Anda dapat membandingkan performa versi kode yang lebih lama dan lebih baru.

Nilai argumen service-version adalah string bentuk bebas, tetapi nilai untuk argumen ini biasanya terlihat seperti nomor versi, misalnya, 1.0.0 atau 2.1.2.

Logging agen

Agen pembuatan profil dapat melaporkan informasi debug dalam log-nya. Secara default, logging agen dinonaktifkan.

Untuk mengaktifkan logging agen, tetapkan opsi DebugLogging ke true saat memulai agen:

profiler.Start(profiler.Config{..., DebugLogging: true});

Pemecahan masalah

Bagian ini mencantumkan masalah khusus untuk pembuatan profil aplikasi Go. Lihat Pemecahan masalah untuk mendapatkan bantuan terkait masalah umum.

Perilaku Penyebab Solusi
Profil waktu CPU tidak dikumpulkan untuk aplikasi yang dibangun dengan -buildmode=c-archive. Profil heap, pertentangan, dan thread dikumpulkan. Masalah GitHub Secara default, pembuatan profil CPU tidak diaktifkan untuk aplikasi Go saat tanda -buildmode adalah c-archive atau c-shared. Tambahkan panggilan ke
signal.Notify(make(
chan os.Signal), syscall.SIGPROF)
sebelum memanggil profiler.Start.
Respons terhadap masalah GitHub.

Menjalankan dengan Linux Alpine

Agen pembuatan profil Go untuk Linux Alpine hanya didukung untuk konfigurasi Google Kubernetes Engine.

Error autentikasi

Jika Anda menggunakan image Docker yang berjalan dengan Linux Alpine (seperti golang:alpine atau hanya alpine), Anda mungkin melihat error autentikasi berikut:

connection error: desc = "transport: authentication handshake failed: x509: failed to load system roots and no roots provided"

Perhatikan bahwa untuk melihat error, Anda harus mengaktifkan logging agen. Secara default, agen untuk Go tidak menghasilkan pesan log apa pun.

Error ini menunjukkan bahwa image Docker dengan Linux Alpine tidak memiliki sertifikat SSL root yang diinstal secara default. Sertifikat tersebut diperlukan agar agen pembuatan profil dapat berkomunikasi dengan API profiler. Untuk mengatasi error ini, tambahkan perintah apk berikut ke Dockerfile Anda:

FROM alpine
...
RUN apk add --no-cache ca-certificates

Kemudian, Anda perlu membangun ulang dan men-deploy ulang aplikasi.

Langkah berikutnya