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


Tingkat di mana server saya dapat menerima () koneksi TCP masuk baru benar-benar buruk di bawah Xen. Tes yang sama pada perangkat keras logam telanjang menunjukkan peningkatan kecepatan 3-5x.

  1. Kenapa ini sangat buruk di bawah Xen?
  2. Bisakah Anda mengubah Xen untuk meningkatkan kinerja koneksi TCP baru?
  3. Apakah ada platform virtualisasi lain yang lebih cocok untuk kasus penggunaan semacam ini?

Latar Belakang

Akhir-akhir ini saya telah meneliti beberapa bottleneck kinerja dari server Java yang dikembangkan di rumah yang dijalankan di bawah Xen. Server berbicara HTTP dan menjawab panggilan TCP connect / request / response / disconnect yang sederhana.

Tetapi bahkan ketika mengirim muatan kapal dari lalu lintas ke server, itu tidak dapat menerima lebih dari ~ 7000 koneksi TCP per detik (pada contoh EC2 8-core, c1.xlarge menjalankan Xen). Selama pengujian, server juga menunjukkan perilaku aneh di mana satu inti (tidak perlu cpu 0) menjadi sangat dimuat> 80%, sementara core lainnya tetap hampir menganggur. Ini membuat saya berpikir bahwa masalahnya terkait dengan kernel / virtualisasi yang mendasarinya.

Saat menguji skenario yang sama pada platform yang telanjang, non-virtual, saya mendapatkan hasil tes yang menunjukkan TCP menerima () tarif di atas 35.000 / detik. Ini pada mesin Core i5 4 core menjalankan Ubuntu dengan semua core hampir sepenuhnya jenuh. Bagiku sosok seperti itu sepertinya benar.

Pada contoh Xen lagi, saya sudah mencoba mengaktifkan / men-tweak hampir setiap pengaturan yang ada di sysctl.conf. Termasuk memungkinkan Terima Pengandar Paket dan Terima Pengarah Arus dan menyematkan benang / proses ke CPU tetapi tanpa hasil yang jelas.

Saya tahu kinerja yang terdegradasi dapat diharapkan ketika menjalankan virtualisasi. Tetapi untuk tingkat ini? Server logam yang lebih lambat dan kosong mengalahkan keunggulan. 8-core dengan faktor 5?

  1. Apakah ini benar-benar perilaku yang diharapkan dari Xen?
  2. Bisakah Anda mengubah Xen untuk meningkatkan kinerja koneksi TCP baru?
  3. Apakah ada platform virtualisasi lain yang lebih cocok untuk kasus penggunaan semacam ini?

Mereproduksi perilaku ini

Ketika menyelidiki lebih lanjut ini dan menemukan masalah saya menemukan bahwa netperf alat pengujian kinerja dapat mensimulasikan skenario serupa yang saya alami. Menggunakan tes TCP_CRR netperf, saya telah mengumpulkan berbagai laporan dari berbagai server (baik yang virtual maupun non-virt.). 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 hardware logam telanjang dan hampir menjenuhkan semua core yang tersedia untuk itu.
  2. Saat menggunakan koneksi TCP keep-alive, masalah akan hilang.

Mengapa ini penting?

Di ESN (majikan saya) Saya adalah pimpinan proyek Beaconpush, server Comet / Web Socket yang ditulis di Java. Meskipun sangat berkinerja dan dapat memenuhi hampir semua bandwidth yang diberikan padanya dalam kondisi optimal, itu 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 / robek. Kami mencoba untuk mengurangi hubungan ini agar tetap hidup selama mungkin. Tetapi pada akhirnya, kinerja penerimaan () adalah apa yang membuat inti kita tidak berputar dan kita tidak menyukainya.


Perbarui 1

Some one memposting pertanyaan ini ke Hacker News, ada beberapa pertanyaan / jawaban di sana juga. Tetapi saya akan mencoba menjaga pertanyaan ini tetap mutakhir dengan informasi yang saya temukan ketika saya ikut.

Perangkat keras / platform Saya telah menguji ini pada:

  • EC2 dengan jenis 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 masing-masing. Seseorang juga menunjukkan bahwa "Grup Keamanan" (misalnya firewall EC2) mungkin juga memengaruhi. Tapi untuk skenario pengujian ini, saya sudah mencoba hanya di localhost untuk menghilangkan faktor eksternal seperti ini. Rumor lain yang pernah saya dengar adalah bahwa EC2 tidak dapat mendorong lebih dari 100k PPS.
  • Dua server virtual pribadi menjalankan Xen. Satu memiliki beban nol sebelum tes tetapi tidak membuat perbedaan.
  • Pribadi berdedikasi, Xen-server di Rackspace. Tentang hasil yang sama di sana.

Saya sedang dalam proses menjalankan kembali pengujian ini dan mengisi laporan di https://gist.github.com/985475 Jika Anda ingin membantu, sumbangkan angka Anda. Mudah!

(Rencana aksi telah dipindahkan ke jawaban terpisah dan terkonsolidasi)


87
2018-05-22 16:39




Pekerjaan yang sangat baik menunjukkan masalah, tetapi saya yakin Anda akan dilayani jauh lebih baik pada milis Xen-spesifik, forum dukungan, atau bahkan situs laporan bug xensource. Saya percaya ini bisa menjadi beberapa bug scheduler - jika Anda mengambil jumlah 7.000 koneksi * 4 core / 0,80 beban CPU Anda mendapatkan tepat 35.000 - angka yang Anda dapatkan ketika 4 core akan sepenuhnya jenuh. - the-wabbit
Ah, dan satu lagi: coba versi kernel yang berbeda (lebih baru mungkin) untuk tamu Anda, jika Anda bisa. - the-wabbit
@ syneticon-dj Terima kasih. Saya mencobanya pada cc1.4xlarge di EC2 dengan kernel 2.6.38. Saya melihat sekitar ~ 10% peningkatan jika saya tidak salah. Tetapi kemungkinan besar disebabkan oleh perangkat keras yang lebih besar dari jenis instance tersebut. - cgbystrom
terima kasih untuk menjaga ini up to date dengan tanggapan HN, itu pertanyaan yang bagus. Saya menyarankan memindahkan rencana tindakan ke dalam jawaban yang terkonsolidasi, mungkin - karena ini semua adalah jawaban yang mungkin untuk masalah ini. - Jeff Atwood
@jeff Pindahkan rencana aksi, periksa. - cgbystrom


Jawaban:


Saat ini: Kinerja paket kecil menyebalkan di bawah Xen

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

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

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

Iain Kay dari milis xen-user mengkompilasi grafik ini: netperf graph Perhatikan bar 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 Xen-spesifik dan bugzilla xensource seperti yang disarankan oleh syneticon-dj SEBUAH pesan telah diposting ke daftar xen-user, menunggu balasan.

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

  3. Coba contoh PV Xen tamu 32-bit, karena 64-bit mungkin menyebabkan lebih banyak overhead di Xen. Seseorang menyebut ini di HN. Tidak ada bedanya.

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

  5. Tingkatkan backlog dari 1024 ke sesuatu yang jauh lebih tinggi, juga disarankan oleh abofh di HN. Ini juga dapat membantu karena tamu berpotensi menerima () lebih banyak koneksi selama slice eksekusi yang diberikan oleh dom0 (host).

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

  7. Periksa "dengarkan overflow antrian dan bucket syncache overflow di netstat -s" (disarankan oleh mike_esspe pada 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 segmentasi TCP offload dan menyebarkan / mengumpulkan percepatan seperti yang disarankan oleh Matt Bailey. (Tidak mungkin pada EC2 atau host VPS serupa)


26
2018-05-22 23:41



+1 Pastikan posting hasil kinerja ketika Anda sudah tahu! - chrisaycock
Seseorang mencolek saya di Twitter mengenai pertanyaan ini. Sayangnya, sepertinya masalah ini terus berlanjut. Saya belum banyak penelitian sejak tahun lalu. Xen MEI membaik selama waktu ini, saya tidak tahu. Pengembang KVM juga menyebutkan bahwa mereka menangani masalah seperti ini. Bisa jadi layak dikejar. Juga, rekomendasi lain yang pernah saya dengar adalah mencoba OpenVZ daripada Xen / KVM karena menambahkan kurang atau tidak ada pelapisan / intersepsi syscalls. - cgbystrom


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

Scatter-gather accell:

/usr/sbin/ethtool -K br0 sg off

Segmentasi TCP segmentasi:

/usr/sbin/ethtool -K br0 tso off

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


20
2018-05-22 19:09



Saya kedua ini. Saya memiliki server Windows 2003 yang berjalan di Xen yang mengalami masalah packet loss yang mengerikan dalam kondisi throughput yang tinggi. Masalahnya pergi ketika saya menonaktifkan segmen TCP offload - rupello
Terima kasih. Saya memperbarui "rencana tindakan" dalam pertanyaan asli dengan saran Anda. - cgbystrom
Lihat juga cloudnull.io/2012/07/xenserver-network-tuning - Lari Hotari


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

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

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


2
2018-05-22 19:56



Saya memperbarui pertanyaan dan mengklarifikasi perangkat keras apa yang telah saya coba ini. abofh juga menyarankan peningkatan backlog melampaui 1024 untuk mempercepat jumlah kemungkinan menerima () s selama slice eksekusi untuk tamu. Mengenai conntrack, saya pasti harus mengecek kembali bahwa hal-hal seperti itu dinonaktifkan, terima kasih. Saya sudah membaca artikel Liberato tetapi mengingat jumlah perangkat keras yang berbeda saya mencoba ini, seharusnya tidak demikian. - cgbystrom


Pastikan Anda menonaktifkan iptables dan hook lain dalam kode bridging di dom0. Tentunya ini 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 cpu core ke Xen dom0 dan pin itu. Opsi boot Hypervisor:

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

Apakah Anda mencoba melewati perangkat PCI ethernet fisik ke DOMU? Harus ada peningkatan kinerja yang bagus.


0
2018-02-11 11:35