it-swarm.asia

Mengkonfigurasi PostgreSQL untuk kinerja penulisan

Salah satu server PostgreSQL saya menampung beberapa (1-3) database yang menerima aliran data yang konstan. Data tidak terstruktur secara khusus, itu berjumlah waktu saat ini dan berbagai data yang diamati untuk instan tertentu. Kecepatan data cukup tinggi; itu berhasil sekitar satu gigabyte sehari untuk satu database, sekitar sepersepuluh dari itu untuk yang lain. Saya tidak berharap tingkat ini meningkat. Kinerja membaca adalah prioritas yang jauh lebih rendah dan saat ini dapat diterima.

Dalam log saya punya pesan ini:

LOG:  checkpoints are occurring too frequently (15 seconds apart)
HINT:  Consider increasing the configuration parameter "checkpoint_segments".

Nilai ini saat ini diatur ke 16, yang merupakan milik pgtune.

Pengaturan apa yang harus saya pertimbangkan untuk meningkatkan kinerja penulisan? Saya lebih suka menjaga keamanan sebanyak mungkin. Mengingat volume data yang masuk, saya bisa menerima kehilangan beberapa data baru-baru ini dalam kegagalan selama sebagian besar data masih utuh.

Sunting: Saya menggunakan PostgreSQL 9.0 untuk saat ini, tetapi saya berencana untuk meningkatkan ke 9.1. Saya tidak memposting detail perangkat keras karena walaupun saya mengakui pentingnya mereka, saya akhirnya akan perlu melakukan optimasi ini pada beberapa mesin dengan perangkat keras yang sangat beragam. Jika perangkat keras sangat penting untuk jawabannya, tolong beri saya informasi umum sehingga saya dapat menerapkan jawaban untuk mesin dengan konfigurasi perangkat keras yang berbeda.

30
Daniel Lyons

1 Gigabyte sehari tidak setinggi itu dari beban tulis. Sebarkan sepanjang hari, yang menghasilkan sekitar 50 kbytes per detik. USB thumb drive yang lambat bisa mengatasinya. Saya berasumsi itu lebih meledak. Seperti yang disarankan a_horse_with_no_name, tambah segmen pos pemeriksaan. 100 atau lebih tidak biasa.

Kemudian tingkatkan checkpoint_timeout Anda menjadi 1 jam, dan lihat juga untuk meningkatkan checkpoint_completion_target Anda menjadi sesuatu yang mendekati 1,0 (100%). Target penyelesaian memberi tahu PostgreSQL cara agresif menulis di latar belakang sehingga x% selesai sebelum menjalankan pos pemeriksaan, yang memaksa semua data untuk ditulis sekaligus dari WAL dan akan memperlambat sistem untuk merayapi saat sedang terjadi.

Alasan Anda biasanya tidak menetapkannya menjadi 100% adalah bahwa cukup umum untuk menulis ke blok yang sama lebih dari sekali, dan dengan menunda WAL menulis ke toko utama, Anda mencegah blok yang sama ditulis dua kali tanpa alasan.

Jika tidak mungkin Anda akan menulis ke blok yang sama lebih dari satu kali sebelum batas waktu Anda terjadi, mis. Yang Anda lakukan hanyalah memasukkan lalu mengaturnya cukup tinggi masuk akal untuk menaikkannya menjadi 0,9 atau lebih. Hal terburuk yang akan terjadi adalah Anda akan menulis sedikit lebih sering daripada yang seharusnya Anda perlukan, tetapi dampak pos pemeriksaan akan sangat berkurang.

24
Scott Marlowe

Dalam sistem yang sangat 'tulis berat', Anda cenderung dibatasi oleh tingkat WAL yang dapat ditulis selama aktivitas puncak.

Jika Anda benar-benar dapat "menerima kehilangan beberapa data terbaru dalam kegagalan" Anda dapat mematikan commit sinkron yang:

bisa menjadi alternatif yang berguna ketika kinerja lebih penting daripada kepastian yang tepat tentang daya tahan transaksi

Jika Anda dapat mengubah perangkat keras Anda, Anda dapat mempertimbangkan salah satu dari ini untuk mengoptimalkan penulisan:

  • RAID10 melalui RAID5
  • Banyak spindle (mungkin berarti 2,5 "bukannya 3,5" misalnya)
  • SAS melalui SATA
  • 15K lebih dari 10K drive
  • SSD

--edit

Berdasarkan komentar Anda pada @ Scott jawaban yang sangat baik : "Volume penulisan sebenarnya hampir sepenuhnya seragam", dan tingkat data tersirat dari "50 kbytes per detik", saya ragu Anda perlu melakukan apa pun yang berisiko data kerugian. Mungkin akan membantu untuk mengetahui parameter pengaturan Anda yang lain.

Anda mungkin juga memeriksa frekuensi/ukuran komit Anda: Saya mengalami masalah baru-baru ini di mana saya mencoba memperbarui> 1 juta catatan dalam satu transaksi. Saya mendapat pesan log yang mirip dengan yang dijelaskan oleh OP, tetapi transaksi tidak dapat diselesaikan bahkan setelah beberapa jam. Ketika saya memecah tulisan menjadi beberapa transaksi yang lebih kecil (10.000 catatan atau lebih), total waktu yang dibutuhkan turun menjadi sekitar 15 menit.

Apa yang saya pikirkan yang terjadi adalah Postgres menghabiskan begitu banyak waktu menulis log yang checkpoint_timeout berlalu sebelum bisa membuat kemajuan besar dalam menyimpan catatan. Saya tidak yakin apakah penjelasan itu cocok. Saya masih mendapatkan peringatan, tetapi semua penulisan akhirnya diproses. Namun, saya membutuhkan (dan menemukan) solusi yang terprogram daripada yang membutuhkan konfigurasi ulang basis data.

Lihat juga http://www.postgresql.org/docs/9.3/static/wal-configuration.html

5
Sarah Messer