Meskipun Memorystore for Redis menyediakan metrik sisi server real-time untuk memantau throughput, pemanfaatan CPU, dan penggunaan memori, data ini saja mungkin tidak menjelaskan mengapa aplikasi klien Anda mengalami latensi tinggi dalam sistem terdistribusi yang kompleks.
Metrik sisi klien menyelesaikan masalah ini dengan memberikan transparansi ke dalam siklus permintaan-respons penuh. Metrik ini mengukur perintah dari saat aplikasi memulainya hingga aplikasi memproses respons. Dengan merekam titik data ini, Anda dapat menentukan secara akurat apakah latensi berasal dari logika aplikasi, jalur jaringan, atau server Redis.
Sebelum memulai
Pastikan aplikasi klien Anda menggunakan akun layanan dan peran Identity and Access Management (IAM) berikut ditetapkan ke akun layanan tersebut:
roles/cloudtrace.agent(Cloud Trace Agent)roles/monitoring.metricWriter(Monitoring Metric Writer)
Untuk mengetahui informasi selengkapnya tentang cara memberikan peran, lihat panduan memulai Memberikan peran IAM menggunakan konsol Google Cloud .
Aktifkan Cloud Monitoring API
Untuk mengekspor metrik sisi klien ke Monitoring, aplikasi Anda memerlukan Monitoring API diaktifkan. Dengan mengekspor dan memvisualisasikan metrik ini di Monitoring, Anda dapat menunjukkan penyebab utama hambatan untuk menentukan asal latensi.
Untuk mengaktifkan Monitoring API, lakukan hal berikut:
Di konsol Google Cloud , buka halaman APIs & Services.
Pilih project tempat Anda membuat instance Memorystore for Redis.
Klik Enable APIs and services.
Telusuri
monitoring.Di hasil penelusuran, klik Cloud Monitoring API.
Jika API enabled muncul, berarti API sudah diaktifkan. Jika tidak, klik Aktifkan.
Aktifkan Cloud Trace API
Untuk melihat rekaman aktivitas terdistribusi di Trace, Anda harus mengaktifkan Trace API. Kemudian, Anda dapat menggunakan Penjelajah Trace untuk melihat trace ini, mendiagnosis bottleneck, dan mengisolasi sumber latensi dalam aplikasi Anda.
Untuk mengaktifkan Trace API, lakukan hal berikut:
Di konsol Google Cloud , buka halaman APIs & Services.
Pilih project tempat Anda membuat instance Memorystore for Redis.
Klik Enable APIs and services.
Telusuri
trace.Di hasil penelusuran, klik Cloud Trace API.
Jika API enabled muncul, berarti API sudah diaktifkan. Jika tidak, klik Aktifkan.
Mengaktifkan metrik sisi klien
Untuk mengaktifkan metrik sisi klien, tambahkan SDK OpenTelemetry, pengekspor Cloud Monitoring, dan pengekspor Cloud Trace ke kode aplikasi Anda. Instrumentasi OpenTelemetry, yang berjalan langsung di dalam library klien Redis aplikasi Anda, akan merekam metrik. Hal ini memungkinkan aplikasi Anda merekam titik data latensi dan mengekspornya ke Monitoring dan Trace untuk visualisasi.
Untuk mengaktifkan metrik sisi klien, Anda dapat menggunakan Go, Java, Node.js, atau Python. Informasi untuk mengaktifkan metrik untuk setiap bahasa muncul di tab berikutnya.
Go
Untuk menginstal dependensi OpenTelemetry dan Google Cloud exporter yang diperlukan, jalankan perintah berikut di terminal Anda:
go get github.com/gomodule/redigo/redis@latest go get go.opentelemetry.io/otel go get go.opentelemetry.io/otel/sdk/trace go get go.opentelemetry.io/otel/sdk/metric go get github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace go get github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric
Untuk mengaktifkan metrik sisi klien, buat file
main.godan tambahkan kode berikut ke dalamnya:Jalankan aplikasi Anda setidaknya selama satu menit agar pengekspor memiliki cukup waktu untuk membuat batch dan mengirim metrik yang dipublikasikan ke Monitoring.
Java
Untuk menginstal dependensi OpenTelemetry dan Google Cloud exporter yang diperlukan, tambahkan kode berikut ke file
pom.xmlaplikasi Anda:Untuk mengaktifkan metrik sisi klien, buat file
RedisTelemetryApp.javadan tambahkan kode berikut ke dalamnya:Jalankan aplikasi Anda setidaknya selama satu menit agar pengekspor memiliki cukup waktu untuk membuat batch dan mengirim metrik yang dipublikasikan ke Monitoring.
Node.js
Untuk menginstal dependensi OpenTelemetry dan Google Cloud exporter yang diperlukan, jalankan perintah berikut di terminal Anda:
npm install redis@^4.6.0 @opentelemetry/api@^1.9.0 @opentelemetry/sdk-trace-node@^2.1.0 @opentelemetry/sdk-trace-base@^2.1.0 @opentelemetry/sdk-metrics@^2.1.0 @opentelemetry/instrumentation@^0.205.0 @opentelemetry/instrumentation-redis@^0.67.0 @google-cloud/opentelemetry-cloud-trace-exporter@^3.0.0 @google-cloud/opentelemetry-cloud-monitoring-exporter@^0.21.0 @opentelemetry/resources@^2.1.0
Untuk mengaktifkan metrik sisi klien, buat file
server.jsdan tambahkan kode berikut ke dalamnya:Jalankan aplikasi Anda setidaknya selama satu menit agar pengekspor memiliki cukup waktu untuk membuat batch dan mengirim metrik yang dipublikasikan ke Monitoring.
Python
Untuk menginstal dependensi OpenTelemetry dan Google Cloud exporter yang diperlukan, jalankan perintah berikut di terminal Anda:
pip install redis==7.0.1 opentelemetry-api==1.39.1 opentelemetry-sdk==1.39.1 opentelemetry-instrumentation-redis==0.60b1 opentelemetry-exporter-gcp-trace==1.11.0 opentelemetry-exporter-gcp-monitoring==1.11.0a0
Untuk mengaktifkan metrik sisi klien, buat file
main.pydan tambahkan kode berikut ke aplikasi Anda:Jalankan aplikasi Anda setidaknya selama satu menit agar pengekspor memiliki cukup waktu untuk membuat batch dan mengirim metrik yang dipublikasikan ke Monitoring.
Melihat metrik di Monitoring
Setelah mengaktifkan metrik sisi klien dan menjalankan aplikasi selama setidaknya satu menit untuk memberi pengekspor cukup waktu untuk mengelompokkan dan mengirim metrik ke Monitoring, gunakan Monitoring untuk memvisualisasikan metrik, mengelompokkannya menurut operasi atau instance, dan menerapkan penggabung untuk memantau performa aplikasi Anda.
Untuk melihat metrik di Monitoring, lakukan hal berikut:
Di konsol Google Cloud , buka halaman Metrics Explorer.
Pilih project Google Cloud Anda.
Klik Select a metric.
Telusuri
workload.googleapis.com/redis.Pilih metrik sisi klien. Kelompokkan data menurut
operationdaninstancesesuai kebutuhan, lalu pilih agregator. Untuk mempelajari opsi lainnya, lihat Memilih metrik saat menggunakan Metrics Explorer.
Melihat rekaman aktivitas terdistribusi di Trace
Setelah aplikasi Anda mulai mengekspor data, Anda dapat menggunakan Trace untuk memvisualisasikan siklus permintaan-respons penuh perintah Redis Anda. Dengan melihat rekaman aktivitas terdistribusi di Trace, Anda dapat mendiagnosis hambatan sehingga dapat dengan cepat mengisolasi sumber latensi yang tepat dalam aplikasi.
Untuk melihat rekaman aktivitas terdistribusi di Trace, lakukan hal berikut:
Di konsol Google Cloud , buka halaman Trace explorer.
Pilih rekaman aktivitas terbaru yang diwakili oleh titik pada diagram sebar.
Periksa tampilan waterfall untuk mengisolasi sumber latensi dengan mengidentifikasi hambatan berikut:
Total durasi permintaan: kolom tingkat teratas (induk) menampilkan total waktu yang harus Anda tunggu hingga operasi selesai.
Latensi jaringan dan server (RTT): batang turunan (seperti yang berlabel
GETatauSET) menunjukkan waktu yang dihabiskan perintah untuk melintasi jaringan dan berjalan di server Memorystore for Redis.Pemblokiran koneksi klien: jika ada jeda horizontal yang besar dan kosong sebelum rentang turunan Redis dimulai, maka thread aplikasi akan macet menunggu koneksi TCP yang tersedia dari kumpulan koneksi.
Pemblokiran parsing aplikasi: jika ada jeda horizontal yang besar dan kosong setelah rentang turunan Redis berakhir, berarti aplikasi kesulitan mem-parsing atau memproses payload yang ditampilkan. Hal ini sering terjadi pada string JSON multi-megabyte.
Percobaan ulang: jika Anda melihat beberapa rentang turunan pendek untuk perintah yang sama yang terjadi secara berurutan dalam rekaman aktivitas induk yang sama, klien Anda mungkin mengalami kehilangan paket jaringan dan harus memicu loop percobaan ulang dengan jeda eksponensial.
Memecahkan masalah
Bagian ini mencantumkan masalah performa umum yang dapat Anda identifikasi menggunakan metrik sisi klien, menjelaskan penyebab utamanya, dan memberikan panduan tentang cara memecahkan masalah tersebut.
| Masalah | Penyebab | Memecahkan masalah |
|---|---|---|
Aplikasi Anda mengalami lonjakan latensi yang tiba-tiba, tetapi Memorystore for Redis tampak berfungsi dengan baik.
|
Hambatan sepenuhnya berada di dalam aplikasi Anda. thread Anda mencoba menjalankan perintah Redis, tetapi kumpulan koneksi sudah
habis sepenuhnya. redis_client_blocking_latency tinggi menunjukkan
waktu yang dihabiskan kode Anda untuk menunggu soket TCP yang tersedia sebelum
perintah dikirim ke jaringan. |
Untuk menangani traffic serentak yang lebih tinggi, tingkatkan batas ukuran kumpulan koneksi dalam konfigurasi klien Redis Anda (misalnya, MaxActive untuk Go, MaxTotal untuk Java, atau max_connections untuk Node.js dan Python). |
Permintaan selesai, tetapi endpoint memerlukan waktu yang jauh lebih lama dari yang diperkirakan. Tidak ada masalah yang terkait dengan kondisi jaringan atau server Anda.
|
Memorystore for Redis menjalankan perintah dan jaringan mentransfer payload dengan cepat (RTT rendah). Namun, payload yang ditampilkan berukuran besar (misalnya, string JSON 15 MB). Aplikasi Anda mengalami
redis_application_blocking_latency yang tinggi karena aplikasi
menggunakan resource yang berlebihan saat mengalokasikan memori dan mendeserialisasi
string besar tersebut menjadi objek. |
Optimalkan model data Anda. Jangan menyimpan blob JSON besar dalam satu kunci.
Pecah data menggunakan hash Redis (HSET) dan gunakan
HGET atau HMGET untuk mengambil hanya kolom tertentu
yang Anda butuhkan.
|
Latensi aplikasi yang terlihat pengguna meningkat, tetapi metrik Redis Anda melaporkan latensi server yang rendah dan checkout pool koneksi yang normal.
|
Karena redis_client_rtt hanya merekam RTT
permintaan yang berhasil, tidak mencerminkan durasi waktu tunggu paket yang gagal. Saat aplikasi Anda mengalami penurunan paket sementara atau reset TCP, logika percobaan ulang klien yang diinstrumentasikan akan meningkatkan redis_retry_count dan memicu loop backoff eksponensialnya.
Hal ini menyebabkan waktu tunggu antara percobaan (misalnya,
100ms, 200ms, atau 400ms). Pengguna
mengalami total latensi yang tinggi, tetapi penyebab utamanya adalah kehilangan
paket jaringan, yang memicu penundaan tidur sisi klien. |
Periksa VPC Flow Logs Anda untuk mengetahui apakah ada paket yang dibatalkan, pembatasan bandwidth,
atau anomali perutean lintas region. Jika Anda mengalami timeout agresif,
pastikan timeout koneksi klien Anda (socket_timeout atau
connect_timeout) lebih besar daripada RTT yang diharapkan untuk memperhitungkan
jitter jaringan sementara. |
Semua berhenti dan semua lapisan pipeline telemetri melaporkan latensi tinggi.
|
Redis adalah thread tunggal. Saat Anda menjalankan perintah kompleksitas waktu O(N), seperti KEYS *, SMEMBERS pada set data yang sangat besar, atau HGETALL pada hash dengan jutaan kolom, mesin Redis akan dijeda untuk memenuhi permintaan tersebut. Saat perintah tersebut
berjalan, setiap permintaan aplikasi lainnya akan diantrekan, sehingga menyebabkan lonjakan latensi
di seluruh sistem. Karena redis_client_rtt kustom Anda cocok dengan
latensi server (commands/usec_per_call), server yang menjalankan
perintah adalah hambatan. |
Buka Trace dan lihat perintah Redis pada rentang yang lambat untuk mengidentifikasi kueri mana yang menyebabkan pemblokiran. Ganti perintah pemblokiran dengan perintah non-pemblokiran dalam kode Anda. Untuk melakukan iterasi melalui set data besar secara inkremental tanpa mengunci
thread server, gunakan |
Aplikasi Anda melaporkan latensi dasar yang konsisten dan tinggi untuk semua perintah Redis, bahkan saat traffic rendah.
|
Server Redis menjalankan perintah secara instan, tetapi aplikasi dan
instance Anda di-deploy di region yang berbeda (misalnya,
us-central1 dan us-east1). Setiap paket jaringan
harus melintasi infrastruktur Google Cloud fisik di antara pusat data
geografis ini. Hal ini akan menghasilkan penalti latensi lintas region yang wajib dan secepat cahaya untuk setiap perjalanan pulang pergi. |
Untuk mengurangi latensi, deploy aplikasi Anda agar berada di region dan zona yang sama dengan instance Anda. Untuk melihat region aplikasi dan instance, gunakan konsol Google Cloud . |
Langkah berikutnya
- Pelajari metrik sisi klien lebih lanjut.
- Pelajari metrik sisi klien yang tersedia untuk Memorystore for Redis.