All Products
Search
Document Center

PolarDB:Resource Manager

Last Updated:Jan 28, 2026

Topik ini menjelaskan fitur Resource Manager dari PolarDB for PostgreSQL.

Penerapan

Versi berikut dari PolarDB for PostgreSQL didukung:

  • PostgreSQL 18 (minor engine version 2.0.18.0.1.0 atau lebih baru)

  • PostgreSQL 17 (minor engine version 2.0.17.2.1.0 atau lebih baru)

  • PostgreSQL 16 (minor engine version 2.0.16.3.1.1 atau lebih baru)

  • PostgreSQL 15 (minor engine version 2.0.15.7.2.0 atau lebih baru)

  • PostgreSQL 14 (minor engine version 2.0.14.5.1.0 atau lebih baru)

  • PostgreSQL 11 (minor engine version 2.0.11.2.1.0 atau lebih baru)

Catatan

Anda dapat memeriksa minor engine version di Konsol atau dengan menjalankan pernyataan SHOW polardb_version;. Jika minor engine version Anda tidak memenuhi persyaratan, Anda harus melakukan upgrade minor engine version.

Informasi latar belakang

Memori kluster PolarDB for PostgreSQL dibagi menjadi tiga bagian berikut:

  • Memori bersama

  • Dynamic shared memory

  • Private memory

Dynamic shared memory dan private memory dialokasikan secara dinamis. Penggunaannya berfluktuasi berdasarkan beban kerja kluster. Penggunaan dynamic shared memory dan private memory yang berlebihan dapat menyebabkan total penggunaan memori melebihi batas sistem operasi, sehingga memicu mekanisme pembatasan memori kernel yang berpotensi mengakibatkan proses kluster keluar secara tak terduga, restart kluster, atau bahkan ketidaktersediaan kluster.

Memori yang dikelola oleh MemoryContext dalam private memory dapat dibagi menjadi dua bagian berikut:

  • Memori area komputasi kerja adalah memori yang diperlukan untuk pengoperasian normal layanan Anda.

  • Cache memory: digunakan oleh proses database untuk menyimpan cache metadata internal. Penggunaan memori ini hanya memengaruhi performa database.

Untuk mengatasi masalah ini, PolarDB for PostgreSQL menyediakan fitur Resource Manager. Fitur ini secara berkala memantau penggunaan resource selama kluster berjalan dan memberlakukan pembatasan pada proses yang melebihi ambang batas resource guna mengurangi risiko ketidaktersediaan kluster.

Resource Manager dapat membatasi resource memori, CPU, dan I/O. Namun, saat ini hanya mendukung pembatasan memori.

Cara kerjanya

Pembatasan memori bergantung pada cgroups. Jika cgroups tidak tersedia, pembatasan resource tidak dapat diterapkan secara efektif. Resource Manager adalah proses daemon latar belakang untuk PolarDB for PostgreSQL. Proses ini secara berkala membaca data penggunaan memori dari cgroups untuk menentukan kapan harus menerapkan pembatasan memori. Saat Resource Manager mendeteksi bahwa penggunaan memori kluster telah melebihi ambang batas, proses ini membaca pencatatan memori kernel untuk proses pengguna. Kemudian, proses-proses tersebut diurutkan berdasarkan penggunaan memorinya, dan sinyal interrupt (SIGTERM) atau sinyal cancel (SIGINT) dikirim ke proses yang paling banyak mengonsumsi memori, dimulai dari konsumen terbesar.

Metode batas memori

Proses daemon Resource Manager dimulai bersamaan dengan kluster dan aktif pada node primary (RW), read-only (RO), dan standby. Anda dapat mengubah perilaku Resource Manager dengan memodifikasi parameter berikut.

Resource Manager membatasi memori sebagai berikut: ketika penggunaan memori kluster melebihi tingkat watermark yang ditentukan oleh parameter Resource Manager, sinyal SIGTERM dikirim ke proses yang mengonsumsi memori dalam jumlah besar. Hal ini menghentikan proses tersebut dan melepaskan memori. Tabel berikut menjelaskan parameter terkait.

Parameter

Deskripsi

polar_resource_manager.enable_resource_manager

Menentukan apakah Resource Manager diaktifkan. Nilai yang valid:

  • on (default): Mengaktifkan Resource Manager.

  • off: Menonaktifkan Resource Manager.

polar_resource_manager.stat_interva

Interval pemeriksaan berkala penggunaan resource. Satuan: milidetik. Rentang nilai: 10 hingga 10000. Nilai default: 500.

polar_resource_manager.total_mem_limit_rate

Persentase penggunaan memori kluster yang berfungsi sebagai batas. Ketika penggunaan memori kluster melebihi persentase ini, resource memori akan dibatasi secara paksa. Nilai default: 95.

polar_resource_manager.total_mem_limit_remain_size

Jumlah memori cadangan untuk kluster. Ketika memori kluster yang tersedia turun di bawah nilai ini, resource memori akan dibatasi secara paksa. Satuan: KB. Rentang nilai: 0 hingga MAX_KILOBYTES (nilai integer maksimum). Nilai default: 262144.

polar_resource_manager.mem_release_policy

Kebijakan untuk membatasi resource memori. Nilai yang valid:

  • none: Tidak ada aksi yang diambil.

  • default (nilai default): Kebijakan default. Pertama kali menghentikan proses idle, lalu menghentikan proses aktif.

  • cancel_query: Menghentikan proses aktif.

  • terminate_idle_backend: Menghentikan proses idle.

  • terminate_any_backend: Menghentikan semua proses.

  • terminate_random_backend: Menghentikan proses secara acak.

Contoh

Ketika proses session pengguna menerima sinyal SIGTERM, proses tersebut dihentikan dan informasi tentang penghentian tersebut dicatat dalam log. Berikut adalah contoh output log:

2022-11-28 14:07:56.929 UTC [18179] LOG:  [polar_resource_manager] terminate process 13461 release memory 65434123 bytes
2022-11-28 14:08:17.143 UTC [35472] FATAL:  terminating connection due to out of memory
2022-11-28 14:08:17.143 UTC [35472] BACKTRACE:
        postgres: primary: postgres postgres [local] idle(ProcessInterrupts+0x34c) [0xae5fda]
        postgres: primary: postgres postgres [local] idle(ProcessClientReadInterrupt+0x3a) [0xae1ad6]
        postgres: primary: postgres postgres [local] idle(secure_read+0x209) [0x8c9070]
        postgres: primary: postgres postgres [local] idle() [0x8d4565]
        postgres: primary: postgres postgres [local] idle(pq_getbyte+0x30) [0x8d4613]
        postgres: primary: postgres postgres [local] idle() [0xae1861]
        postgres: primary: postgres postgres [local] idle() [0xae1a83]
        postgres: primary: postgres postgres [local] idle(PostgresMain+0x8df) [0xae7949]
        postgres: primary: postgres postgres [local] idle() [0x9f4c4c]
        postgres: primary: postgres postgres [local] idle() [0x9f440c]
        postgres: primary: postgres postgres [local] idle() [0x9ef963]
        postgres: primary: postgres postgres [local] idle(PostmasterMain+0x1321) [0x9ef18a]
        postgres: primary: postgres postgres [local] idle() [0x8dc1f6]
        /lib64/libc.so.6(__libc_start_main+0xf5) [0x7f888afff445]
        postgres: primary: postgres postgres [local] idle() [0x49d209]