Чому під Xen продуктивність TCP приймає () настільки погана?


89

Швидкість, з якою мій сервер може приймати () нові вхідні TCP-з'єднання, насправді поганий за Xen. Цей самий тест на металевих виробах з чистого металу демонструє швидкість в 3-5 разів.

  1. Чому це так погано під Ксеном?
  2. Чи можете ви налаштувати Xen для підвищення продуктивності для нових TCP-з'єднань?
  3. Чи існують інші платформи для віртуалізації, які краще підходять для такого типу використання?

Фон

Останнім часом я досліджував деякі вузькі місця на внутрішньо розвиненому сервері Java під управлінням Xen. Сервер говорить HTTP і відповідає на прості TCP-з'єднання / запит / відповідь / відключення дзвінків.

Але навіть надсилаючи на сервер завантаження суднового трафіку, він не може приймати більше ~ 7000 TCP-з'єднань в секунду (у 8-ядерному екземплярі EC2, c1.xlarge, що працює з Xen). Під час тесту сервер також демонструє дивну поведінку, коли одне ядро ​​(не обов'язково процесор 0) стає дуже завантаженим> 80%, а інші ядра майже не працюють. Це змушує мене думати, що проблема пов'язана з віртуалізацією ядра / основою.

Під час тестування того ж сценарію на голій металевій, невіртуалізованій платформі я отримую результати тестування, що показують швидкість прийняття () TCP понад 35 000 / секунду. Це на основній машині Core i5 4, що працює на Ubuntu, з усіма ядрами майже повністю насиченими. Мені така фігура здається правильною.

У інстанції Xen я знову спробував увімкнути / налаштувати майже всі налаштування, які є в sysctl.conf. Включаючи ввімкнення прийому рульового керування пакетом та отримання керування потоком та отримання потоків / процесів до процесорів, але без видимих ​​вигод.

Я знаю, що при віртуальному запуску можна очікувати погіршення продуктивності. Але до цього ступеня? Більш повільний, голий металевий сервер випереджає вирту. 8-ядерний коефіцієнт 5?

  1. Це дійсно очікувана поведінка Xen?
  2. Чи можете ви налаштувати Xen для підвищення продуктивності для нових TCP-з'єднань?
  3. Чи існують інші платформи для віртуалізації, які краще підходять для такого типу використання?

Відтворюючи цю поведінку

Під час подальшого дослідження цього та уточнення проблеми я з’ясував, що інструмент тестування продуктивності netperf може імітувати аналогічний сценарій, який я переживаю. Використовуючи тест TCP_CRR netperf, я зібрав різні звіти з різних серверів (як віртуалізованих, так і невіртуальних). Якщо ви хочете долучитися до деяких висновків або переглянути мої поточні звіти, перегляньте https://gist.github.com/985475

Звідки мені відомо, що ця проблема не пов’язана з погано написаним програмним забезпеченням?

  1. Сервер був протестований на металевому обладнання з чистого металу, і він майже насичує всі наявні в ньому сердечники.
  2. При використанні постійних TCP-з'єднань проблема усувається.

Чому це важливо?

У ESN (мій роботодавець) я керівник проекту Beaconpush , сервера Comet / Web Socket, написаного на Java. Незважаючи на те, що він дуже ефективний і здатний наситити практично будь-яку пропускну здатність, задану йому в оптимальних умовах, він все ще обмежується тим, наскільки швидко можна зробити нові TCP-з'єднання. Тобто, якщо у вас є великий доступ користувача, куди користувачі приходять і переходять дуже часто, багато TCP-з'єднань доведеться налаштувати / вимкнути. Ми намагаємось пом'якшити це збереження зв’язків живими якомога довше. Зрештою, продуктивність accept () - це те, що стримує наші сердечники від обертання, і нам це не подобається.


Оновлення 1

Хтось опублікував це запитання в Hacker News , є також деякі запитання / відповіді. Але я спробую актуалізувати це питання з інформацією, яку я знайду під час роботи.

Апаратне забезпечення / платформи Я перевірив це на:

  • EC2 з типами екземпляра c1.xlarge (8 ядер, 7 ГБ оперативної пам’яті) і cc1.4xlarge (2x Intel Xeon X5570, 23 ГБ оперативної пам’яті). Використовуваний AMI був ami-08f40561 і ami-1cad5275 відповідно. Хтось також зазначив, що "Групи безпеки" (тобто брандмауер EC2) можуть також впливати. Але для цього тестового сценарію я намагався усунути лише зовнішні фактори, такі як локальний хост. Ще одна чутка, яку я чув, - це те, що екземпляри EC2 не можуть наштовхнути більше 100 Кбіт / с.
  • Два приватних віртуалізованих сервера під управлінням Xen. До випробування один мав нульове навантаження, але це не змінило значення.
  • Приватний виділений, Xen-сервер у Rackspace. Приблизно такі самі результати є.

Я зараз переглядаю ці тести і заповнюю звіти за адресою https://gist.github.com/985475 Якщо ви хочете допомогти, введіть свої номери. Це легко!

(План дій переміщено до окремої, зведеної відповіді)


3
Відмінна вказівка ​​роботи на проблему, але я вважаю, що вам набагато краще подаватимуться в специфічному Xen-списку розсилки, форумі підтримки або навіть на сайті звітів про помилки xensource . Я вважаю, що це може бути помилка планувальника - якщо ви візьмете 7000 підключень * 4 ядра / 0,80 завантаження процесора, ви отримаєте рівно 35 000 - число, яке ви отримаєте, коли 4 ядра будуть повністю насичені.
Вабіт

Ну, і ще одне: спробуйте іншу (більш пізню, можливо) версію ядра для свого гостя, якщо зможете.
ваббіт

@ syneticon-dj Дякую Я спробував це на cc1.4xlarge на EC2 з ядром 2.6.38. Я бачив приблизно ~ 10% збільшення, якщо я не помиляюся. Але це, швидше за все, завдяки обладнанням, що надає обладнання для цього типу екземплярів.
cgbystrom

6
дякую за те, що стежите за цим відповідям на відповіді HN, це чудове питання. Я пропоную перенести план дій в консолідовану відповідь, можливо - оскільки це всі можливі відповіді на проблему.
Джефф Етвуд

@jeff Перемістіть план дій, перевірте.
cgbystrom

Відповіді:


27

Прямо зараз: невелика продуктивність пакету піддається Xen

(замість цього питання перейшли до окремої відповіді)

За словами користувача в HN (розробника KVM?), Це пов'язано з невеликою продуктивністю пакету в Xen, а також KVM. Це відома проблема з віртуалізацією, і за його словами, ESX VMWare справляється з цим набагато краще. Він також зазначив, що KVM приносить деякі нові функції, розроблені для полегшення цього ( оригінальний пост ).

Ця інформація трохи відлякує, якщо вона правильна. У будь-якому випадку я спробую виконати наведені нижче кроки, поки якийсь гуру Ксена не прийде разом із остаточною відповіддю :)

Ієн Кей зі списку розсилки користувачів xen-користувачів склав цей графік: графіка netperf Помітьте бари TCP_CRR, порівняйте "2.6.18-239.9.1.el5" проти "2.6.39 (з Xen 4.1.0)".

Поточний план дій на основі відповідей / відповідей тут і від НН :

  1. Подайте цю проблему до специфічного для розсилки списку розсилки Xen та багзіл xensource, як це запропонував syneticon-dj . Повідомлення було розміщено до списку користувачів xen , очікуючи відповіді.

  2. Створіть простий патологічний тестовий випадок на рівні програми та опублікуйте його.
    Тестовий сервер з інструкціями створено та опубліковано в GitHub . З цим ви зможете побачити більш реальний випадок використання в порівнянні з netperf.

  3. Спробуйте 32-розрядний гостьовий екземпляр PV Xen, оскільки 64-бітний може спричинити більше накладних витрат у Xen. Хтось згадав про це в НН. Не змінив значення.

  4. Спробуйте ввімкнути net.ipv4.tcp_syncookies в sysctl.conf, як це запропонував abofh в HN. Це, мабуть, може покращити продуктивність, оскільки рукостискання відбудеться в ядрі. Мені з цим не пощастило.

  5. Збільшити відставання з 1024 до чогось набагато вищого, що також пропонує abofh на HN. Це також може допомогти, оскільки гість потенційно може прийняти () більше з'єднань під час виконання фрагмента виконання, наданого dom0 (хостом).

  6. Двічі переконайтесь, що conntrack вимкнено на всіх машинах, оскільки він може вдвічі зменшити швидкість прийняття (запропонована deubeulyou). Так, його було відключено у всіх тестах.

  7. Перевірте "Переповнення черги прослуховування черги та переповнення відра синхронізування в netstat -s" (запропоновано mike_esspe в HN).

  8. Розбийте обробку переривань між декількома ядрами (RPS / RFS, який я намагався ввімкнути раніше, потрібно зробити це, але варто спробувати ще раз). Запропоновано adamt в HN.

  9. Якщо вимкнути сегментацію TCP, вивантажте та розкидайте / збирайте прискорення, як запропонував Метт Бейлі. (Неможливо на EC2 або подібних хостах VPS)


2
+1 Однозначно публікуйте результати ефективності, коли дізнаєтесь!
chrisaycock

Хтось засунув мене у Twitter щодо цього питання. На жаль, схоже, що ці проблеми тривають. Я не займався великими дослідженнями з минулого року. Ксен МОЖЕ покращитися за цей час, я не знаю. Розробник KVM також зазначив, що вони вирішують подібні проблеми. Можливо, варто переслідувати. Крім того, ще одна рекомендація, яку я чув, - спробувати OpenVZ замість Xen / KVM, оскільки це додасть менше або взагалі не накладає / перехоплює системні дзвінки.
cgbystrom

21

Випадково я виявив, що відключення апаратного прискорення NIC значно покращує продуктивність мережі на контролері Xen (також справедливо для LXC):

Розгортка зібрання:

/usr/sbin/ethtool -K br0 sg off

Відвантаження сегмента TCP:

/usr/sbin/ethtool -K br0 tso off

Там, де br0 - ваш міст або мережевий пристрій на хості гіпервізора. Вам доведеться встановити це, щоб вимкнути його при кожному завантаженні. YMMV.


Я другий це. У мене на Xen був запущений сервер Windows 2003, який зазнав жахливих проблем з втратою пакетів при високій пропускній здатності. Проблема
усунулася,

Дякую. Я оновив "план дій" в оригінальному запитанні з вашими пропозиціями.
cgbystrom


3

Можливо, ви могли б трохи уточнити - чи проводили ви тести під Xen на власному сервері чи лише на екземплярі EC2?

Accept - це ще один системний виклик, а нові з'єднання відрізняються лише тим, що перші кілька пакетів матимуть певні прапорці - гіпервізор, такий як Xen, точно не повинен бачити різниці. Інші частини вашого налаштування можуть: наприклад, у EC2 я не здивувався б, якщо групи безпеки мали щось із цим; трасувальника також повідомляється вдвічі нові сполуки беруть швидкість (PDF) .

Нарешті, начебто є комбінації процесора / ядра, які спричиняють дивні використання процесора / зависання процесора на EC2 (і, напевно, Xen взагалі), про що нещодавно веде блог Librato .


Я оновив питання і уточнив, на якому апаратному засобі я спробував це. abofh також запропонував збільшити відставання після 1024, щоб пришвидшити кількість можливих акцептів (-ів) під час виконання фрагмента для гостя. Щодо контракції, я, безумовно, повинен ще раз переконатися, що такі речі відключені, дякую. Я читав цю статтю Liberato, але враховуючи кількість іншого обладнання, на якому я спробував це, це не повинно бути так.
cgbystrom

0

Переконайтеся, що ви відключили iptables та інші гачки в мостовому коді в dom0. Очевидно, це стосується лише мостової установки 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

Це залежить від розміру сервера, але менші (4-ядерний процесор) присвячують одне ядро ​​процесора Xen dom0 і закріплюють його. Параметри завантаження Hypervisor:

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

Ви намагалися передати фізичний пристрій PCI Ethernet до domU? Має бути приємне підвищення продуктивності.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.