#performance #memory-management #jvm
#Производительность #управление памятью #jvm
Вопрос:
Я запускаю некоторые тесты производительности, чтобы определить время отклика и способность обрабатывать параллелизм с различными конфигурациями cpu / ram / os. Одна интересная находка, с которой я столкнулся, заключается в том, что, похоже, одна jvm работает лучше с 4 ядрами, чем с 2 ядрами (неудивительно), но добавление большего количества ядер за пределы 4-го ядра не приводит к каким-либо значительным улучшениям. Но затем добавление другого экземпляра jvm с балансировщиком нагрузки (на том же оборудовании) привело к значительному улучшению.
Похоже, что отдельный процесс ограничен в количестве ядер, которые он может использовать, возможно, из-за ограничения количества потоков операционной системы, которые процесс может запускать одновременно. Это 64-разрядная среда.
Я использую tomcat и попытался изменить атрибут «maxThreads», но это не повлияло на объем параллелизма, который я хочу обработать.
Можно ли объяснить это какой-либо другой причиной?
Комментарии:
1. «Зависит от того, кто использует валюту в своих интересах и как»? (Или есть более укоренившаяся проблема, например, возможность создавать потоки только на 4 ядрах? Какая-то близость?)
2. Какую JVM вы используете? Представляется маловероятным, что будет существовать ограничение на количество ядер, которые могут быть использованы.
3. Возможно, вы привязаны к чему-то другому, кроме чистого процессора, например, к пулу баз данных. Или сеансы пользователя tomcat.
4. Я использую Sun HotSpot 1.6.25, для тестирования у меня есть только логика приложения, нет ввода-вывода, подключений к БД и т.д.
Ответ №1:
В общем случае Java-приложение попытается запланировать каждый активный поток на отдельном ядре. Сюда входят потоки GC. Если приложение изначально не было привязано к процессору, то добавление дополнительных ядер не имело бы никакого значения, поскольку потоки чем-то заблокированы.
Для веб-приложения все становится немного сложнее. Увеличение размера пула потоков не будет иметь никакого значения, если есть что-то еще, чего ожидают потоки, например, база данных из пула подключений к базе данных. Вам нужно внимательно посмотреть на свои конфигурации балансировщика нагрузки и Tomcat. Если они не настроены должным образом, очень легко добиться описанного вами поведения.
Я бы не стал слишком беспокоиться о том, что JVM ограничена в количестве потоков, которые она может иметь. Я обычно вижу более 600 потоков в каждой JVM в нашей производственной системе. Мы используем 8-ядерные компьютеры, и запросы выполняются недолго, поэтому большинство этих потоков находятся в состоянии ожидания ввода-вывода.
Комментарии:
1. «приложение Java попытается запланировать каждый активный поток на отдельном ядре»… JVM не планируют потоки, планировщик ОС решает, какие потоки получают процессорное время и на каких ядрах они выполняются.
2. Правда, ввод-вывод может быть узким местом (хотя в моем случае это не так). Мой эксперимент показывает, что два процесса Java способны использовать аппаратное обеспечение более эффективно, чем один процесс на том же оборудовании. Мне любопытно узнать, следует ли этого ожидать и связано ли это с ограничениями, налагаемыми операционной системой на то, сколько часов может быть выделено одному процессу..
3. @Matt Верно, если вы используете собственные потоки (что и должно быть!). Не обязательно, если вы используете зеленые потоки. en.wikipedia.org/wiki/Green_threads