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?
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.
sumber