Membuat profil aplikasi Java
Halaman ini menjelaskan cara mengubah aplikasi Java 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 Java:
- Waktu CPU
- Heap (memerlukan Java 11 atau lingkungan standar App Engine, dinonaktifkan secara default)
- Waktu dinding (tidak tersedia untuk lingkungan standar App Engine Java 8)
Versi bahasa Java yang didukung:
- JVM berbasis HotSpot (termasuk Oracle JDK dan beberapa build OpenJDK) untuk Java 8, 11, atau yang lebih baru.
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 Java didukung untuk kernel Linux yang library C standarnya diimplementasikan dengan
glibc
atau denganmusl
. 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 App Engine SDK versi 1.9.64 atau yang lebih baru)
- Dataproc (Untuk mengetahui informasi selengkapnya, lihat Mengonfigurasi Cloud Profiler untuk tugas Dataproc Spark dan Hadoop.)
- 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
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
.
Google Cloud console
-
Enable the required API.
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:
- Anda menggunakan akun layanan default, tetapi mengubah pemberian perannya.
- Anda menggunakan akun layanan yang dibuat pengguna.
- 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.
Menginstal agen Profiler
Compute Engine
Buat direktori penginstalan, misalnya,
/opt/cprof
, untuk agen Profiler:sudo mkdir -p /opt/cprof
Download arsip agen dari repositori
storage.googleapis.com
dan ekstrak ke direktori penginstalan:wget -q -O- https://storage.googleapis.com/cloud-profiler/java/latest/profiler_java_agent.tar.gz \ | sudo tar xzv -C /opt/cprof
GKE
Ubah Dockerfile
untuk membuat direktori penginstalan bagi
agen Profiler, download arsip agen,
lalu ekstrak arsip ke direktori penginstalan.
Linux (library C berbasis glibc
):
Gunakan perintah penginstalan berikut:
RUN mkdir -p /opt/cprof && \
wget -q -O- https://storage.googleapis.com/cloud-profiler/java/latest/profiler_java_agent.tar.gz \
| tar xzv -C /opt/cprof
Linux Alpine (pustaka C berbasis musl
):
Gunakan perintah penginstalan berikut:
wget -q -O- https://storage.googleapis.com/cloud-profiler/java/latest/profiler_java_agent_alpine.tar.gz \ | tar xzv -C /opt/cprof
Lingkungan Fleksibel
Saat Anda menggunakan image dasar runtime Java 8 Google atau image dasar runtime Java 9 / Jetty 9, agen Profiler sudah diinstal sebelumnya, sehingga tidak ada langkah tambahan yang perlu Anda lakukan untuk menginstal agen.
Untuk semua image dasar lainnya, Anda perlu menginstal agen. Misalnya, Dockerfile
berikut berisi petunjuk untuk menggunakan image
openjdk:11-slim
, menginstal agen
Profiler, dan menentukan parameter default yang akan digunakan saat memulai
aplikasi:
FROM openjdk:11-slim
COPY . .
RUN apt-get update \
&& apt-get install wget \
&& rm -rf /var/lib/apt/lists/*
RUN mkdir -p /opt/cprof && \
wget -q -O- https://storage.googleapis.com/cloud-profiler/java/latest/profiler_java_agent.tar.gz \
| tar xzv -C /opt/cprof
CMD ["java", "-agentpath:/opt/cprof/profiler_java_agent.so=OPTION1,OPTION2", "-jar", "PATH_TO_YOUR_JAR_FILE"]
Untuk menggunakan Dockerfile
ini dengan lingkungan fleksibel App Engine, Anda harus melakukan hal berikut:
- Ganti
OPTION1
danOPTION2
dengan nilai konfigurasi agen yang diperlukan untuk aplikasi Anda, dan gantiPATH_TO_YOUR_JAR_FILE
dengan jalur ke file jar Anda. - Tempatkan
Dockerfile
di direktori yang sama dengan fileapp.yaml
Anda. - Ubah file
app.yaml
untuk menentukan runtime kustom. Untuk mengetahui informasi selengkapnya, lihat Mem-build Runtime Kustom.
Lingkungan Standar
Saat Anda menggunakan lingkungan runtime Java,
agen Profiler sudah diinstal sebelumnya, jadi tidak ada
langkah tambahan yang perlu Anda lakukan untuk menginstal agen.
Untuk Java versi 11 dan yang lebih baru, Java sudah diinstal sebelumnya di /opt/cprof
.
Di luar Google Cloud
Buat direktori penginstalan, misalnya,
/opt/cprof
, untuk agen Profiler:sudo mkdir -p /opt/cprof
Download arsip agen dari repositori
storage.googleapis.com
dan ekstrak ke direktori penginstalan:wget -q -O- https://storage.googleapis.com/cloud-profiler/java/latest/profiler_java_agent.tar.gz \ | sudo tar xzv -C /opt/cprof
Untuk mencantumkan semua versi agen yang tersedia untuk didownload, jalankan perintah berikut:
gcloud storage ls gs://cloud-profiler/java/cloud-profiler-*
Respons perintah mirip dengan berikut ini:
gs://cloud-profiler/java/cloud-profiler-java-agent_20191014_RC00.tar.gz gs://cloud-profiler/java/cloud-profiler-java-agent_20191021_RC00.tar.gz gs://cloud-profiler/java/cloud-profiler-java-agent_20191028_RC00.tar.gz
Untuk mendownload versi agen tertentu, teruskan URL-nya ke perintah download. Misalnya, untuk mendownload agen yang dibuat pada 28 Oktober 2019, Anda akan menggunakan pernyataan berikut:
wget -q -O- https://storage.googleapis.com/cloud-profiler/java/cloud-profiler-java-agent_20191028_RC00.tar.gz \
| sudo tar xzv -C /opt/cprof
Versi agen dicatat selama inisialisasinya.
Memuat agen Profiler
Untuk memprofilkan aplikasi, mulai Java seperti biasa untuk menjalankan program, tetapi tentukan opsi konfigurasi agen. Anda menentukan jalur ke library agen, dan Anda dapat meneruskan opsi ke library.
Untuk lingkungan standar App Engine, agen akan otomatis dimuat dan dikonfigurasi. Langsung buka bagian Memulai program untuk mengetahui detail tentang cara mengonfigurasi dan memulai program.
Konfigurasi agen
Untuk mengonfigurasi agen pembuatan profil, sertakan tanda -agentpath
saat memulai
aplikasi Anda:
-agentpath:INSTALL_DIR/profiler_java_agent.so=OPTION1,OPTION2,OPTION3
Dalam ekspresi ini, INSTALL_DIR
adalah jalur ke agen pembuatan profil, sedangkan
OPTION1
, OPTION2
, dan OPTION3
adalah opsi konfigurasi agen. Misalnya, jika Anda mengganti OPTION1
dengan -cprof_service=myapp
dalam ekspresi sebelumnya, Anda akan menetapkan nama layanan menjadi myapp
. Tidak ada batasan
pada jumlah opsi atau urutannya. Opsi konfigurasi yang didukung
tercantum dalam tabel berikut:
Opsi agen | Deskripsi |
---|---|
-cprof_service
|
Jika aplikasi Anda tidak berjalan di App Engine, Anda harus
menggunakan opsi konfigurasi ini untuk menyetel nama layanan.
Untuk mengetahui batasan nama layanan, lihat
Argumen nama dan versi layanan.
|
-cprof_service_version
|
Jika Anda ingin menganalisis data pembuatan profil menggunakan UI Profiler menurut versi layanan, gunakan opsi ini untuk menetapkan versi. Untuk batasan versi, lihat Argumen nama dan versi layanan. |
-cprof_project_id
|
Saat Anda menjalankan di luar Google Cloud, gunakan opsi ini untuk menentukan project ID Google Cloud . Untuk mengetahui informasi selengkapnya, lihat Membuat profil aplikasi yang berjalan di luar Google Cloud. |
-cprof_zone_name
|
Saat aplikasi Anda berjalan di Google Cloud, agen pembuatan profil akan menentukan zona dengan berkomunikasi dengan layanan metadata Compute Engine. Jika agen pembuatan profil tidak dapat berkomunikasi dengan layanan metadata, Anda harus menggunakan opsi ini. |
-cprof_gce_metadata_server_retry_count -cprof_gce_metadata_server_retry_sleep_sec
|
Kedua opsi ini bersama-sama menentukan kebijakan percobaan ulang yang digunakan agen profiler saat berkomunikasi dengan layanan metadata Compute Engine.
untuk mengumpulkan Google Cloud informasi project ID dan zona Anda.
Kebijakan default adalah mencoba lagi hingga 3 kali dengan menunggu 1 detik di antara upaya. Kebijakan ini sudah cukup untuk sebagian besar konfigurasi. |
-cprof_cpu_use_per_thread_timers
|
Untuk profil waktu CPU yang paling akurat, tetapkan opsi ini
ke benar (true). Penggunaan opsi ini akan meningkatkan overhead per thread.
Nilai defaultnya adalah false. |
-cprof_force_debug_non_safepoints
|
Secara default, agen profiling memaksa JVM untuk membuat informasi
pen-debug-an untuk semua kode yang dibuat tepat waktu (JIT), selain
membuat informasi pen-debug-an untuk semua titik aman. Hal ini menghasilkan
informasi lokasi tingkat baris dan fungsi yang paling akurat untuk waktu CPU
dan profil heap dengan mengorbankan overhead agen tambahan. Anda dapat
menonaktifkan pembuatan informasi pen-debug-an untuk kode JIT dengan menyetel
opsi ini ke salah (false). Nilai defaultnya adalah benar (true). |
-cprof_wall_num_threads_cutoff
|
Secara default, profil aktivitas tidak dikumpulkan jika jumlah total thread
dalam aplikasi melebihi 4.096. Batas ini memastikan bahwa selama pengumpulan
profil, biaya penelusuran stack thread minimal.
Jika layanan Anda biasanya memiliki lebih dari 4096 thread dan jika Anda ingin mengumpulkan data pembuatan profil dengan mengorbankan overhead tambahan, gunakan tanda ini untuk meningkatkan batas. Batas default adalah 4.096 thread. |
-cprof_enable_heap_sampling
|
Untuk mengaktifkan pembuatan profil heap untuk Java 11 dan yang lebih tinggi, tetapkan-cprof_enable_heap_sampling=true .
Pemrofilan heap tidak didukung untuk Java 10 dan yang lebih rendah.Pemrofilan heap dinonaktifkan secara default. Saat Anda mengaktifkan pembuatan profil heap, interval sampling ditetapkan ke 512 KiB secara default. Interval ini cukup untuk sebagian besar aplikasi dan menimbulkan overhead kurang dari 0,5% untuk aplikasi. Interval pengambilan sampel dari 256 KiB (262144) hingga 1024 KiB (1048576) didukung. Misalnya, untuk menyetel interval sampling ke 256 KiB, yang menggandakan frekuensi sampling, tambahkan opsi agen:
|
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
.
Memulai program Anda
Compute Engine
Mulai Java seperti biasa untuk menjalankan program, dan tambahkan opsi konfigurasi agen:
java \
-agentpath:/opt/cprof/profiler_java_agent.so=-cprof_service=myapp,-cprof_service_version=1.0.0 \
JAVA_OPTIONS -jar PATH_TO_YOUR_JAR_FILE PROGRAM_OPTIONS
GKE
Ubah Dockerfile penampung layanan untuk memulai Java seperti yang biasanya Anda lakukan untuk menjalankan program, dan tambahkan opsi konfigurasi agen:
CMD ["java", \
"-agentpath:/opt/cprof/profiler_java_agent.so=-cprof_service=myapp,-cprof_service_version=1.0.0", \
"-jar", "PATH_TO_YOUR_JAR_FILE" ]
Lingkungan Fleksibel
Ubah file konfigurasi app.yaml
untuk
menetapkan variabel lingkungan PROFILER_ENABLE
. Kemudian, mulai
program seperti biasa:
env_variables:
PROFILER_ENABLE: true
Lihat Menentukan variabel lingkungan untuk mengetahui informasi selengkapnya.
Lingkungan Standar
Lingkungan runtime Java 21
Jika Anda tidak menggunakan paket layanan lama, aktifkan pengumpulan profiler dengan mengubah
file app.yaml
untuk menentukan tanda agentpath
menggunakan
salah satu metode berikut:
-
Tetapkan variabel lingkungan
JAVA_TOOL_OPTIONS
:runtime: java21 env_variables: JAVA_TOOL_OPTIONS: "-agentpath:/opt/cprof/profiler_java_agent.so=-logtostderr,-cprof_enable_heap_sampling=true"
-
Tentukan
agentpath
menggunakan elemenentrypoint
:runtime: java21 entrypoint: java \ -agentpath:/opt/cprof/profiler_java_agent.so=-logtostderr,-cprof_enable_heap_sampling=true \ Main.java
Jika Anda menggunakan paket layanan lama, aktifkan pengumpulan profiler dengan mengubah file
appengine-web.xml
untuk menentukan tanda agentpath
menggunakan salah satu metode berikut:
-
Tetapkan variabel lingkungan
JAVA_USER_OPTS
:<?xml version="1.0" encoding="utf-8"?> <appengine-web-app xmlns="http://appengine.google.com/ns/1.0"> <env-variables> <env-var name="JAVA_USER_OPTS" value="-agentpath:/opt/cprof/profiler_java_agent.so=-logtostderr,-cprof_enable_heap_sampling=true" /> </env-variables> </appengine-web-app>
-
Tetapkan variabel lingkungan
CPROF_ENABLE
:<?xml version="1.0" encoding="utf-8"?> <appengine-web-app xmlns="http://appengine.google.com/ns/1.0"> <env-variables> <env-var name="CPROF_ENABLE" value="-agentpath:/opt/cprof/profiler_java_agent.so=-logtostderr,-cprof_enable_heap_sampling=true" /> </env-variables> </appengine-web-app>
-
Tentukan
agentpath
menggunakan elemenentrypoint
:<?xml version="1.0" encoding="utf-8"?> <appengine-web-app xmlns="http://appengine.google.com/ns/1.0"> <entrypoint> java -agentpath:/opt/cprof/profiler_java_agent.so=-logtostderr,-cprof_enable_heap_sampling=true </entrypoint> </appengine-web-app>
Jika jenis profil baru dikonfigurasi untuk pengumpulan, pastikan Anda menentukan versi layanan baru saat men-deploy aplikasi. Untuk mengetahui informasi selengkapnya, lihat Mengapa saya tidak memiliki data untuk jenis profil tertentu?
Logging agen
Agen pembuatan profil dapat melaporkan informasi logging untuk lingkungan fleksibel App Engine, Compute Engine, dan GKE. Agen pembuatan profil mendukung tingkat logging berikut:
0
: Mencatat semua pesan. Level logging default.1
: Mencatat pesan peringatan, error, dan fatal.2
: Mencatat pesan error dan fatal.3
: Mencatat hanya pesan fatal dan menghentikan aplikasi.
Untuk mengaktifkan penulisan log ke error standar dengan tingkat logging default,
tambahkan -logtostderr
ke konfigurasi -agentpath
.
Untuk menetapkan level logging agar hanya mencatat pesan error dan fatal,
tambahkan -minloglevel=2
ke konfigurasi -agentpath
.
Misalnya, untuk mengaktifkan logging pesan error dan fatal ke error standar,
tambahkan -logtostderr
dan ‑minloglevel=2
ke konfigurasi
-agentpath
:
java -agentpath:/opt/cprof/profiler_java_agent.so=-cprof_service=myapp,-logtostderr,-minloglevel=2 \
-jar myApp.jar
Pemecahan masalah
Bagian ini mencantumkan masalah khusus untuk pembuatan profil aplikasi Java. Lihat Pemecahan masalah untuk mendapatkan bantuan terkait masalah umum.
Perilaku | Penyebab | Solusi |
---|---|---|
Anda telah mengaktifkan beberapa profiler heap dan tidak memiliki data profil. | Penggunaan beberapa profiler heap secara bersamaan akan menonaktifkan semua dukungan pemrofilan heap untuk Java. Ini adalah batasan JVM. | Aktifkan 1 profiler. |
Menjalankan dengan Linux Alpine
Agen pembuatan profil Java untuk Linux Alpine hanya didukung untuk konfigurasi Google Kubernetes Engine.
Untuk menginstal agen pembuatan profil Java terbaru untuk Linux Alpine, lihat bagian Menginstal agen Profiler.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.
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
- Pilih profil yang akan dianalisis
- Berinteraksi dengan flame graph
- Memfilter grafik flame
- Memfokuskan grafik flame
- Membandingkan profil