Jika Anda menerima peringatan penggunaan memori tinggi untuk instans Tair (Redis OSS-compatible) atau aplikasi Anda mengalami error out-of-memory (OOM), tetapi penggunaan memori yang ditampilkan di Pemantauan Kinerja terlihat rendah, topik ini menjelaskan kemungkinan penyebab dan solusinya.
Gejala
Gejala 1:
Anda menerima peringatan memori instans yang menunjukkan bahwa penggunaan memori telah melebihi ambang batas (misalnya, nilai rata-rata >= 90% selama tiga pengukuran berturut-turut), tetapi halaman Performance Monitoring di konsol menunjukkan bahwa penggunaan memori secara keseluruhan rendah.
Gejala 2:
Aplikasi Anda mengembalikan error command not allowed when used memory > 'maxmemory', tetapi halaman Performance Monitoring menunjukkan bahwa memori secara keseluruhan belum habis atau hanya satu node data saja yang memiliki penggunaan memori tinggi.
Penyebab
Ketidaksesuaian antara pemantauan dan peringatan
Ketidaksesuaian antara penggunaan memori di Performance Monitoring dan peringatan memori dapat terjadi jika Anda menggunakan cluster instance. Peringatan biasanya mencerminkan metrik dari satu data node, sedangkan Anda melihat metrik keseluruhan instans. Untuk cluster instance, metrik Cloud Monitor seperti ShardingMemoryUsage dilaporkan pada tingkat shard data: setiap shard data melaporkan penggunaan memorinya secara independen. MemoryUsage adalah metrik tingkat instans. Persentase penggunaan memori yang ditampilkan untuk metrik keseluruhan instans di konsol merupakan nilai rata-rata dari semua shard data, sedangkan peringatan memori dipicu berdasarkan penggunaan memori satu shard data tertentu. Akibatnya, peringatan dapat muncul ketika penggunaan memori satu shard data melebihi ambang batas, meskipun rata-rata penggunaan memori seluruh instans masih berada di bawah ambang batas tersebut.
Periksa detail peringatan yang Anda terima. Jika peringatan tersebut berisi bidang nodeId = <Instance ID>-db-<Number>, hal ini menunjukkan bahwa hanya node data tertentu dengan ID <Instance ID>-db-<Number> yang melebihi ambang batas memori.
Ikuti langkah-langkah berikut untuk memastikan bahwa penggunaan memori node data sesuai dengan peringatan tersebut.
Masuk ke konsol dan buka halaman Instances. Di bilah navigasi atas, pilih wilayah tempat instans yang ingin Anda kelola berada. Lalu, temukan instans tersebut dan klik ID instans-nya.
-
Di panel navigasi sebelah kiri, klik Performance Monitoring.
-
Klik tab Data Node dan pilih node data yang sesuai dengan
<Instance ID>-db-<Number>. Periksa apakah penggunaan memorinya sesuai dengan nilai dalam peringatan. Anda dapat melihat grafik pemantauan untuk CPU Usage dan Memory Usage pada Data Node yang dipilih.
Kesenjangan data memori di antara node data
Ketika satu atau beberapa node data dalam cluster instance memiliki penggunaan memori yang jauh lebih tinggi dibandingkan yang lain, hal ini menunjukkan adanya kesenjangan data memori (memory skew). Anda dapat menggunakan fitur instance diagnostics untuk memeriksa secara cepat apakah instans Anda mengalami masalah kesenjangan data.
Apa yang menyebabkan kesenjangan data memori
Penyebab utama kesenjangan data memori adalah:
-
Keberadaan kunci besar.
Cluster instance menggunakan algoritma cyclic redundancy check (CRC) untuk menghitung slot tempat suatu kunci ditempatkan, lalu menuliskan datanya ke shard data yang sesuai.
Bahkan jika kunci-kunci tersebar merata di seluruh shard data, satu kunci yang menyimpan terlalu banyak atau field yang terlalu besar dapat menjadi large key, sehingga menyebabkan kesenjangan data memori.
-
Penggunaan hash tags.
Saat menggunakan hash tag, seperti pada
user:{1000}:name, instans melakukan perhitungan CRC terhadap string di dalam tanda kurung kurawal ({}). Kunci-kunci dengan hash tag yang sama akan dipetakan ke slot yang sama dan disimpan di shard data yang sama. Jika sejumlah besar kunci menggunakan hash tag yang sama, data akan terkonsentrasi pada satu shard data, sehingga menyebabkan kesenjangan data memori.
Solusi
Periksa dan lakukan pemisahan large keys
Temukan kunci besar
Gunakan fitur offline key analysis untuk menemukan large keys.
Untuk metode lain dalam menemukan large keys, lihat Large keys and hotkeys.
Memecah kunci besar
Sebagai contoh, pisahkan kunci HASH yang memiliki puluhan ribu anggota menjadi beberapa kunci HASH yang lebih kecil, masing-masing dengan jumlah anggota yang wajar. Dalam cluster instance, memisahkan large keys dapat membantu menyeimbangkan penggunaan memori di seluruh shard data secara signifikan.
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 ke berbagai shard data.
Lakukan peningkatan spesifikasi instans
Menambah spesifikasi instans meningkatkan kapasitas memori yang tersedia untuk setiap shard dan dapat menjadi solusi sementara untuk mengatasi kesenjangan data memori. Untuk langkah-langkah detailnya, lihat Change instance configuration.
Sistem melakukan pemeriksaan awal (precheck) terhadap kesenjangan data saat mengubah konfigurasi instans. Jika tipe instans yang Anda pilih tidak mampu menangani masalah kesenjangan data, sistem akan menampilkan 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 bandwidth dan sumber daya CPU.