Mengapa TCP menerima () kinerja sangat buruk di bawah Xen?

89

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.

  1. Kenapa ini sangat buruk di bawah Xen?
  2. Bisakah Anda mengubah Xen untuk meningkatkan kinerja koneksi TCP yang baru?
  3. 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?

  1. Apakah ini perilaku yang diharapkan dari Xen?
  2. Bisakah Anda mengubah Xen untuk meningkatkan kinerja koneksi TCP yang baru?
  3. 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?

  1. Server telah diuji pada perangkat keras logam dan hampir memenuhi semua core yang tersedia.
  2. 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)

cgbystrom
sumber
3
Pekerjaan luar biasa menunjukkan masalah, tetapi saya yakin Anda akan dilayani jauh lebih baik di milis khusus Xen, forum dukungan atau bahkan situs laporan bug xensource . Saya percaya ini bisa menjadi bug scheduler - jika Anda mengambil nomor 7.000 koneksi * 4 core / 0,80 beban CPU Anda mendapatkan tepat 35.000 - jumlah yang Anda dapatkan ketika 4 core sepenuhnya jenuh.
the-wabbit
Ah, dan satu hal lagi: coba versi kernel yang berbeda (lebih baru mungkin) untuk tamu Anda, jika Anda bisa.
the-wabbit
@ syneticon-dj Terima kasih. Saya memang mencobanya di cc1.4xlarge di EC2 dengan kernel 2.6.38. Saya melihat kenaikan sekitar ~ 10% jika saya tidak salah. Tapi itu lebih mungkin karena perangkat keras yang lebih besar dari tipe instance itu.
cgbystrom
6
terima kasih telah memperbarui informasi HN, ini pertanyaan yang bagus. Saya menyarankan untuk memindahkan rencana tindakan ke jawaban yang terkonsolidasi, mungkin - karena ini semua adalah jawaban yang mungkin untuk masalah tersebut.
Jeff Atwood
@jeff Pindahkan rencana tindakan, periksa.
cgbystrom

Jawaban:

27

Saat ini: Kinerja paket kecil menyebalkan di bawah Xen

(pindah dari pertanyaan itu sendiri ke jawaban yang terpisah sebagai gantinya)

Menurut pengguna di HN (pengembang KVM?) Ini disebabkan kinerja paket kecil di Xen dan juga KVM. Ini masalah yang dikenal dengan virtualisasi dan menurutnya, VMWare's ESX menangani ini jauh lebih baik. Dia juga mencatat bahwa KVM membawa beberapa fitur baru yang dirancang meringankan ini ( posting asli ).

Info ini agak mengecewakan jika itu benar. Either way, saya akan mencoba langkah-langkah di bawah ini sampai beberapa guru Xen datang dengan jawaban yang pasti :)

Iain Kay dari milis xen-pengguna menyusun grafik ini: grafik netperf Perhatikan bilah TCP_CRR, bandingkan "2.6.18-239.9.1.el5" vs "2.6.39 (dengan Xen 4.1.0)".

Rencana tindakan saat ini berdasarkan tanggapan / jawaban di sini dan dari HN :

  1. Kirim masalah ini ke milis khusus Xen dan bugzilla xensource seperti yang disarankan oleh syneticon-dj. Sebuah pesan diposting ke daftar pengguna xen , menunggu balasan.

  2. Buat kasus uji tingkat aplikasi patologis yang sederhana dan publikasikan.
    Server uji dengan instruksi telah dibuat dan dipublikasikan ke GitHub . Dengan ini, Anda harus dapat melihat use case yang lebih nyata dibandingkan dengan netperf.

  3. Cobalah instance tamu Xen 32-bit 32-bit, karena 64-bit mungkin menyebabkan lebih banyak overhead di Xen. Seseorang menyebut ini di HN. Tidak membuat perbedaan.

  4. Coba aktifkan net.ipv4.tcp_syncookies di sysctl.conf seperti yang disarankan oleh abofh di HN. Ini tampaknya dapat meningkatkan kinerja karena jabat tangan akan terjadi di kernel. Saya tidak beruntung dengan ini.

  5. Tingkatkan backlog dari 1024 menjadi sesuatu yang jauh lebih tinggi, juga disarankan oleh abofh di HN. Ini juga bisa membantu karena tamu berpotensi menerima () lebih banyak koneksi selama irisan eksekusi diberikan oleh dom0 (tuan rumah).

  6. Periksa ulang bahwa conntrack dinonaktifkan pada semua mesin karena dapat mengurangi separuh tingkat penerimaan (disarankan oleh deubeulyou). Ya, itu dinonaktifkan di semua tes.

  7. Periksa "dengarkan antrian overflow dan sinkronkan ember luber di netstat -s" (disarankan oleh mike_esspe di HN).

  8. Membagi penanganan interupsi di antara beberapa core (RPS / RFS yang saya coba aktifkan sebelumnya seharusnya melakukan ini, tetapi dapat dicoba lagi). Disarankan oleh adamt di HN.

  9. Mematikan offload segmentasi TCP dan menyebarkan / mengumpulkan akselerasi seperti yang disarankan oleh Matt Bailey. (Tidak dimungkinkan pada EC2 atau host VPS serupa)

cgbystrom
sumber
2
+1 Pasti memposting hasil kinerja ketika Anda tahu!
chrisaycock
Seseorang menusuk saya di Twitter tentang pertanyaan ini. Sayangnya, sepertinya masalah ini masih ada. Saya belum melakukan banyak penelitian sejak tahun lalu. Xen MUNGKIN telah membaik selama ini, saya tidak tahu. Pengembang KVM juga menyebutkan mereka menangani masalah seperti ini. Bisa jadi layak dikejar. Juga, rekomendasi lain yang saya dengar adalah untuk mencoba OpenVZ bukan Xen / KVM karena menambah sedikit atau tidak ada layering / intersepsi syscalls.
cgbystrom
21

Secara anekdot, saya menemukan bahwa mematikan akselerasi perangkat keras NIC sangat meningkatkan kinerja jaringan pada pengontrol Xen (juga berlaku untuk LXC):

Menyebarkan-mengumpulkan accell:

/usr/sbin/ethtool -K br0 sg off

Pelepasan Segmentasi TCP:

/usr/sbin/ethtool -K br0 tso off

Di mana br0 adalah jembatan atau perangkat jaringan Anda pada host hypervisor. Anda harus mengatur ini untuk mematikannya di setiap boot. YMMV.

Matt Bailey
sumber
Saya yang kedua ini. Saya memiliki server Windows 2003 yang berjalan di Xen yang mengalami beberapa masalah packet loss yang mengerikan dalam kondisi throughput yang tinggi. Masalahnya hilang ketika saya menonaktifkan offload segmen TCP
rupello
Terima kasih. Saya memperbarui "rencana tindakan" di pertanyaan awal dengan saran Anda.
cgbystrom
3

Mungkin Anda bisa mengklarifikasi sedikit - apakah Anda menjalankan tes di bawah Xen di server Anda sendiri, atau hanya pada contoh EC2?

Terima hanyalah syscall, dan koneksi baru hanya berbeda karena beberapa paket pertama akan memiliki beberapa flag spesifik - hypervisor seperti Xen pasti tidak akan melihat perbedaan. Bagian lain dari pengaturan Anda mungkin: di EC2 misalnya, saya tidak akan terkejut jika Grup Keamanan ada hubungannya dengan itu; conntrack juga dilaporkan akan membagi dua koneksi baru tingkat terima (PDF) .

Terakhir, tampaknya ada kombinasi CPU / Kernel yang menyebabkan penggunaan CPU aneh / hangup pada EC2 (dan mungkin Xen secara umum), seperti yang ditulis blog tentang Librato baru-baru ini .

deubeulyou
sumber
Saya memperbarui pertanyaan dan menjelaskan perangkat keras apa yang saya coba ini. abofh juga menyarankan untuk meningkatkan backlog melampaui 1024 untuk mempercepat jumlah kemungkinan accept () selama slice eksekusi untuk tamu. Mengenai conntrack, saya harus memeriksa ulang apakah hal-hal seperti itu dinonaktifkan, terima kasih. Saya telah membaca artikel Liberato itu tetapi mengingat banyaknya perangkat keras yang berbeda yang saya coba ini, seharusnya tidak demikian.
cgbystrom
0

Pastikan Anda menonaktifkan iptables dan kait lain dalam kode bridging di dom0. Jelas itu hanya berlaku untuk menjembatani pengaturan jaringan Xen.

echo 0 > /proc/sys/net/bridge/bridge-nf-call-ip6tables
echo 0 > /proc/sys/net/bridge/bridge-nf-call-iptables
echo 0 > /proc/sys/net/bridge.bridge-nf-call-arptables

Itu tergantung pada ukuran server tetapi pada yang lebih kecil (prosesor 4-core) mendedikasikan satu inti cpu untuk Xen dom0 dan pin itu. Opsi boot hypervisor:

dom0_max_vcpus=1 dom0_vcpus_pin dom0_mem=<at least 512M>

Apakah Anda mencoba meneruskan perangkat PCI ethernet fisik ke domU? Seharusnya ada peningkatan kinerja yang bagus.

kupson
sumber