Швидкість, з якою мій сервер може приймати () нові вхідні TCP-з'єднання, насправді поганий за Xen. Цей самий тест на металевих виробах з чистого металу демонструє швидкість в 3-5 разів.
- Чому це так погано під Ксеном?
- Чи можете ви налаштувати Xen для підвищення продуктивності для нових TCP-з'єднань?
- Чи існують інші платформи для віртуалізації, які краще підходять для такого типу використання?
Фон
Останнім часом я досліджував деякі вузькі місця на внутрішньо розвиненому сервері 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?
- Це дійсно очікувана поведінка Xen?
- Чи можете ви налаштувати Xen для підвищення продуктивності для нових TCP-з'єднань?
- Чи існують інші платформи для віртуалізації, які краще підходять для такого типу використання?
Відтворюючи цю поведінку
Під час подальшого дослідження цього та уточнення проблеми я з’ясував, що інструмент тестування продуктивності netperf може імітувати аналогічний сценарій, який я переживаю. Використовуючи тест TCP_CRR netperf, я зібрав різні звіти з різних серверів (як віртуалізованих, так і невіртуальних). Якщо ви хочете долучитися до деяких висновків або переглянути мої поточні звіти, перегляньте https://gist.github.com/985475
Звідки мені відомо, що ця проблема не пов’язана з погано написаним програмним забезпеченням?
- Сервер був протестований на металевому обладнання з чистого металу, і він майже насичує всі наявні в ньому сердечники.
- При використанні постійних 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 Якщо ви хочете допомогти, введіть свої номери. Це легко!
(План дій переміщено до окремої, зведеної відповіді)