PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Apa yang Harus Diperiksa jika Pemanfaatan Memori PostgreSQL Tinggi

Membaca dari memori akan selalu lebih baik daripada pergi ke disk, jadi untuk semua teknologi database Anda ingin menggunakan memori sebanyak mungkin. Jika Anda tidak yakin tentang konfigurasi, atau Anda mengalami kesalahan, hal ini dapat menyebabkan penggunaan memori yang tinggi atau bahkan masalah kehabisan memori.

Di blog ini, kita akan melihat cara memeriksa penggunaan memori PostgreSQL Anda dan parameter mana yang harus Anda pertimbangkan untuk menyetelnya. Untuk ini, mari kita mulai dengan melihat ikhtisar arsitektur PostgreSQL.

Arsitektur PostgreSQL

Arsitektur PostgreSQL didasarkan pada tiga bagian mendasar:Proses, Memori, dan Disk.

Memori dapat diklasifikasikan menjadi dua kategori:

  • Memori Lokal :Itu dimuat oleh setiap proses backend untuk digunakan sendiri untuk pemrosesan kueri. Ini dibagi menjadi sub-area:
    • Work mem:Work mem digunakan untuk menyortir tupel berdasarkan operasi ORDER BY dan DISTINCT, dan untuk menggabungkan tabel.
    • Mem pemeliharaan pekerjaan:Beberapa jenis operasi pemeliharaan menggunakan area ini. Misalnya, VACUUM, jika Anda tidak menentukan autovacuum_work_mem.
    • Buffer sementara:Digunakan untuk menyimpan tabel sementara.
  • Memori Bersama :Itu dialokasikan oleh server PostgreSQL saat dimulai, dan digunakan oleh semua proses. Ini dibagi menjadi sub-area:
    • Kolam buffer bersama:Tempat PostgreSQL memuat halaman dengan tabel dan indeks dari disk, untuk bekerja langsung dari memori, mengurangi akses disk.
    • WAL buffer:Data WAL adalah log transaksi di PostgreSQL dan berisi perubahan dalam database. Buffer WAL adalah area di mana data WAL disimpan sementara sebelum menulisnya ke disk ke dalam file WAL. Ini dilakukan setiap beberapa waktu yang telah ditentukan yang disebut pos pemeriksaan. Ini sangat penting untuk menghindari hilangnya informasi jika terjadi kegagalan server.
    • Komit log:Ini menyimpan status semua transaksi untuk kontrol konkurensi.

Cara Mengetahui Apa yang Terjadi

Jika Anda memiliki penggunaan memori yang tinggi, pertama-tama, Anda harus mengonfirmasi proses mana yang menghasilkan konsumsi.

Menggunakan Perintah Linux “Atas”

Perintah linux teratas mungkin merupakan opsi terbaik di sini (atau bahkan perintah serupa satu seperti htop). Dengan perintah ini, Anda dapat melihat proses/proses yang memakan terlalu banyak memori.

Saat Anda mengonfirmasi bahwa PostgreSQL bertanggung jawab atas masalah ini, langkah selanjutnya adalah memeriksa alasannya.

Menggunakan Log PostgreSQL

Memeriksa PostgreSQL dan log sistem jelas merupakan cara yang baik untuk mendapatkan lebih banyak informasi tentang apa yang terjadi di database/sistem Anda. Anda dapat melihat pesan seperti:

Resource temporarily unavailable

Out of memory: Kill process 1161 (postgres) score 366 or sacrifice child

Jika Anda tidak memiliki cukup memori bebas.

Atau bahkan beberapa kesalahan pesan database seperti:

FATAL:  password authentication failed for user "username"

ERROR:  duplicate key value violates unique constraint "sbtest21_pkey"

ERROR:  deadlock detected

Bila Anda mengalami beberapa perilaku tak terduga di sisi database. Jadi, log berguna untuk mendeteksi masalah semacam ini dan bahkan lebih banyak lagi. Anda dapat mengotomatiskan pemantauan ini dengan mengurai file log yang mencari pekerjaan seperti “FATAL”, “ERROR” atau “Kill”, sehingga Anda akan menerima peringatan saat itu terjadi.

Menggunakan Pg_top

Jika Anda tahu bahwa proses PostgreSQL memiliki penggunaan memori yang tinggi, tetapi log tidak membantu, Anda memiliki alat lain yang dapat berguna di sini, pg_top.

Alat ini mirip dengan alat linux teratas, tetapi khusus untuk PostgreSQL. Jadi, dengan menggunakannya, Anda akan memiliki informasi lebih rinci tentang apa yang menjalankan database Anda, dan Anda bahkan dapat mematikan kueri, atau menjalankan tugas penjelasan jika Anda mendeteksi sesuatu yang salah. Anda dapat menemukan informasi lebih lanjut tentang alat ini di sini.

Tetapi apa yang terjadi jika Anda tidak dapat mendeteksi kesalahan apa pun, dan database masih menggunakan banyak RAM. Jadi, Anda mungkin perlu memeriksa konfigurasi database.

Parameter Konfigurasi Yang Harus Diperhitungkan

Jika semuanya terlihat baik-baik saja tetapi Anda masih memiliki masalah penggunaan yang tinggi, Anda harus memeriksa konfigurasi untuk mengonfirmasi apakah sudah benar. Jadi, berikut ini adalah parameter yang harus Anda perhatikan dalam hal ini.

shared_buffers

Ini adalah jumlah memori yang digunakan server database untuk buffer memori bersama. Jika nilai ini terlalu rendah, database akan menggunakan lebih banyak disk, yang akan menyebabkan lebih banyak kelambatan, tetapi jika terlalu tinggi, dapat menghasilkan penggunaan memori yang tinggi. Menurut dokumentasi, jika Anda memiliki server database khusus dengan RAM 1 GB atau lebih, nilai awal yang masuk akal untuk shared_buffers adalah 25% dari memori di sistem Anda.

work_mem

Ini menentukan jumlah memori yang akan digunakan oleh ORDER BY, DISTINCT dan JOIN sebelum menulis ke file-file sementara pada disk. Seperti shared_buffers, jika kita mengkonfigurasi parameter ini terlalu rendah, kita dapat memiliki lebih banyak operasi masuk ke disk, tetapi terlalu tinggi berbahaya untuk penggunaan memori. Nilai defaultnya adalah 4 MB.

koneksi_maks

Work_mem juga berjalan beriringan dengan nilai max_connections, karena setiap koneksi akan menjalankan operasi ini pada saat yang sama, dan setiap operasi akan diizinkan menggunakan memori sebanyak yang ditentukan oleh nilai ini sebelumnya mulai menulis data dalam file sementara. Parameter ini menentukan jumlah maksimum koneksi simultan ke database kami, jika kami mengonfigurasi sejumlah besar koneksi, dan tidak memperhitungkannya, Anda dapat mulai mengalami masalah sumber daya. Nilai defaultnya adalah 100.

temp_buffers

Buffer sementara digunakan untuk menyimpan tabel sementara yang digunakan di setiap sesi. Parameter ini menetapkan jumlah maksimum memori untuk tugas ini. Nilai defaultnya adalah 8 MB.

maintenance_work_mem

Ini adalah memori maksimal yang dapat digunakan oleh operasi seperti Penyedotan Debu, penambahan indeks, atau kunci asing. Hal yang baik adalah bahwa hanya satu operasi jenis ini yang dapat dijalankan dalam satu sesi, dan bukan hal yang paling umum untuk menjalankan beberapa operasi ini secara bersamaan dalam sistem. Nilai default adalah 64 MB.

autovacuum_work_mem

Vacuum menggunakan maintenance_work_mem secara default, tetapi kita dapat memisahkannya menggunakan parameter ini. Kami dapat menentukan jumlah maksimum memori yang akan digunakan oleh setiap pekerja autovacuum di sini.

wal_buffers

Jumlah memori bersama yang digunakan untuk data WAL yang belum ditulis ke disk. Pengaturan default adalah 3% dari shared_buffers, tetapi tidak kurang dari 64kB atau lebih dari ukuran satu segmen WAL, biasanya 16MB.

Kesimpulan

Ada berbagai alasan untuk memiliki penggunaan memori yang tinggi, dan mendeteksi masalah root bisa menjadi tugas yang memakan waktu. Di blog ini, kami menyebutkan berbagai cara untuk memeriksa penggunaan memori PostgreSQL Anda dan parameter mana yang harus Anda pertimbangkan untuk menyesuaikannya, untuk menghindari penggunaan memori yang berlebihan.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pemesanan kueri lambat menurut kolom dalam tabel yang digabungkan

  2. Mendapatkan kesalahan saat memetakan kolom PostgreSQL LTREE di hibernate

  3. Bagaimana Sin() Bekerja di PostgreSQL

  4. Cara mengurai JSON di postgresql

  5. Barman 2.11:barman-cloud-restore dan barman-cloud-wal-restore