Postgres DISK IO sangat tinggi. Apa yang bisa saya lakukan untuk menguranginya segera?

13

Saya menyadari disk lebih cepat daripada apa yang saya gunakan akan membantu tetapi ini akan membutuhkan waktu lebih lama untuk dimasukkan dan saya mencoba menggunakan beberapa langkah darurat untuk mengurangi disk IO. di atas melaporkan penggunaan DSK pada merah hampir terus-menerus. Ini untuk postgres 8.3.

Pengaturan shared_buffers saya adalah 24MB meskipun server memiliki 16GB ram yang tidak sepenuhnya digunakan. Pikiran pertama saya adalah untuk memberikan ram sebanyak mungkin, tetapi saya tidak yakin bagaimana melakukannya (ini adalah server database khusus).

Solusi apa pun yang tidak memerlukan restart lebih disukai tetapi saya akan mengambil apa yang bisa saya dapatkan pada saat ini.

Terima kasih!

Harel
sumber
Pertanyaan ini harus ditanyakan di Serverfault
Francisco R
Anda dapat mencoba menambah shared_buffersfile konfigurasi postgresql.conf. Perubahan ini membutuhkan restart. Juga, Anda mungkin perlu meningkatkan nilai /proc/sys/kernel/shmmaxsebelum itu.
Khaled

Jawaban:

12

Pengaturan shared_buffers 24MB adalah default konservatif, menurut saya perlu jauh lebih tinggi untuk database khusus dengan 16GB RAM tersedia. Tapi ya, Anda harus me-restart server untuk mengubah ukurannya. http://wiki.postgresql.org/wiki/Performance_Optimization adalah tempat yang baik untuk memulai panduan konfigurasi kinerja. Mengatur shared_buffers ke 4GB atau 6GB akan tampak lebih masuk akal.

Perhatikan bahwa di linux Anda perlu menyesuaikan pengaturan sysctl kernel.shmmax (di /etc/sysctl.conf atau hanya dengan menulis / proc / sys / kernel / shmmax) untuk mengalokasikan blok memori yang banyak dibagikan ini. Jika tidak, Anda akan mendapatkan kesalahan dengan menentukan berapa yang diminta, Anda harus mengatur kernel.shmmax lebih tinggi dari itu.

Karena Anda memiliki banyak memori, Anda mungkin juga mempertimbangkan untuk menetapkan work_mem default yang lebih tinggi, yang akan membuat hal-hal seperti pengurutan dan hash (grup / urutan / berbeda dll) cenderung bekerja di memori daripada menggunakan file temp. Anda tidak perlu me-restart server untuk melakukan ini, cukup perbarui file konfigurasi, muat ulang layanan dan sesi baru akan mendapatkan pengaturan baru. Memori kerja default untuk sebuah sesi adalah 1MB, Anda dapat menghitung maksimum yang dapat digunakan pada satu waktu work_mem * max_client_connectionsdan memperkirakan dampak yang akan terjadi.

Anda juga harus meningkatkan efektif_cache_size untuk menunjukkan kepada perencana bahwa lapisan FS kernel kemungkinan akan menyimpan banyak halaman dalam memori di luar buffer bersama postgresql.

dll. harap ini membuat Anda memulai dengan baik.

araqnid
sumber
Posting bagus, hanya perkiraan penggunaan memori Anda yang sedikit berbahaya. work_mem adalah operasi maksimum per sort / hash sehingga query yang kompleks dapat memiliki beberapa operasi sort / hash dan dengan demikian dapat menggunakan lebih dari satu work_mem.
Eelke
Terima kasih, ini banyak membantu! Perubahan signifikan lainnya adalah checkpoint_segment dan checkpoint_completion_target yang berdampak besar pada penggunaan disk saya dan kinerja keseluruhan. Krisis dihindari. ( wiki.postgresql.org/wiki/Tuning_Your_PostgreSQL_Server )
Harel
3

Remount disk dengan noatime

jamespo
sumber
2

Selain dari saran yang diberikan di sini, Anda mungkin juga ingin melihat pengaturan auto vaccum Anda. Secara default akan memicu setelah sekitar 50 pembaruan dan jika database Anda melakukan banyak pembaruan / sisipan ini dapat memicu jumlah pernyataan vakum yang tidak perlu yang akan menghasilkan banyak IO.

jishi
sumber
1

Pada sistem yang sangat dekat dengan throughput I / O maksimum selama operasi normal, Anda mungkin ingin meningkatkan checkpoint_completion_target untuk mengurangi beban I / O dari pos-pos pemeriksaan . Kerugian dari hal ini adalah bahwa memperpanjang pos pemeriksaan memengaruhi waktu pemulihan, karena lebih banyak segmen WAL perlu dijaga agar bisa digunakan dalam pemulihan.

Lihat lebih lanjut di sini .

Kristen
sumber
0

Jika diskio postgresql sangat tinggi, Anda harus memeriksa pernyataan yang berjalan, terutama untuk pernyataan, melakukan "sortir pada disk", dan mengatur indeks yang tepat.

Hanya google untuk "Penyesuaian Kinerja Postgresql", Anda akan menemukan cukup banyak hal untuk memulai.

Thomas Berger
sumber