Скорость, с которой мой сервер может принимать () новые входящие TCP-соединения, действительно плоха при Xen. Тот же тест на железном железе показывает увеличение скорости в 3-5 раз.
- Почему это так плохо под Xen?
- Можете ли вы настроить Xen для повышения производительности новых TCP-соединений?
- Существуют ли другие платформы виртуализации, более подходящие для этого варианта использования?
Фон
В последнее время я исследовал некоторые узкие места в производительности собственного Java-сервера под управлением Xen. Сервер говорит по HTTP и отвечает на простые вызовы TCP connect / request / response / connect.
Но даже при отправке трафика трафика на сервер он не может принимать более ~ 7000 TCP-соединений в секунду (на 8-ядерном экземпляре EC2 c1.xlarge с Xen). Во время теста сервер также демонстрирует странное поведение, когда одно ядро (не обязательно cpu 0) сильно загружается> 80%, в то время как другие ядра остаются почти бездействующими. Это заставляет меня думать, что проблема связана с ядром / лежащей в основе виртуализацией.
При тестировании того же сценария на чистой виртуальной платформе без виртуализации я получаю результаты теста, показывающие скорость TCP accept () выше 35 000 в секунду. Это на Core i5 4-ядерном компьютере под управлением Ubuntu со всеми ядрами, почти полностью насыщенными. Мне такая фигура кажется правильной.
На экземпляре Xen я снова попытался включить / настроить почти все настройки, имеющиеся в sysctl.conf. Включая включение управления пакетами приема и потокового управления и закрепление потоков / процессов на процессорах, но без видимых преимуществ.
Я знаю, что при виртуализации следует ожидать снижения производительности. Но до такой степени? Более медленный сервер с «голым железом» превосходит вирт. 8-ядерный в 5 раз?
- Это действительно ожидаемое поведение Xen?
- Можете ли вы настроить Xen для повышения производительности новых TCP-соединений?
- Существуют ли другие платформы виртуализации, более подходящие для этого варианта использования?
Воспроизведение этого поведения
При дальнейшем изучении этого и выявлении проблемы я обнаружил, что инструмент тестирования производительности netperf может имитировать аналогичный сценарий, который я испытываю. Используя тест netperf TCP_CRR, я собрал различные отчеты с разных серверов (как виртуальных, так и не виртуальных). Если вы хотите поделиться с некоторыми результатами или посмотреть мои текущие отчеты, пожалуйста, см. Https://gist.github.com/985475
Откуда я знаю, что эта проблема не из-за плохо написанного программного обеспечения?
- Сервер был протестирован на «железном» оборудовании и практически насыщает все доступные ему ядра.
- При использовании TCP-соединений keep-alive проблема исчезает.
Почему это важно?
В 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 тыс. PPS.
- Два частных виртуализированных сервера под управлением Xen. Один имел нулевую нагрузку до теста, но не имел значения.
- Частный выделенный Xen-сервер в Rackspace. Примерно таких же результатов нет.
Я в процессе повторного запуска этих тестов и заполнения отчетов по адресу https://gist.github.com/985475 Если вы хотите помочь, укажите свои номера. Это просто!
(План действий был перенесен в отдельный сводный ответ)