Membuat profil aplikasi Go
Halaman ini menjelaskan cara mengubah aplikasi Go untuk mengambil data pembuatan profil dan mengirimkan data tersebut ke project Google Cloud Anda. 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 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 yang dirilis.
Sistem operasi yang didukung:
- Linux. Pembuatan profil aplikasi Go didukung untuk kernel Linux
yang library C standarnya diimplementasikan dengan
glibc
atau denganmusl
. Untuk informasi konfigurasi khusus untuk kernel Linux Alpine, lihat Berjalan 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 baru)
- Di luar Google Cloud (Untuk 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
Jika Anda belum menginstal Google Cloud CLI di workstation, lihat dokumentasi Google Cloud CLI.
Jalankan perintah berikut:
gcloud services enable cloudprofiler.googleapis.com
Untuk informasi selengkapnya, lihat
gcloud services
.
Konsol Google Cloud
-
Aktifkan API yang diperlukan.
Jika API enabled ditampilkan, berarti API sudah diaktifkan. Jika belum, klik tombol Enable.
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 melakukan salah satu tindakan berikut, Anda harus memberikan peran IAM Agen Cloud Profiler (roles/cloudprofiler.agent
) kepada akun layanan:
- Anda menggunakan akun layanan default, tetapi mengubah pemberian perannya.
- Anda menggunakan akun layanan yang dibuat pengguna.
- Anda menggunakan menggunakan identitas beban kerja, berikan peran Agen Cloud Profiler ke akun layanan Kubernetes.
Anda dapat memberikan peran IAM ke akun layanan menggunakan
Konsol Google 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 Anda 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 dalam aplikasi, lalu melakukan inisialisasi Profiler sedini mungkin dalam aplikasi.
Anda dapat mengaktifkan pembuatan profil pertentangan Mutex (“Pertentangan” di
antarmuka) dengan menetapkan opsi konfigurasi MutexProfiling
ke true
.
Untuk 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 sedang dibuat profilnya dan secara opsional tetapkan ServiceVersion
dengan
versi layanan:
Jika memiliki dependensi dalam kode sumber yang diambil secara manual, Anda mungkin perlu menambahkan hal berikut 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 dibuat profilnya dan secara opsional tetapkan ServiceVersion
dengan
versi layanan:
Jika memiliki dependensi dalam kode sumber yang diambil secara manual, Anda mungkin perlu menambahkan hal berikut 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 identik 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.
Saat Anda menjalankan aplikasi secara lokal, tetapkan parameter ProjectID
(ID project Google Cloud Anda) dan Service
di profiler.Config
, karena parameter tersebut tidak dapat berasal 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:
Perbarui dependensi:
go get cloud.google.com/go/profiler
Deploy aplikasi ke lingkungan fleksibel App Engine atau ke lingkungan standar App Engine:
gcloud app deploy [DEPLOYMENT]
dengan
DEPLOYMENT
sebagai jalur ke file konfigurasi Anda. Misalnya,DEPLOYMENT
mungkinmain/app.yaml
.- Untuk mengetahui detail deployment lingkungan fleksibel App Engine, lihat Menguji dan men-deploy aplikasi Anda.
- Untuk mengetahui detail deployment lingkungan standar App Engine, lihat Menguji dan men-deploy aplikasi Anda.
Menganalisis data
Setelah Profiler mengumpulkan data, Anda dapat melihat dan menganalisis data ini menggunakan antarmuka Profiler.
Di konsol Google Cloud, buka halaman Profiler:
Anda juga dapat menemukan halaman ini menggunakan kotak penelusuran.
Argumen nama dan versi layanan
Saat memuat agen Profiler, Anda menentukan argumen nama layanan dan argumen versi layanan opsional untuk mengonfigurasinya.
Nama layanan memungkinkan Profiler mengumpulkan data pembuatan profil untuk semua replika layanan tersebut. Layanan profiler memastikan rata-rata rasio pengumpulan satu profil per menit untuk setiap nama layanan di setiap versi dan zona layanan kombinasi.
Misalnya, jika Anda memiliki layanan dengan dua versi yang berjalan di seluruh replika di 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 dibuat profilnya lebih sering daripada yang diperlukan, dengan overhead yang lebih tinggi.
Saat memilih nama layanan:
Pilih nama yang dengan 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 kumpulan layanan mikro, misalnya.
Pastikan untuk tidak menggunakan nilai khusus proses, seperti ID proses, dalam string nama layanan.
String nama layanan 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. Ini dapat digunakan untuk menandai berbagai versi layanan saat di-deploy. UI Profiler memungkinkan Anda memfilter data menurut versi layanan; dengan cara ini, Anda dapat membandingkan performa kode versi lama dan baru.
Nilai argumen versi layanan 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 lognya. 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 yang 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 di-build 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 kesignal.Notify(make(
sebelum memanggil profiler.Start .Respons terhadap masalah GitHub. |
Berjalan dengan Linux Alpine
Agen pembuatan profil Go untuk Linux Alpine hanya didukung untuk konfigurasi Google Kubernetes Engine.
Error autentikasi
Jika 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 mem-build ulang dan men-deploy ulang aplikasi.
Langkah selanjutnya
- Memilih profil yang akan dianalisis
- Berinteraksi dengan flame graph
- Memfilter grafik flame
- Memfokuskan flame graph
- Membandingkan profil