PostgreSQL memaksimalkan kinerja SSD

19

Saya akan memiliki database 9.3 PostgreSQL besar dengan banyak tabel dengan lebih dari 100 juta entri per tabel. Basis data ini pada dasarnya akan menjadi hanya-baca (setelah saya mengisi semua tabel yang diperlukan dan membangun indeks, tidak ada lagi operasi tulis pada DB) dan akses pengguna tunggal (jalankan dan patuhi beberapa kueri dari localhost), karena DB akan digunakan hanya untuk tujuan penelitian. Kueri akan selalu menggunakan BERGABUNG pada bidang DB integer.

Saya mungkin akan membeli SSD (256-512GB) untuk keperluan ini. Saya belum pernah menggunakan SSD untuk DB sebelumnya, jadi adakah yang harus saya takuti? Bisakah saya menempatkan seluruh DB pada SSD, atau hanya indeks? Apakah ada saran / tutorial khusus yang diperlukan untuk menyetel PostgreSQL untuk SSD? Perhatikan, bahwa saya memiliki workstation yang bagus dengan i7 dan 32Gb RAM, jadi mungkin Anda dapat menawarkan beberapa saran di sana juga.

Alexandros
sumber

Jawaban:

16

jadi adakah yang harus kutakutkan?

Tidak memiliki cadangan. Seperti halnya perangkat penyimpanan, itu bisa mati. Simpan cadangan.

Jika pemuatan data akan memakan waktu lama, saya akan mencadangkan db read-only setelah saya selesai memuat data, dengan menghentikannya dan menyalinnya. Dengan begitu jika terjadi kesalahan akan lebih mudah untuk membuat kembali nanti.

Bisakah saya menempatkan seluruh DB pada SSD, atau hanya indeks?

Jika cocok, simpan seluruh DB.

Jika tidak, letakkan tablespace pada SSD dan gunakan untuk menyimpan indeks dan sebanyak mungkin tabel yang paling banyak ditanyakan.

Apakah ada saran / tutorial khusus yang diperlukan untuk menyetel PostgreSQL untuk SSD?

Sebagian besar manfaat SSD adalah untuk beban penulisan OLTP. Keuntungan utama untuk memuat hanya baca adalah mencari cepat, dan slardiere telah membahasnya.

Anda mungkin ingin mengatur effective_io_concurrency = 5atau sesuatu untuk mencerminkan fakta bahwa SSD dapat melakukan pembacaan acak yang dilakukan dengan cepat melalui pipelined ... tetapi hanya memengaruhi pemindaian indeks bitmap, dan dalam praktiknya random_page_costsudah memasukkan hal itu.

Untuk pemuatan hanya baca, tidak ada bedanya.

Untuk memuat data awal, lihat:

Perhatikan, bahwa saya memiliki workstation yang bagus dengan i7 dan 32Gb RAM, jadi mungkin Anda dapat menawarkan beberapa saran di sana juga.

Atur besar maintenance_work_memuntuk memuat data. Saya akan menggunakan setidaknya 8GB.

Tetapkan besar work_memuntuk pekerjaan kueri. Ukuran yang tepat tergantung sedikit pada kompleksitas kueri. Mulailah dengan 500MBdan naik dari sana.

Bump up Anda checkpoint_segments(secara besar-besaran) untuk memuat data awal.

Ingatlah untuk menonaktifkan VM overcommit! (lihat manual PostgreSQL: http://www.postgresql.org/docs/current/static/kernel-resources.html )

Craig Ringer
sumber
22

Tentang SSD, saran utamanya adalah menurunkan 'random_page_cost' menjadi 1 (sama dengan 'seq_page_cost') di postgresql.conf, di samping pengaturan yang biasa lainnya.

slardiere
sumber
Mungkin kedua nilai harus lebih kecil dari 1.0, sesuai postgresql.org/docs/11/… : "Anda dapat menaikkan atau menurunkan kedua nilai secara bersamaan untuk mengubah pentingnya biaya disk I / O relatif terhadap biaya CPU, yang dijelaskan oleh parameter berikut ".
Kirill Bulygin