Postgresql 8.3: Batasi konsumsi sumber daya per permintaan

12

Saya menggunakan PostgreSQL 8.3 + PostGIS 1.3 untuk menyimpan data geospasial di Ubuntu 8.04 Hardy .

Versi PostGIS tertentu ini memiliki bug ketika menghitung buffer()segmen yang sangat kompleks, yang menyebabkan kueri mengambil lebih banyak dan lebih banyak memori hingga seluruh mesin macet.

Saya mencari mekanisme PostgreSQL yang dapat:

  • Batasi konsumsi memori (dan mungkin sumber daya lainnya) yang digunakan oleh permintaan tertentu.
  • Secara otomatis menghentikan kueri yang waktu eksekusi melebihi batas tertentu.

Ada ide?

Adam Matan
sumber
Mengapa Anda terus menggunakan versi yang memiliki bug yang menggigit Anda? Gunakan versi yang diperbaiki dan masalah Anda hilang.
Frank Heikens
Benar, tetapi kadang-kadang ada bug dalam kode kami, atau hanya permintaan yang membutuhkan waktu terlalu lama. Saya ingin mereka mati dengan pesan kesalahan log.
Adam Matan

Jawaban:

9

Untuk membatasi konsumsi memori, parameter konfigurasi utama adalah work_mem. Karena ini berlaku per operasi, bukan per kueri, Anda tidak bisa hanya mengaturnya ke N jika Anda ingin menghabiskan jumlah memori N, tetapi Anda harus mengubah dan menyelaraskannya sedikit untuk mendapatkan hasil yang diinginkan.

Namun, ini tidak membantu jika ada bug dan kebocoran memori lainnya dalam kode server atau ekstensi. Anda bisa mengendalikannya dengan batas sumber daya spesifik proses yang dikendalikan oleh ulimit. Tetapi jika Anda mencapai batas dan alokasi memori gagal, apa yang Anda inginkan terjadi? Mungkin tidak akan berperilaku terlalu baik. Lebih baik memperbaiki bug itu atau menggunakan versi yang berbeda.

Stop kueri yang waktu eksekusi melewati ambang batas, gunakan parameter `statement_timeout ', misalnya,

SET statement_timeout TO '10min';
Peter Eisentraut
sumber
Bagus. Apa yang saya cari.
Adam Matan
2

Lihatlah Postgres Wiki :

PostgreSQL tidak memiliki fasilitas untuk membatasi sumber daya apa yang dikonsumsi pengguna, kueri, atau basis data, atau sesuai dengan itu untuk menetapkan prioritas sehingga satu pengguna / kueri / basis data mendapatkan lebih banyak sumber daya daripada lainnya. Penting untuk menggunakan fasilitas sistem operasi untuk mencapai prioritas apa yang dimungkinkan.

Anda dapat menyesuaikan pengaturan kinerja pada per pengguna atau per basis data tetapi tidak kapan harus membatalkan permintaan tertentu.

DrColossos
sumber
+1 Bagaimana dengan pengaturan maksimum untuk jumlah memori yang dapat dikonsumsi seluruh cluster?
Adam Matan