PostgreSQL - Jika saya menjalankan beberapa query secara bersamaan, dalam kondisi apa saya akan melihat speedup? Dalam situasi apa saya akan melihat perlambatan?

10

Saya mendekati Anda semua dengan rendah hati sebagai orang yang BUKAN DBA, dan saya yakin pertanyaan saya penuh dengan kekurangan konseptual dan "itu tergantung pada" ranjau darat. Saya juga cukup yakin bahwa Anda semua yang memilih untuk menjawab akan menginginkan lebih banyak cara spesifik daripada yang saat ini dapat saya sampaikan.

Yang mengatakan, saya ingin tahu tentang skenario berikut ini secara umum:

  • Katakanlah saya memiliki dua pertanyaan non-sepele.
  • Kueri 1 membutuhkan 2 menit untuk menyelesaikan rata-rata.
  • Permintaan 2 membutuhkan rata-rata 5 menit untuk menyelesaikan.

Jika saya menjalankannya secara berurutan, satu demi satu, saya berharap itu akan membutuhkan rata-rata 7 menit untuk menyelesaikannya. Apakah ini masuk akal?

Lebih dari itu, bagaimana jika saya menjalankan dua pertanyaan secara bersamaan? Dua koneksi terpisah secara bersamaan.

  • Dalam kondisi apa yang saya harapkan untuk melihat speedup? (Total waktu <7 menit)
  • Dalam kondisi apa saya akan mengharapkan perlambatan? (Total waktu> 7 menit)

Sekarang, jika saya memiliki 1.000 pertanyaan non-sepele berjalan secara bersamaan, saya punya firasat bahwa itu akan menghasilkan perlambatan keseluruhan. Dalam hal itu, di mana kemacetan akan terjadi? Prosesor? RAM? Drive?

Sekali lagi, saya tahu mungkin mustahil untuk menjawab pertanyaan dengan tepat tanpa mengetahui secara spesifik (yang tidak saya miliki). Saya mencari beberapa pedoman umum untuk dipikirkan ketika mengajukan pertanyaan berikut:

  • Dalam keadaan apa query bersamaan menghasilkan percepatan keseluruhan?
  • Dalam keadaan apa permintaan konkuren menghasilkan perlambatan keseluruhan?
Aaron Johnson
sumber

Jawaban:

14

Jika saya menjalankannya secara berurutan, satu demi satu, saya berharap itu akan membutuhkan rata-rata 7 menit untuk menyelesaikannya. Apakah ini masuk akal?

Jika mereka menggunakan set data yang tidak terkait, maka ya.

Jika mereka berbagi kumpulan data, dan cache dingin untuk permintaan pertama dan sebagian besar permintaan I / O terikat, maka yang kedua mungkin selesai dalam beberapa saat. Anda perlu mempertimbangkan efek caching ketika berurusan dengan analisis kinerja dan waktu permintaan.

Lebih dari itu, bagaimana jika saya menjalankan dua pertanyaan secara bersamaan? Dua koneksi terpisah secara bersamaan.

"Tergantung".

Jika mereka berdua menggunakan scan sekuensial dari tabel yang sama maka di PostgreSQL itu akan menjadi kemenangan kinerja besar karena dukungannya untuk scan sekuensial tersinkronisasi.

Jika mereka berbagi indeks yang sama maka kemungkinan mereka akan mendapat manfaat dari masing-masing membaca di cache.

Jika mereka independen dan menyentuh data yang berbeda maka mereka mungkin bersaing untuk bandwidth I / O, dalam hal ini mereka mungkin mengambil jumlah waktu yang sama seperti berjalan secara berurutan. Jika subsistem I / O mendapat manfaat dari concurrency (throughput bersih lebih tinggi dengan lebih banyak klien) maka total waktu mungkin lebih sedikit. Jika subsistem I / O menangani konkurensi dengan buruk maka mereka mungkin membutuhkan waktu lebih lama daripada menjalankannya secara berurutan. Atau mereka mungkin tidak terikat I / O sama sekali, dalam hal ini jika ada CPU gratis untuk masing-masing mereka bisa mengeksekusi seolah-olah yang lain tidak berjalan sama sekali.

Itu sangat tergantung pada konfigurasi perangkat keras dan sistem, kumpulan data, dan pada pertanyaan itu sendiri.

Sekarang, jika saya memiliki 1.000 pertanyaan non-sepele berjalan secara bersamaan, saya punya firasat bahwa itu akan menghasilkan perlambatan keseluruhan. Dalam hal itu, di mana kemacetan akan terjadi? Prosesor? RAM? Drive?

Ya, itu sangat mungkin memperlambat segalanya karena sejumlah alasan.

  • Overhead PostgreSQL sendiri dalam koordinasi antar-proses, manajemen transaksi dan kunci, manajemen buffer, dll. Ini bisa menjadi biaya yang cukup besar, dan PostgreSQL tidak benar-benar dirancang untuk jumlah klien yang tinggi - ini berfungsi lebih baik jika Anda mengantre bekerja .

  • Persaingan untuk memori kerja, cache, dll.

  • Penjadwalan OS overhead karena menyulap 1000 proses bersaing semua ingin waktu irisan Cukup kecil hari ini, OS modern memiliki penjadwal cepat.

  • Saya / O meronta-ronta. Sebagian besar sistem I / O memiliki jumlah klien kinerja puncak. Terkadang 1, yaitu yang terbaik dengan hanya satu klien, tetapi seringkali lebih tinggi. Terkadang kinerja menurun lagi di atas ambang batas. Terkadang hanya mencapai dataran tinggi.

Craig Ringer
sumber
Ini adalah jenis penjelasan yang saya cari. Jelas, ringkas, informatif. Terima kasih!
Aaron Johnson
Hai @Craig Ringer, Bagaimana jika saya akan menjalankan 1000 pertanyaan secara bersamaan dalam satu tabel (200 juta baris). Akankah Postgres menanganinya dengan baik? Apakah pemindaian berurutan yang disinkronkan membantu?
Rahul Gautam
@RahulGautam Pertanyaan baru dengan detail, dengan tautan kembali ke pertanyaan ini.
Craig Ringer
@CraigRinger menambahkan. Silakan periksa dba.stackexchange.com/questions/188649/…
Rahul Gautam
@RahulGautam Tautan Anda sudah mati. Saya ingin tahu apakah Anda dapat memberikan pembaruan tentang apa yang terjadi? Itu adalah topik yang sangat menarik.
Zeruno