Масштабируемость одного сервера для запуска веб-приложения Java - PullRequest
5 голосов
/ 07 августа 2010

Я хочу получить больше информации о масштабе рабочей нагрузки, которую может обрабатывать веб-приложение Java с одним сервером, развернутое в одном экземпляре Tomcat. В частности, давайте представим, что я разрабатываю приложение Wiki, которое имеет похожий шаблон использования, такой как Wikipedia. Сколько одновременных запросов может надежно обработать мой сервер перед тем, как выйти из памяти или проявить признаки чрезмерной нагрузки, если я разверну его на машине со следующей конфигурацией:

  • Высокопроизводительный 4-ядерный процессор Intel Xeon
  • 8 ГБ ОЗУ
  • 2 жестких диска в RAID-1 (без твердотельных накопителей, без твердотельных хранилищ на основе PCIe)
  • RedHat или Centos Linux (64-разрядная версия)
  • Java 6 (64-разрядная версия)
  • MySQL 5.1 / InnoDB

Также давайте предположим, что БД MySQL установлена ​​на той же машине, что и Tomcat, и что все данные Wiki хранятся внутри БД. Кроме того, давайте представим, что приложение Java построено поверх следующего стека:

  • SpringMVC для внешнего интерфейса
  • Hibernate / JPA для персистентности
  • Пружина для DI и безопасности и т. Д.

Если вы не использовали точную конфигурацию, но у вас есть опыт оценки масштабируемости аналогичной архитектуры, мне было бы очень интересно услышать об этом.

Заранее спасибо.

РЕДАКТИРОВАТЬ : Я думаю, что не сформулировал свой вопрос должным образом. Я отмечу ответ с наибольшим количеством голосов как лучший ответ, и я перепишу свой вопрос в вики-разделе сообщества. Короче говоря, я просто хотел узнать о вашем опыте работы с масштабом рабочей нагрузки, которую ваше приложение Java смогло обработать на одном физическом сервере, а также описание некоторых типов и архитектуры самого приложения.

Ответы [ 5 ]

3 голосов
/ 07 августа 2010

Честно говоря, почти невозможно сказать. Вероятно, есть около 3 способов (изо всех сил, чтобы построить такую ​​систему), и каждый из них будет иметь довольно разные характеристики производительности. Лучше всего строить и тестировать.

Во-первых, попытайтесь получить представление о том, какие предполагаемые объемы у вас будут, а также о задержках, которым вы должны соответствовать.

Придумайте базовую архитектуру и внедрите тонкий срез в конец системы (в идеале - наиболее распространенный вариант использования). Используйте инструмент для нагрузочного тестирования, например ( Grinder или Apache JMeter ), чтобы ввести нагрузку и начать измерение производительности. Если производительность приемлема - будьте осторожны, ваша простая реализация, скорее всего, будет включать меньше функций и будет быстрее, чем полная система, - продолжайте сборку системы и тестирование, чтобы убедиться, что вы не представите серьезное узкое место в производительности. Если нет, придумайте другой дизайн.

Если ваш код разумный, узким местом, скорее всего, будет база данных и где-то в районе 100 дБ операций в секунду. Если этого недостаточно, возможно, вам следует подумать о кэшировании.

3 голосов
/ 07 августа 2010

Вам нужно будет использовать группу инструментов:

  1. Loadtesting Tool - можно использовать JMeter.
  2. Инструмент мониторинга - Этот инструмент будет использоваться для мониторинга различного количества загрузки ресурсов. Есть как платные, так и бесплатные лоты. JProfiler VisualVM , и т.д.
  3. Инструмент сбора и отчетности. (Не используется какой-либо инструмент)

С помощью вышеуказанных инструментов вы можете найти оптимальное значение. Я бы подошел к этому следующим образом.

  1. узнает, какое должно быть соотношение страниц, к которым осуществляется доступ. Каковы фоновые процессы и их частота.
  2. Сконфигурируйте мой JMeter соответствующим образом (для соотношений) и отслеживайте производительность для примененной нагрузки (время для обслуживания страницы ... можно сделать в JMeter), отслеживайте другие ресурсы с помощью инструмента Монитор. Также проверьте количество ошибок. (ПРИМЕЧАНИЕ: вам нужно решить, какой коэффициент ошибок не является приемлемым.)
  3. Продолжайте увеличивать загрузку шаг за шагом и продолжайте записывать различные числа, представляющие интерес, до полного отказа сервера.

Вы можете выбрать оптимальное значение на основе множества критериев, низкого уровня ошибок, максимального времени обслуживания и т. Д. JMeter поддерживает множество способов применить нагрузку.

0 голосов
/ 07 августа 2010

Английская Википедия имеет данные 14 ГБ. Кэш-память объемом 8 ГБ будет иметь очень высокое отношение попаданий / промахов, и я думаю, что чтение с жесткого диска будет вполне приемлемым Следовательно, приложение, скорее всего, связано с сетью.

Английская Википедия имеет около 3000 просмотров страниц в секунду. Вполне возможно, что tomcat сможет справиться с нагрузкой путем тщательной настройки, и сеть будет иметь достаточную пропускную способность для сервера трафика.

Таким образом, весь сайт Википедии может быть размещен на одной умеренной машине? Возможно нет. Просто идея.

-

http://stats.wikimedia.org/EN/TablesWikipediaEN.htm

http://stats.wikimedia.org/EN/TablesPageViewsMonthly.htm

0 голосов
/ 07 августа 2010

Обязательно посмотрите Spring Insight для мониторинга и анализа производительности.

0 голосов
/ 07 августа 2010

Tomcat не позволяет распространяться на несколько машин.Если вы действительно обеспокоены масштабируемостью, вы должны подумать о том, что делать, когда ваше приложение перерастает одну машину.

...