Jumlah optimal per proses unicorn CPU

16

Kami menjalankan aplikasi web Ruby on Rails di bawah Unicorn. Aplikasi kami tidak terikat dengan CPU (kami memiliki sistem dual Xeon E5645 dengan 12 core dan nilai rata-rata beban puncak sekitar 6). Kami mulai dengan 40 pekerja Unicorn awalnya tetapi jejak memori aplikasi meningkat seiring waktu. Jadi, sekarang kita harus menurunkan jumlah proses pekerja. Saya pikir formula standar (jumlah inti CPU + 1) berlaku untuk Unicorn juga, tetapi kolega saya mencoba meyakinkan saya bahwa kita harus memesan lebih banyak contoh Unicorn per CPU dan menyediakan tautan ini . Namun, saya tidak begitu yakin mengapa kita perlu menghabiskan begitu banyak memori pada proses Unicorn yang menganggur.

Pertanyaan saya adalah: apa alasan untuk memiliki lebih dari satu instance Unicorn per core CPU? Apakah itu karena kekhasan arsitektur Unicorn? Saya menyadari bahwa proses Unicorn yang sibuk tidak dapat menerima koneksi baru (kami menggunakan soket domain UNIX untuk berkomunikasi dengan Unicorn instance BTW) tetapi saya pikir jaminan simpanan diperkenalkan tepat untuk mengatasi hal ini. Apakah mungkin untuk mengatasi contoh Unicorn 2 hingga 8 ini per aturan CPU?

Alex
sumber

Jawaban:

17

Oke, akhirnya saya menemukan jawabannya. Jumlah optimal pekerja Unicorn tidak secara langsung terhubung ke jumlah inti CPU, itu tergantung pada beban Anda dan struktur aplikasi internal / responsif. Pada dasarnya kami menggunakan profiler pengambilan sampel untuk menentukan status pekerja, kami mencoba untuk menjaga pekerja 70% menganggur dan 30% melakukan pekerjaan yang sebenarnya. Jadi, 70% dari sampel harus "menunggu panggilan select () untuk mendapatkan permintaan dari server frontend". Penelitian kami menunjukkan bahwa hanya ada 3 status efektif pekerja: 0-30% sampel menganggur, 30-50% sampel menganggur dan 50-70% sampel menganggur (ya kita bisa mendapatkan lebih banyak sampel menganggur tetapi ada tidak ada gunanya di dalamnya karena respons aplikasi tidak berubah secara signifikan). Kami menganggap situasi 0-30% sebagai "zona merah" dan situasi 30-50% sebagai "zona kuning".

Alex
sumber
1
Bisakah Anda menjelaskan bagaimana Anda mengambil sampel kondisi para pekerja ini?
dps
6

Anda benar tentang N +1 untuk pekerjaan yang terikat CPU.

Di sisi lain, unicorn tidak menggunakan utas, jadi setiap IO op. memblokir proses dan proses lain dapat memulai dan mengurai header HTTP, merangkai string dan melakukan setiap tugas intensif CPU yang dibutuhkan untuk melayani pengguna (melakukannya lebih awal untuk mengurangi latensi permintaan).

Dan Anda mungkin ingin memiliki lebih banyak utas / proses daripada inti. Bayangkan situasi berikut: req. A membutuhkan sepuluh kali lebih banyak dari yang dibutuhkan. B, Anda memiliki beberapa permintaan A bersamaan dan permintaan B cepat hanya menunggu menunggu A-req selesai. Jadi, jika Anda dapat memprediksi jumlah permintaan besar, Anda dapat menggunakan nomor ini sebagai pedoman lain untuk menyempurnakan sistem.

gelap
sumber
1
Poin baiknya, mari kita asumsikan permintaan didistribusikan kurang lebih sama dan cukup ringan (kami memang memiliki banyak permintaan tetapi mereka ditangani oleh kumpulan Unicorn lainnya). Jika semua permintaan tiba-tiba menjadi berat (misalnya dalam kasus kelaparan I / O pada node DB) kita akan turun terlepas dari nomor CPU contoh per kurasa. Yah, mungkin cara terbaik untuk mengetahui kebenaran adalah dengan melakukan semacam pengujian beban.
Alex
Yap, pengujian akan memberi tahu Anda. Atau, jika Anda sudah mulai, Anda dapat melihat log dan mencari jumlah maksimum permintaan bersamaan. Saya cukup yakin, bahwa Anda mencatat waktu permintaan dan waktu respons backend. Nginx akan menjadi teman Anda jika tidak. :)
darkk