All Products
Search
Document Center

Tair (Redis® OSS-Compatible):Pemecahan masalah penggunaan memori tinggi

Last Updated:Aug 27, 2026

Ketika instans Tair (Redis OSS-compatible) kehabisan memori, hal ini dapat menyebabkan masalah seperti eviksi kunci yang sering terjadi, peningkatan waktu respons, dan QPS yang tidak stabil, yang berpotensi mengganggu operasi bisnis Anda. Jika memori instans Anda penuh atau Anda menerima peringatan memori, gunakan topik ini untuk menentukan apakah penggunaan memori secara konsisten tinggi, mengalami kenaikan mendadak, atau tidak merata. Anda kemudian dapat menangani masalah tersebut dengan memisahkan kunci besar, menetapkan kebijakan kedaluwarsa, atau meningkatkan spesifikasi instans.

Skenario penggunaan memori tinggi

Penggunaan memori tinggi umumnya termasuk dalam salah satu dari tiga skenario berikut:

  • Penggunaan memori tetap pada level tinggi selama periode yang lama. Secara umum, Anda harus mengambil tindakan jika penggunaan memori melebihi 95%.

  • Penggunaan memori secara konsisten rendah tetapi naik mendadak ke level tinggi, kadang-kadang mencapai 100%.

  • Penggunaan memori keseluruhan instans rendah, tetapi penggunaan memori pada data node tertentu mendekati 100%.

Untuk mengurangi penggunaan memori, terapkan solusi yang sesuai dengan skenario Anda.

Solusi untuk penggunaan memori yang konsisten tinggi

  1. Periksa apakah kunci yang ada memenuhi kebutuhan bisnis, dan segera hapus kunci yang tidak diperlukan.

  2. Gunakan fitur analisis cache untuk menganalisis distribusi kunci besar dan kebijakan TTL (time-to-live) untuk kunci. Untuk informasi selengkapnya, lihat Analisis kunci offline.

    1. Analisis apakah kunci memiliki kebijakan TTL yang wajar.

      Catatan

      Pada contoh berikut, tidak ada waktu kedaluwarsa yang ditetapkan untuk semua kunci. Kami menyarankan Anda mengevaluasi kebutuhan bisnis dan menetapkan waktu kedaluwarsa yang sesuai di sisi client.

      Gambar 1. Contoh distribusi waktu kedaluwarsa kunciKey的过期时间分布示例

    2. Evaluasi kunci besar dan pisahkan di sisi aplikasi.

      Di halaman analisis cache, klik tab Large Key Analysis untuk melihat detailnya. Tabel tersebut menampilkan informasi seperti nama kunci, tipe kunci, dan ukuran data. Anda dapat mengklik tombol Export untuk mengunduh hasil analisis ke mesin lokal Anda.

  3. Tetapkan kebijakan eviksi yang tepat berdasarkan kebutuhan bisnis Anda dengan mengonfigurasi parameter maxmemory-policy. Untuk petunjuk spesifik, lihat Setel parameter.

    Catatan

    Kebijakan eviksi default untuk sebuah instans adalah volatile-lru. Untuk informasi selengkapnya, lihat Kebijakan eviksi.

  4. Tetapkan frekuensi eksekusi yang wajar untuk penghapusan aktif kunci yang telah kedaluwarsa berdasarkan kebutuhan bisnis Anda dengan menyesuaikan nilai parameter hz. Untuk petunjuk spesifik, lihat Sesuaikan frekuensi eksekusi tugas terjadwal.

    Catatan

    Kami menyarankan menetapkan parameter hz ke nilai kurang dari 100. Nilai yang lebih besar dapat berdampak signifikan pada penggunaan CPU. Anda juga dapat mengaktifkan penyesuaian otomatis jika instans Anda kompatibel dengan Redis 5.0 atau versi yang lebih baru. Untuk informasi selengkapnya, lihat Aktifkan kontrol frekuensi dinamis untuk tugas latar belakang.

  5. Jika penggunaan memori masih tinggi setelah melakukan optimasi di atas, pertimbangkan untuk meningkatkan ke spesifikasi dengan kapasitas memori lebih besar agar dapat menangani lebih banyak data dan meningkatkan performa. Untuk informasi selengkapnya, lihat Ubah konfigurasi instans.

    Catatan

    Sebelum meningkatkan instans Anda, Anda dapat membeli instans pay-as-you-go untuk menguji apakah spesifikasi target memenuhi kebutuhan workload Anda. Anda dapat melepas instans tersebut setelah pengujian selesai. Untuk informasi tentang cara melepas instans, lihat Lepaskan instans pay-as-you-go.

Solusi untuk kenaikan memori mendadak

Penyebab

Kenaikan mendadak pada penggunaan memori dapat disebabkan oleh hal-hal berikut:

Kenaikan memori mendadak memiliki empat penyebab utama. Gunakan indikator utama pada setiap bagian untuk mengidentifikasi penyebab yang relevan.

Penyebab

Indikator utama

Volume besar data baru yang ditulis

Lalu lintas inbound dan QPS tulis naik bersamaan dengan penggunaan memori

Lonjakan koneksi baru

Jumlah koneksi naik tajam bersamaan dengan penggunaan memori

Trafik lonjakan menyebabkan backlog buffer

Penggunaan bandwidth mencapai 100%; memori clients.normal tinggi

Client lambat menyebabkan backlog buffer output

big_client_buf bernilai 1 dalam output MEMORY DOCTOR

Volume besar data baru yang ditulis

Masuknya data baru secara cepat langsung meningkatkan konsumsi memori.

Diagnosa

Di halaman Performance Monitor, periksa lalu lintas inbound dan permintaan tulis per detik (QPS). Jika kedua metrik tersebut mengikuti tren yang sama dengan penggunaan memori, lonjakan tersebut disebabkan oleh volume besar data baru.

Selesaikan

  1. Tetapkan nilai time-to-live (TTL) yang sesuai pada kunci untuk secara otomatis menghapus data yang tidak lagi diperlukan. Atau, hapus kunci yang tidak diperlukan secara manual.

  2. Tingkatkan kapasitas memori instans. Untuk detailnya, lihat Ubah konfigurasi instans.

  3. Jika instans Anda adalah instans standar dan penggunaan memori tetap tinggi setelah peningkatan kapasitas, tingkatkan ke instans kluster. Instans kluster mendistribusikan data ke beberapa shard, sehingga mengurangi tekanan memori pada setiap shard. Untuk detailnya, lihat Ubah konfigurasi instans.

Lonjakan koneksi baru

Setiap koneksi client menyisihkan memori untuk buffer input dan output-nya. Lonjakan koneksi mendadak menyebabkan kenaikan yang sesuai pada total penggunaan memori.

Diagnosis

Di halaman Performance Monitor, periksa jumlah koneksi. Jika jumlah koneksi naik tajam bersamaan dengan penggunaan memori, penyebabnya adalah lonjakan koneksi.

Penyelesaian

  1. Periksa kebocoran koneksi pada aplikasi Anda.

  2. Konfigurasikan timeout koneksi untuk secara otomatis menutup koneksi yang menganggur. Untuk detailnya, lihat Tentukan periode timeout untuk koneksi client.

Trafik lonjakan menyebabkan backlog buffer

Ketika akses lonjakan menghasilkan trafik yang melebihi bandwidth jaringan instans, data masuk dan keluar menumpuk di buffer input dan output. Backlog buffer ini mengonsumsi memori tambahan di atas penyimpanan data normal.

Diagnosis

  1. Periksa apakah penggunaan lalu lintas inbound dan outbound telah mencapai 100%.

  2. Jalankan MEMORY STATS dan periksa apakah clients.normal menempati memori dalam jumlah besar.

    Catatan

    clients.normal melaporkan total memori yang dikonsumsi oleh buffer input dan output di seluruh koneksi client normal. Nilai tinggi di sini mengonfirmasi bahwa backlog buffer menjadi pemicu kenaikan memori.

Selesaikan

  1. Identifikasi penyebab lonjakan trafik.

  2. Tingkatkan bandwidth jaringan instans. Untuk detailnya, lihat Tingkatkan bandwidth instans secara manual dan Aktifkan penskalaan otomatis bandwidth.

  3. Tingkatkan spesifikasi instans untuk menyediakan kapasitas buffer yang cukup. Untuk detailnya, lihat Ubah konfigurasi instans.

Client lambat menyebabkan backlog buffer output

Ketika client tidak dapat mengonsumsi respons dengan cukup cepat, data yang belum terkirim menumpuk di buffer output sisi server. Redis mengalokasikan memori untuk setiap respons yang dalam antrian, yang dapat menjadi besar ketika client tertinggal.

Diagnosis

Dalam redis-cli, jalankan MEMORY DOCTOR dan periksa nilai big_client_buf. Jika big_client_buf bernilai 1, setidaknya satu client memiliki buffer output berukuran besar yang mengonsumsi memori signifikan.

Penyelesaian

Jalankan CLIENT LIST dan cari client dengan nilai omem yang tinggi. Bidang omem melaporkan memori yang digunakan oleh buffer output client. Periksa apakah client yang teridentifikasi mengalami masalah performa yang mencegahnya mengonsumsi respons dengan cukup cepat.

Solusi untuk penggunaan memori tinggi pada data node

Gejala

Untuk instans dengan arsitektur kluster, penggunaan memori tinggi pada data node tertentu ditandai oleh gejala berikut:

  • Anda menerima peringatan penggunaan memori dari CloudMonitor. Pesan peringatan menunjukkan bahwa penggunaan memori pada data node tertentu telah melebihi ambang batas.

  • Laporan diagnostik instans menunjukkan adanya kesenjangan penggunaan memori.

  • Di halaman pemantauan performa, Anda melihat bahwa penggunaan memori instans secara keseluruhan rendah, tetapi data node tertentu memiliki penggunaan memori tinggi.

Penyebab

Jika penggunaan memori instans secara keseluruhan rendah sedangkan penggunaan memori pada data node tertentu tinggi, hal ini menunjukkan adanya kesenjangan penggunaan memori.

Solusi

Periksa dan pisahkan kunci besar

Temukan kunci besar

Gunakan fitur analisis kunci offline untuk menemukan kunci besar apa pun.

Untuk metode lain dalam menemukan kunci besar, lihat Kunci besar dan hotkey.

Pisahkan kunci besar

Sebagai contoh, pisahkan kunci HASH dengan puluhan ribu anggota menjadi beberapa kunci HASH yang lebih kecil, masing-masing dengan jumlah anggota yang wajar. Pada instans kluster, memisahkan kunci besar dapat membantu menyeimbangkan penggunaan memori di seluruh shard data.

Periksa penggunaan hash tag

Jika Anda menggunakan hash tag yang menyebabkan konsentrasi data, pertimbangkan untuk membaginya menjadi beberapa hash tag sesuai dengan logika aplikasi Anda. Hal ini membantu mendistribusikan data lebih merata di berbagai shard data.

Tingkatkan spesifikasi instans

Menambah spesifikasi instans meningkatkan memori yang tersedia untuk setiap shard dan dapat menjadi solusi sementara untuk kesenjangan memori. Untuk langkah-langkah detailnya, lihat Ubah konfigurasi instans.

Penting
  • Sistem melakukan pemeriksaan awal terhadap kesenjangan data selama perubahan spesifikasi instans. Jika tipe instans yang Anda pilih tidak dapat menangani masalah kesenjangan data, sistem akan melaporkan error. Pilih tipe instans dengan spesifikasi lebih tinggi dan coba lagi.

  • Setelah Anda meningkatkan spesifikasi instans, kesenjangan penggunaan memori mungkin berkurang. Namun, kesenjangan juga dapat terjadi pada sumber daya bandwidth dan CPU.

Lampiran 1: Penggunaan memori Redis

Memori instans Redis terdiri dari tiga komponen utama:

Komponen memori

Deskripsi

Memori link (dinamis)

Termasuk memori untuk buffer input, buffer output, overhead JIT, fake Lua links, dan cache eksekusi Lua. Anda dapat menjalankan perintah INFO untuk memeriksa informasi cache client pada bagian Clients dalam output.

Catatan

Buffer input dan output terkait dengan setiap koneksi client dan biasanya kecil. Namun, saat Anda melakukan operasi berbasis rentang atau saat kunci besar ditransfer secara lambat, memori yang digunakan oleh buffer ini dapat meningkat, yang memengaruhi area data dan berpotensi menyebabkan error kehabisan memori (OOM).

Data memory

Ini adalah area data pengguna, yang menyimpan informasi nilai aktual. Biasanya ini menjadi fokus utama analisis.

Memori manajemen (statis)

Area ini kecil dan relatif konstan setelah startup. Terdiri dari overhead memori dari tabel hash manajemen data, buffer replikasi, dan buffer AOF (sekitar 32 MB hingga 64 MB).

Catatan

Untuk jumlah kunci yang sangat besar (misalnya, ratusan juta), area ini dapat mengonsumsi memori dalam jumlah signifikan.

Catatan

Manajemen memori dinamis yang tidak efektif menyebabkan sebagian besar skenario OOM. Misalnya, antrian permintaan selama pembatasan laju dapat menyebabkan memori dinamis meningkat pesat. Skrip Lua yang terlalu kompleks atau ditulis dengan buruk juga dapat menyebabkan OOM. Untuk mencegah masalah ini, kami merekomendasikan Tair (Edisi Perusahaan), yang menyediakan kontrol lebih baik atas memori dinamis.

Lampiran 2: Memeriksa penggunaan memori

Perintah MEMORY STATS

Di Redis, jalankan perintah MEMORY STATS untuk menanyakan detail penggunaan memori.

Overhead memori instans Redis terdiri dari dua bagian utama:

  • Overhead memori dari data bisnis. Ini biasanya menjadi fokus utama analisis.

  • Overhead memori dari data non-bisnis, seperti buffer backlog untuk replikasi master-replika dan memori yang dikonsumsi selama inisialisasi proses Redis.

Bagian berikut menunjukkan contoh respons dan penjelasan setiap parameter:

Catatan

Pada respons berikut, nilai memori dalam satuan byte.

 1) "peak.allocated" // Memori puncak yang dikonsumsi oleh proses Redis sejak startup.
 2) (integer) 79492312
 3) "total.allocated" // Total byte yang dialokasikan oleh Redis, yaitu total penggunaan memori saat ini.
 4) (integer) 79307776
 5) "startup.allocated" // Jumlah awal memori yang dikonsumsi oleh Redis saat startup.
 6) (integer) 45582592
 7) "replication.backlog" // Ukuran buffer backlog replikasi.
 8) (integer) 33554432
 9) "clients.slaves" // Ukuran total buffer baca dan tulis untuk semua node replika dalam replikasi master-replika.
10) (integer) 17266
11) "clients.normal" // Ukuran total buffer baca dan tulis untuk semua client reguler (tidak termasuk node replika).
12) (integer) 119102
13) "aof.buffer" // Buffer yang digunakan untuk persistensi AOF dan buffer yang dihasilkan selama penulisan ulang AOF.
14) (integer) 0
15) "db.0"  // Jumlah database bisnis.
16) 1) "overhead.hashtable.main" // Total overhead memori untuk tabel hash database saat ini, yaitu memori metadata.
    2) (integer) 144
    3) "overhead.hashtable.expires" // Memori yang dikonsumsi untuk menyimpan waktu kedaluwarsa kunci.
    4) (integer) 0
17) "overhead.total" // Jumlah semua memori overhead. Dihitung sebagai: startup.allocated + replication.backlog + clients.slaves + clients.normal + aof.buffer + db.X.
18) (integer) 79273616
19) "keys.count" // Total jumlah kunci dalam instans Redis saat ini.
20) (integer) 2
21) "keys.bytes-per-key" // Ukuran rata-rata setiap kunci dalam instans Redis saat ini. Dihitung sebagai: (total.allocated - startup.allocated) / keys.count.
22) (integer) 16862592
23) "dataset.bytes" // Ukuran memori yang ditempati oleh data bisnis murni.
24) (integer) 34160
25) "dataset.percentage" // Persentase memori yang ditempati oleh data bisnis murni. Dihitung sebagai: dataset.bytes * 100 / (total.allocated - startup.allocated).
26) "0.1012892946600914"
27) "peak.percentage" // Rasio total memori saat ini terhadap memori puncak historis. Dihitung sebagai: total.allocated * 100 / peak.allocated.
28) "99.767860412597656"
29) "fragmentation" // Rasio fragmentasi memori.
30) "0.45836541056632996"

Perintah MEMORY DOCTOR

Di Redis, jalankan perintah MEMORY DOCTOR untuk mendapatkan saran diagnostik memori.

Gambar 2. Contoh hasil diagnostik

r-bpxxxxxxxxxxxxxxxxxxxx.redis.rds.aliyuncs.com:6379> MEMORY DOCTOR
"Sam, I detected a few issues in this Redis instance memory implants:\n\n * High
 allocator RSS overhead: This instance has an RSS memory overhead is greater tha
n 1.1 (this means that the Resident Set Size of the allocator is much larger tha
n the sum what the allocator actually holds). This problem is usually due to a l
arge peak memory (check if there is a peak memory entry above in the report), yo
u can try the MEMORY PURGE command to reclaim it.\n\nI'm here to keep you safe,
 Sam. I want to help you.\n"

MEMORY DOCTOR memberikan saran diagnostik memori untuk instans Redis Anda berdasarkan dimensi berikut. Anda dapat menggunakan saran ini untuk merumuskan strategi optimasi yang sesuai:

    int empty = 0;     /* Instance kosong atau hampir kosong. */
    int big_peak = 0;       /* Puncak memori jauh lebih besar daripada memori yang digunakan. */
    int high_frag = 0;      /* Fragmentasi tinggi. */
    int high_alloc_frag = 0;/* Fragmentasi alokator tinggi. */
    int high_proc_rss = 0;  /* Overhead RSS proses tinggi. */
    int high_alloc_rss = 0; /* Overhead RSS dari alokator tinggi. */
    int big_slave_buf = 0;  /* Buffer replika terlalu besar. */
    int big_client_buf = 0; /* Buffer client terlalu besar. */
    int many_scripts = 0;   /* Cache skrip memiliki terlalu banyak skrip. */

Perintah MEMORY USAGE

Di Redis, jalankan perintah MEMORY USAGE untuk menanyakan memori yang dikonsumsi oleh kunci tertentu (dalam byte).

Contoh perintah:

MEMORY USAGE Key0089393003

Contoh respons:

(integer) 1000072