Tingkat di mana server saya dapat menerima () koneksi TCP masuk baru benar-benar buruk di bawah Xen. Pengujian yang sama pada perangkat keras logam menunjukkan kecepatan 3-5x.
- Kenapa ini sangat buruk di bawah Xen?
- Bisakah Anda mengubah Xen untuk meningkatkan kinerja koneksi TCP yang baru?
- Apakah ada platform virtualisasi lain yang lebih cocok untuk jenis penggunaan ini?
Latar Belakang
Akhir-akhir ini saya telah meneliti beberapa hambatan kinerja server Java yang dikembangkan sendiri yang berjalan di bawah Xen. Server berbicara HTTP dan menjawab panggilan TCP sederhana / permintaan / respons / putuskan.
Tetapi bahkan saat mengirim muatan lalu lintas ke server, ia tidak dapat menerima lebih dari ~ 7000 koneksi TCP per detik (pada instance EC2 8-inti, c1.xlarge menjalankan Xen). Selama pengujian, server juga menunjukkan perilaku aneh di mana satu inti (tidak harus cpu 0) menjadi sangat dimuat> 80%, sedangkan inti lainnya tetap hampir menganggur. Hal ini membuat saya berpikir bahwa masalahnya terkait dengan kernel / virtualisasi yang mendasarinya.
Saat menguji skenario yang sama pada bare metal, platform non-virtual saya mendapatkan hasil pengujian yang menunjukkan TCP accept () rate melebihi 35 000 / detik. Ini pada mesin Core i5 4 menjalankan Ubuntu dengan semua core hampir sepenuhnya jenuh. Bagi saya sosok seperti itu sepertinya benar.
Pada contoh Xen lagi, saya sudah mencoba mengaktifkan / tweak hampir setiap pengaturan yang ada di sysctl.conf. Termasuk mengaktifkan Receive Steering Packive dan Receive Flow Steering dan menyematkan utas / proses ke CPU tetapi tanpa keuntungan nyata.
Saya tahu kinerja yang menurun diharapkan saat menjalankan virtualisasi. Tetapi sampai tingkat ini? Server metal yang lebih lambat dan telanjang mengungguli virtue. 8-core dengan faktor 5?
- Apakah ini perilaku yang diharapkan dari Xen?
- Bisakah Anda mengubah Xen untuk meningkatkan kinerja koneksi TCP yang baru?
- Apakah ada platform virtualisasi lain yang lebih cocok untuk jenis penggunaan ini?
Mereproduksi perilaku ini
Ketika menyelidiki lebih lanjut ini dan menunjukkan dengan tepat masalah yang saya temukan bahwa alat pengujian kinerja netperf dapat mensimulasikan skenario serupa yang saya alami. Menggunakan uji TCP_CRR netperf, saya telah mengumpulkan berbagai laporan dari server yang berbeda (baik yang divirtualisasi maupun yang tidak.). Jika Anda ingin berkontribusi dengan beberapa temuan atau mencari laporan saya saat ini, silakan lihat https://gist.github.com/985475
Bagaimana saya tahu masalah ini bukan karena perangkat lunak yang ditulis dengan buruk?
- Server telah diuji pada perangkat keras logam dan hampir memenuhi semua core yang tersedia.
- Saat menggunakan koneksi TCP tetap aktif, masalahnya hilang.
Mengapa ini penting?
Di ESN (perusahaan saya) saya adalah pimpinan proyek Beaconpush , server Comet / Web Socket yang ditulis dalam Java. Meskipun sangat berkinerja dan dapat menjenuhkan hampir semua bandwidth yang diberikan padanya dalam kondisi optimal, masih terbatas pada seberapa cepat koneksi TCP baru dapat dibuat. Artinya, jika Anda memiliki churn pengguna besar di mana pengguna datang dan pergi sangat sering, banyak koneksi TCP harus diatur / dihancurkan. Kami mencoba mengurangi ini agar koneksi tetap hidup selama mungkin. Tetapi pada akhirnya, kinerja accept () adalah yang membuat core kami tidak berputar dan kami tidak menyukainya.
Perbarui 1
Seseorang memposting pertanyaan ini ke Hacker News , ada beberapa pertanyaan / jawaban di sana juga. Tetapi saya akan mencoba memperbarui pertanyaan ini dengan informasi yang saya temukan saat saya melanjutkan.
Perangkat keras / platform Saya sudah menguji ini pada:
- EC2 dengan tipe instance c1.xlarge (8 core, 7 GB RAM) dan cc1.4xlarge (2x Intel Xeon X5570, 23 GB RAM). AMI yang digunakan adalah ami-08f40561 dan ami-1cad5275. Seseorang juga menunjukkan bahwa "Grup Keamanan" (yaitu firewall EC2s) mungkin mempengaruhi juga. Tetapi untuk skenario pengujian ini, saya sudah mencoba hanya di localhost untuk menghilangkan faktor eksternal seperti ini. Rumor lain yang saya dengar adalah bahwa EC2 tidak dapat mendorong lebih dari 100k PPS.
- Dua server virtual pribadi menjalankan Xen. Satu memiliki nol muatan sebelum ujian tetapi tidak membuat perbedaan.
- Xen-server berdedikasi pribadi di Rackspace. Tentang hasil yang sama di sana.
Saya sedang dalam proses menjalankan kembali tes-tes ini dan mengisi laporan di https://gist.github.com/985475 Jika Anda ingin membantu, kontribusikan nomor Anda. Mudah!
(Rencana tindakan telah dipindahkan ke jawaban yang terpisah dan terkonsolidasi)