Редактировать : из нескольких чрезвычайно щедрых и полезных ответов, которые этот вопрос уже получил, для меня очевидно, что я не прояснил важную часть этого вопроса, когда задавал его ранее сегодня утром , Ответы, которые я получил до сих пор, касаются оптимизации приложений и устранения узких мест на уровне code . Я знаю, что это гораздо важнее, чем пытаться получить дополнительные 3–5% от вашей JVM!
В этом вопросе предполагается, что мы уже сделали практически все, что могли, для оптимизации архитектуры нашего приложения на уровне кода. Теперь мы хотим большего, и следующее место, которое нужно посмотреть, это уровень JVM и сборка мусора; Я изменил название вопроса соответственно. Еще раз спасибо!
<Ч />
У нас есть внутренняя архитектура в стиле конвейера, в которой сообщения передаются от одного компонента к другому, причем каждый компонент выполняет разные процессы на каждом этапе пути.
Компоненты находятся внутри файлов WAR, развернутых на серверах Tomcat. Всего в конвейере около 20 компонентов, работающих на 5 разных серверах Tomcat (я не выбирал архитектуру или распределение WAR для каждого сервера). Мы используем Apache Camel для создания всех маршрутов между компонентами, эффективно формируя «соединительную ткань» трубопровода.
Меня попросили оптимизировать сборщик мусора и общую производительность каждого сервера, на котором работает JVM (всего 5). Я провел несколько дней, читая GC и настройку производительности, и довольно хорошо разбираюсь в том, что делает каждый из различных вариантов JVM, как организована куча и как большинство параметров влияют на общую производительность JVM. .
Я думаю, что лучший способ оптимизировать каждую JVM - это , а не , чтобы оптимизировать его как автономный. Я «чувствую» (это насколько я могу оправдать это!), Что попытка оптимизировать каждую JVM локально, не учитывая, как она будет взаимодействовать с другими JVM на других серверах (как в восходящем, так и в нисходящем направлении), не приведет к глобально оптимизированному решению. .
Для меня имеет смысл оптимизировать весь конвейер в целом. Итак, мой первый вопрос: согласен ли ТАК, и если нет, то почему?
Чтобы сделать это, я думал о создании LoadTester
, который генерировал бы ввод и передавал его в первую конечную точку в конвейере. Это LoadTester
может также иметь отдельный « Monitor Thread », который будет проверять пропускную способность последней конечной точки. Затем я мог бы выполнять все виды обработки, где мы проверяем среднее сквозное время прохождения сообщений, максимальную пропускную способность до сбоя и т. Д.
LoadTester
будет генерировать один и тот же шаблон входных сообщений снова и снова. Переменная в этом эксперименте будет опциями JVM, передаваемыми опциям запуска каждого сервера Tomcat. У меня есть список из примерно 20 различных вариантов, которые я хотел бы передать JVM, и решил, что смогу просто настроить их значения, пока не найду почти оптимальную производительность.
Возможно, это не самый лучший способ сделать это, но это лучший способ, которым я мог бы придумать время, отведенное для этого проекта (около недели).
Второй вопрос: Что ТАК думает об этой настройке? Как SO может создать «оптимизирующее решение» иначе?
И последнее, но не менее важное: мне любопытно, какой тип метрик я мог бы использовать в качестве основы для измерения и сравнения. Я действительно могу думать только о:
- Найдите конфигурацию опции JVM, которая дает самое быстрое среднее сквозное время прохождения для сообщений
- Найдите конфигурацию параметра JVM, которая обеспечивает наибольшую пропускную способность тома без сбоя любого из серверов
Есть еще кто-нибудь? Какие-либо причины, почему эти 2 плохо?
После просмотра пьесы я понял, как это может быть истолковано как монолитный вопрос, но на самом деле я спрашиваю, как SO будет оптимизировать JVM, работающие по конвейеру, и не стесняться вырезать и вырезать мое решениекак вам нравится.
Заранее спасибо!