один высокопроизводительный сервер с одним сервером приложений или несколькими серверами приложений?
Вопрос
Если у меня есть высокопроизводительный сервер, например, с памятью 1 Тб и процессором 8x4 ядра...
Повысится ли производительность, если я запущу несколько серверов приложений (на разных JVM), а не только один сервер приложений?
На сервере приложений я запущу несколько сервисов (EAR с компонентами, управляемыми сообщениями), которые обмениваются сообщениями друг с другом.
Кстати, у 64-битной Java больше нет ограничений по памяти?http://java.sun.com/products/hotspot/whitepaper.html#64
Решение
Повысится ли производительность, если я запущу несколько серверов приложений (на разных JVM), а не только один сервер приложений?
Есть несколько вещей, которые следует принять во внимание:
Один сервер приложений означает единую точку отказа.Для многих приложений это невозможно, и использование горизонтального и вертикального масштабирования является обычной конфигурацией (т.е.несколько виртуальных машин на машине и несколько машин).И добавить больше машин, очевидно, проще/дешевле, если они небольшие.
Заполнение большой кучи занимает больше времени, поэтому приложение работает дольше, прежде чем произойдет сборка мусора.Однако для сжатия кучи большего размера требуется больше времени, и сбор мусора занимает больше времени.Определение размера виртуальной машины обычно означает поиск хорошего компромисса между частотой и продолжительностью (другими словами, вы не всегда хотите выделять как можно больше оперативной памяти одной виртуальной машине).
Итак, по моему опыту, запуск нескольких машин с несколькими JVM является обычным выбором (и обычно дешевле, чем огромный зверь, и дает вам больше гибкости).
Другие советы
Когда вам необходимо внепроцессное взаимодействие, автоматически снижается производительность, поэтому вопрос в том, недостаточно ли хорошо масштабируется сервер приложений, чтобы это могло окупиться.
Как правило, конструкция JVM позволяет использовать любое количество процессоров и любой объем оперативной памяти, предоставляемый операционной системой.Фактические ограничения зависят от реализации JVM, и вам необходимо очень внимательно прочитать спецификации, прежде чем решить, есть ли какие-либо ограничения, имеющие отношение к вам.
Если у вас есть JVM, которая может использовать оборудование, вам понадобится сервер приложений, который может масштабироваться соответствующим образом.Распространенным узким местом в наши дни является количество веб-запросов, которые могут быть обработаны в секунду: современный сервер должен быть способен обрабатывать 10 000 запросов в секунду (см. http://www.kegel.com/c10k.html), но не все так делают.
Итак, прежде всего определите свои самые насущные потребности (количество подключений в секунду?использование памяти?пропускная способность сети?) и используйте это для определения лучшей комбинации платформы + jvm + сервера приложений.Если у вас есть конкретные потребности, продавцы обычно будут рады помочь вам совершить продажу.
Скорее всего, вы выиграете, бегая несколько JVM с меньшими кучами вместо одной большой JVM.Для этого есть несколько причин:
Меньшие кучи означают короче фигня коллекции
Больше JVM означает меньшая конкуренция для внутренних ресурсов внутри JVM, таких как пулы потоков и другой синхронизированный доступ.
Сколько JVM вы должны разместить в этом блоке, зависит от того, что делает приложение.Лучший способ определить это – создать нагрузочный тест который имитирует производственную нагрузку, и наблюдайте, как количество запросов, которые может обработать система, растет с количеством добавленных JVM.В какой-то момент вы увидите, что добавление большего количества JVM не увеличивает пропускную способность.Вот тут-то вам и следует остановиться.
Однако есть еще одно соображение.Лучше иметь несколько физических машин а не одну большую толстую коробку.Это надежность.Если этот ящик по какой-то причине отключится, он заберет с собой все серверы приложений, работающие внутри него.Инфраструктура, на которой работает множество отдельных небольших физических машин, будет меньше подвержена влиянию сбоя одной машины по сравнению с одним блоком.