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

Arsitektur dan Penyetelan Memori di Database PostgreSQL

Manajemen memori di PostgreSQL penting untuk meningkatkan kinerja server database. File konfigurasi PostgreSQL (postgres.conf) mengatur konfigurasi server database. Ini menggunakan nilai parameter default, tetapi kami dapat mengubah nilai ini untuk mencerminkan beban kerja dan lingkungan operasi dengan lebih baik.

Di blog ini, kami akan membahas parameter terkait memori ini. Namun sebelum kita mulai, mari kita lihat arsitektur memori di PostgreSQL.

Arsitektur Memori

Memori di PostgreSQL dapat diklasifikasikan menjadi dua kategori:

  1. Area Memori Lokal:Ini dialokasikan oleh setiap proses backend untuk digunakan sendiri.
  2. Area memori bersama:Digunakan oleh semua proses server PostgreSQL.

Area Memori Lokal

Di PostgreSQL, setiap proses backend mengalokasikan memori lokal untuk pemrosesan kueri; setiap area dibagi menjadi sub-area yang ukurannya tetap atau bervariasi.

Sub-areanya adalah sebagai berikut.

Kerja_mem

Eksekutor menggunakan area ini untuk menyortir tupel berdasarkan operasi ORDER BY dan DISTINCT. Itu juga menggunakannya untuk menggabungkan tabel dengan operasi gabung-gabung dan gabung-hash.

Maintenance_work_mem

Parameter ini digunakan untuk beberapa jenis operasi pemeliharaan (VACUUM, REINDEX).

Temp_buffers

Pelaksana menggunakan area ini untuk menyimpan tabel sementara.

Area Memori Bersama

Area memori bersama dialokasikan oleh server PostgreSQL saat dijalankan. Area ini dibagi menjadi beberapa sub-area berukuran tetap.

Kolam buffer bersama

PostgreSQL memuat halaman dalam tabel dan indeks dari penyimpanan persisten ke kumpulan buffer bersama, lalu mengoperasikannya secara langsung.

penyangga WAL

PostgreSQL mendukung mekanisme WAL (Write forward log) untuk memastikan bahwa tidak ada data yang hilang setelah kegagalan server. Data WAL sebenarnya adalah log transaksi di PostgreSQL dan buffer WAL adalah area buffering dari data WAL sebelum menulisnya ke penyimpanan persisten.

Log Komit

Commit log (CLOG) menyimpan status semua transaksi, dan merupakan bagian dari mekanisme kontrol konkurensi. Log komit dialokasikan ke memori bersama dan digunakan selama pemrosesan transaksi.

PostgreSQL mendefinisikan empat status transaksi berikut.

  1. IN_PROGRESS
  2. BERKOMITMEN
  3. DIBATALKAN
  4. SUB-KOMITMEN
Unduh Whitepaper Hari Ini Pengelolaan &Otomatisasi PostgreSQL dengan ClusterControlPelajari tentang apa yang perlu Anda ketahui untuk menerapkan, memantau, mengelola, dan menskalakan PostgreSQLUnduh Whitepaper

Menyetel Parameter Memori PostgreSQL

Ada beberapa parameter penting yang direkomendasikan untuk manajemen memori di PostgreSQL. Anda harus mempertimbangkan hal-hal berikut.

Shared_buffers

Parameter ini menunjukkan jumlah memori yang digunakan untuk buffer memori bersama. Parameter shared_buffers menentukan berapa banyak memori yang didedikasikan ke server untuk menyimpan data. Nilai default shared_buffers biasanya 128 megabyte (128MB).

Nilai default parameter ini sangat rendah karena pada beberapa platform seperti versi Solaris dan SGI yang lebih lama, memiliki nilai yang besar memerlukan tindakan invasif seperti mengkompilasi ulang kernel. Bahkan pada sistem Linux modern, kernel kemungkinan tidak akan mengizinkan pengaturan shared_buffers ke lebih dari 32 MB tanpa menyesuaikan pengaturan kernel terlebih dahulu.

Mekanismenya telah berubah di PostgreSQL 9.4 dan yang lebih baru, jadi pengaturan kernel tidak perlu disesuaikan di sana.

Jika ada beban tinggi pada server database, maka menyetel nilai tinggi akan meningkatkan kinerja.

Jika Anda memiliki server DB khusus dengan RAM 1 GB atau lebih, nilai awal yang masuk akal untuk parameter konfigurasi shared_buffer adalah 25% dari memori di sistem Anda.

Nilai default shared_buffers =128 MB. Perubahan memerlukan restart server PostgreSQL.

Rekomendasi umum untuk mengatur shared_buffers adalah sebagai berikut.

  • Di bawah memori 2 GB, setel nilai shared_buffers menjadi 20% dari total memori sistem.
  • Di bawah memori 32 GB, setel nilai shared_buffers menjadi 25% dari total memori sistem.
  • Di atas memori 32GB, setel nilai shared_buffers menjadi 8GB

Kerja_mem

Parameter ini menentukan jumlah memori yang akan digunakan oleh operasi sortir internal dan tabel hash sebelum menulis ke file disk sementara. Jika banyak pengurutan kompleks terjadi, dan Anda memiliki cukup memori, maka meningkatkan parameter work_mem memungkinkan PostgreSQL melakukan pengurutan dalam memori yang lebih besar yang akan lebih cepat daripada yang setara berbasis disk.

Perhatikan bahwa untuk kueri yang kompleks, banyak operasi pengurutan atau hash mungkin berjalan secara paralel. Setiap operasi akan diizinkan untuk menggunakan memori sebanyak yang ditentukan oleh nilai ini sebelum mulai menulis data ke dalam file sementara. Ada satu kemungkinan bahwa beberapa sesi dapat melakukan operasi seperti itu secara bersamaan. Oleh karena itu, total memori yang digunakan bisa berkali-kali lipat dari nilai parameter work_mem.

Harap diingat bahwa ketika memilih nilai yang tepat. Operasi pengurutan digunakan untuk ORDER BY, DISTINCT, dan gabungan gabungan. Tabel hash digunakan dalam gabungan hash, pemrosesan subkueri IN berbasis hash, dan agregasi berbasis hash.

Parameter log_temp_files dapat digunakan untuk mencatat jenis, hash, dan file temp yang dapat berguna dalam mencari tahu apakah jenis tumpah ke disk alih-alih pas di memori. Anda dapat memeriksa jenis yang tumpah ke disk menggunakan paket EXPLAIN ANALYZE. Misalnya, pada output EXPLAIN ANALYZE, jika Anda melihat baris seperti:“Sort Method:external merge Disk:7528kB ”, work_mem minimal 8 MB akan menyimpan data perantara dalam memori dan meningkatkan waktu respons kueri.

Nilai default work_mem =4MB.

Rekomendasi umum untuk menyetel work_mem adalah sebagai berikut.

  • Mulai dengan nilai rendah:32-64MB
  • Kemudian cari baris 'file sementara' di log
  • Setel ke 2-3 kali file temp terbesar

pemeliharaan _work_mem

Parameter ini menentukan jumlah maksimum memori yang digunakan oleh operasi pemeliharaan seperti VACUUM, CREATE INDEX dan ALTER TABLE ADD FOREIGN KEY. Karena hanya satu dari operasi ini yang dapat dieksekusi pada satu waktu oleh sesi database dan instalasi PostgreSQL tidak memiliki banyak dari mereka yang berjalan secara bersamaan, aman untuk mengatur nilai maintenance_work_mem secara signifikan lebih besar dari work_mem.

Menyetel nilai yang lebih besar dapat meningkatkan kinerja untuk menyedot debu dan memulihkan dump basis data.

Penting untuk diingat bahwa ketika autovacuum berjalan, hingga autovacuum_max_workers kali memori ini dapat dialokasikan, jadi berhati-hatilah untuk tidak menetapkan nilai default terlalu tinggi.

Nilai default maintenance_work_mem =64MB.

Rekomendasi umum untuk menyetel maintenance_work_mem adalah sebagai berikut.

  • Setel nilai 10% dari memori sistem, hingga 1 GB
  • Mungkin Anda dapat mengaturnya lebih tinggi lagi jika Anda mengalami masalah VAKUM

Effective_cache_size

Effective_cache_size harus disetel ke perkiraan berapa banyak memori yang tersedia untuk cache disk oleh sistem operasi dan di dalam database itu sendiri. Ini adalah panduan untuk berapa banyak memori yang Anda harapkan akan tersedia di sistem operasi dan cache buffer PostgreSQL, bukan alokasi.

Perencana kueri PostgreSQL menggunakan nilai ini untuk mengetahui apakah paket yang dipertimbangkannya diharapkan sesuai dengan RAM atau tidak. Jika disetel terlalu rendah, indeks mungkin tidak digunakan untuk mengeksekusi kueri seperti yang Anda harapkan. Karena sebagian besar sistem Unix cukup agresif saat melakukan caching, setidaknya 50% dari RAM yang tersedia di server database khusus akan penuh dengan data yang di-cache.

Rekomendasi umum untuk effective_cache_size adalah sebagai berikut.

  • Setel nilai ke jumlah cache sistem file yang tersedia
  • Jika Anda tidak tahu, atur nilainya menjadi 50% dari total memori sistem

Nilai default effective_cache_size =4GB.

Temp_buffers

Parameter ini menetapkan jumlah maksimum buffer sementara yang digunakan oleh setiap sesi database. Buffer lokal sesi hanya digunakan untuk akses ke tabel sementara. Pengaturan parameter ini dapat diubah dalam sesi individu tetapi hanya sebelum penggunaan pertama tabel sementara dalam sesi.

Basis data PostgreSQL menggunakan area memori ini untuk menyimpan tabel sementara dari setiap sesi, ini akan dihapus saat koneksi ditutup.

Nilai default temp_buffer =8MB.

Kesimpulan

Memahami arsitektur memori dan menyetel parameter yang sesuai adalah penting untuk meningkatkan kinerja. Hal ini terutama diperlukan untuk sistem beban kerja yang tinggi. Untuk kiat penyetelan kinerja umum lainnya, harap tinjau lembar contekan kinerja ini untuk PostgreSQL.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menjalankan beberapa pernyataan dengan Postgresql melalui SQLAlchemy tidak mempertahankan perubahan

  2. Alat untuk menerjemahkan Oracle PL/SQL ke Postgresql PL/pgSQL

  3. Bagaimana cara membandingkan baris saat ini dengan baris berikutnya dan sebelumnya di PostgreSQL?

  4. PostgreSQL:meningkatkan pg_dump, kinerja pg_restore

  5. Lakukan kueri jam operasi ini di PostgreSQL