Dokumen ini mencakup cara mengidentifikasi penggunaan memori yang tinggi untuk instance Cloud SQL dan memberikan rekomendasi tentang cara memecahkan masalah terkait memori.
Untuk mempelajari cara mengonfigurasi penggunaan memori untuk instance Cloud SQL, lihat Praktik terbaik untuk mengelola penggunaan memori.
Mengidentifikasi penggunaan memori yang tinggi
Menggunakan Metrics Explorer untuk mengidentifikasi penggunaan memori
Anda dapat meninjau penggunaan memori instance dengan metrik
database/memory/components.usage
di
Metrics Explorer.
Menggunakan Query insights untuk menganalisis rencana penjelasan untuk kueri yang memakai resource tinggi
Query insights membantu Anda mendeteksi, mendiagnosis, dan mencegah masalah performa kueri untuk database Cloud SQL. Query insights memberi Anda daftar kueri yang berjalan lama beserta rencana penjelasannya (dokumentasi PostgreSQL). Tinjau rencana penjelasan dan identifikasi bagian kueri yang memiliki metode pemindaian penggunaan memori yang tinggi. Terlepas dari waktu proses kueri, insight kueri memberi Anda rencana penjelasan untuk seluruh kueri. Identifikasi kueri kompleks yang memerlukan lebih banyak waktu sehingga Anda tahu kueri mana yang memblokir memori untuk durasi yang lebih lama.
Metode pemindaian PostgreSQL umum yang menggunakan memori tinggi meliputi:
- Pemindaian heap bitmap
- Pengurutan cepat
- Hash join atau Hash
Penggunaan memori tinggi dan log yang relevan untuk instance yang mengaktifkan Gemini
Jika Anda mengaktifkan Gemini, koneksi yang menjalankan kueri dengan penggunaan memori tinggi akan dihentikan, sehingga mencegah periode nonaktif database, bukan kegagalan kehabisan memori (OOM) yang menyebabkan periode nonaktif database. Untuk mengidentifikasi kueri default, Anda dapat memeriksa log database untuk menemukan entri berikut:
(...timestamp….) db=postgres, user=customer FATAL: terminating connection due to administrator command
Log database Cloud SQL untuk PostgreSQL berikut ditampilkan yang merekam kueri penggunaan memori tinggi yang dihentikan untuk mencegah OOM. Kueri ini adalah versi normalisasi dari kueri asli:
db=postgres,user=customer LOG: postgres process with PID 1734 for the query "SELECT COUNT(product) AS item_count FROM test_table WHERE product_type = $1 AND product LIKE $2 AND c6_2 IN ($3,$4,$5,$6,$7)" has been cancelled.
Notifikasi juga ditampilkan di halaman Instance Cloud SQL untuk peristiwa berikut:
- Penggunaan memori instance selama 24 jam terakhir.
- Daftar kueri yang dinormalisasi yang telah dibatalkan dalam 24 jam terakhir.
- Link ke dokumentasi Google tentang cara mengoptimalkan penggunaan memori.
Penggunaan Memori Tinggi - Rekomendasi
Rekomendasi berikut membahas masalah umum terkait memori.
Jika instance terus menggunakan memori dalam jumlah besar, kemungkinan besar instance akan mengalami masalah out of memory
.
Jika permintaan memori dari PostgreSQL atau proses lainnya menyebabkan sistem kehabisan memori, Anda akan melihat pesan kernel Out of Memory
di log PostgreSQL dan instance PostgreSQL pada akhirnya dihentikan.
Contoh:
Out of Memory: Killed process 12345 (postgres)
Instance paling umum saat Anda melihat masalah OOM adalah saat nilai work_mem
lebih tinggi dengan jumlah koneksi aktif yang tinggi.
Oleh karena itu, jika Anda sering mendapatkan OOM atau menghindari OOM dalam instance Cloud SQL untuk PostgreSQL, Anda harus mempertimbangkan untuk mengikuti rekomendasi berikut:
Setel
work_mem
Kueri yang menggunakan pengurutan cepat lebih cepat daripada kueri yang menggunakan pengurutan penggabungan eksternal. Namun, aktivitas pertama dapat menyebabkan kehabisan memori. Untuk mengatasi masalah ini, setel nilai
work_mem
dengan cukup wajar sehingga dapat menyeimbangkan keduanya, yaitu operasi pengurutan yang terjadi dalam memori dan disk. Anda juga dapat mempertimbangkan untuk menyetelwork_mem
pada tingkat sesi, bukan menyetelnya untuk seluruh instance.Memantau sesi aktif
Setiap koneksi menggunakan sejumlah memori tertentu. Gunakan kueri berikut untuk memeriksa jumlah koneksi aktif:
SELECT state, usename, count(1) FROM pg_stat_activity WHERE pid <> pg_backend_pid() GROUP BY state, usename ORDER BY 1;
Jika Anda memiliki sesi aktif dalam jumlah besar, analisis penyebab utama untuk jumlah sesi aktif yang tinggi; misalnya, kunci transaksi.
Setel
shared_buffers
Jika
shared_buffers
disetel ke nilai yang lebih tinggi, pertimbangkan untuk mengurangi nilaishared_buffers
agar memori dapat digunakan untuk operasi lain, sepertiwork_mem
, atau untuk membuat koneksi baru.Rasio cache ditemukan
PostgreSQL umumnya mencoba menyimpan data yang paling sering Anda akses di cache. Ketika data diminta oleh klien, jika telah di-cache di buffer bersama, data tersebut akan langsung diberikan ke klien. Hal ini disebut cache ditemukan. Jika data tidak ada di buffer bersama, data akan diambil terlebih dahulu ke buffer bersama dari disk, lalu diberikan ke klien. Hal ini disebut cache tidak ditemukan. Rasio cache ditemukan mengukur jumlah permintaan konten yang telah ditangani oleh cache dibandingkan dengan permintaan yang diterima. Jalankan kueri berikut untuk memeriksa rasio cache ditemukan untuk permintaan tabel di instance PostgreSQL:
SELECT sum(heap_blks_read) as heap_read, sum(heap_blks_hit) as heap_hit, sum(heap_blks_hit) / (sum(heap_blks_hit) + sum(heap_blks_read)) as ratio FROM pg_statio_user_tables;
Jalankan kueri berikut untuk memeriksa rasio cache ditemukan untuk permintaan indeks di instance PostgreSQL:
SELECT sum(idx_blks_read) as idx_read, sum(idx_blks_hit) as idx_hit, (sum(idx_blks_hit) - sum(idx_blks_read)) / sum(idx_blks_hit) as ratio FROM pg_statio_user_indexes;
Pada umumnya, 95 hingga 99% rasio cache ditemukan dianggap sebagai nilai yang baik.
Mengaktifkan halaman besar Cloud SQL untuk PostgreSQL secara default telah mengaktifkan
huge_pages
untuk pengelolaan memori yang lebih baik. Kami merekomendasikan Anda untuk mengaktifkannya. Untuk mempelajarihuge_pages
lebih lanjut, lihat dokumentasi PostreSQL.Setel
max_locks_per_transaction
Nilai
max_locks_per_transaction
menunjukkan jumlah objek database yang dapat dikunci secara bersamaan. Dalam sebagian besar kasus, nilai default 64 sudah cukup. Namun, jika Anda menangani set data yang besar, Anda mungkin akan mendapatkan OOM. Pertimbangkan untuk meningkatkan nilaimax_locks_per_transaction
dengan cukup tinggi untuk menghindari OOM.Nilai
max_locks_per_transaction
harus berupa objekmax_locks_per_transaction
* (max_connections
+max_prepared_transactions
). Artinya, jika Anda memiliki 300 ribu objek, dan jika nilaimax_connections
adalah 200, makamax_locks_per_transaction
harus 1500.Setel
max_pred_locks_per_transaction
Transaksi mungkin gagal jika Anda memiliki klien yang menyentuh banyak tabel yang berbeda dalam satu transaksi serialisasi. Dalam skenario tersebut, pertimbangkan untuk meningkatkan
max_pred_locks_per_transaction
ke nilai yang cukup tinggi. Sepertimax_locks_per_transaction
,max_pred_locks_per_transaction
juga menggunakan memori bersama sehingga jangan menetapkan nilai tinggi yang tidak wajar.Jika penggunaan memori masih tinggi dan Anda merasa kueri tersebut adalah traffic yang sah, pertimbangkan untuk meningkatkan jumlah resource memori dalam instance Anda untuk menghindari error atau periode nonaktif database.