Ответ 1
Провокационная публикация блога, "Избегайте NIO, получите лучшую пропускную способность" . Paul Tyma (2008) blog утверждает, что ~ 5000 потоков без проблем; Я слышал, что люди требовали больше:
- С NPTL on, Sun и Blackwidow JVM 1.4.2 легко масштабируется до 5000+ потоки. Модель блокировки была последовательно на 25-35% быстрее, чем при использовании Селекторы NIO. Много методов предложенные людьми EmberIO, были - использование нескольких селекторов, делать несколько (2), если первый read возвратил эквивалент EAGAIN в Ява. Но мы не могли победить равнину нить на модель подключения с Linux NPTL.
Я думаю, что ключевым моментом является измерить накладные расходы и производительность и сделать переход на не- блокируя ввод-вывод только тогда, когда вы знаете, что вам нужно, и можете продемонстрировать улучшение. Дополнительные усилия по написанию и поддержанию неблокирующего кода должны быть учтены в вашем решении. Мое мнение: , если ваше приложение может быть четко выражено с помощью синхронного/блокирующего ввода-вывода, DO THAT. Если ваше приложение совместимо с неблокирующими вводами-выводами, вы не будете просто плохо изобретать блокирование ввода-вывода в пространстве приложения, CONSIDER переходить на nio на основе измеренных потребностей в производительности. Я поражен, когда я ткнул результаты Google для этого, так как немногие из ресурсов на самом деле ссылаются на любые (последние) номера!
Кроме того, см. слайды презентации Paul Tyma: Старый путь снова новый. Основываясь на его работе в Google, конкретные цифры говорят о том, что синхронный потоковый ввод-вывод довольно масштабируемо в Linux и считают, что "NIO быстрее" - это миф, который был прав на некоторое время, но больше не существует. Некоторый хороший дополнительный комментарий здесь, на Comet Daily. Он цитирует следующее (анекдотическое, до сих пор нет четкой ссылки на тесты и т.д.) На NPTL:
В тестах NPTL удалось запустить 100 000 потоков на IA-32 в двух секунд. Для сравнения, этот тест под ядром без NPTL было бы около 15 минут
Если вы действительно сталкиваетесь с проблемами масштабируемости, вы можете настроить размер стека потоков с помощью XX:ThreadStackSize
. Поскольку вы упоминаете Tomcat см. Здесь.
Наконец, если вы привязаны и настроены использовать неблокирующие операции ввода-вывода, приложите все усилия для создания существующей структуры людьми, которые знают что они делают. Я потратил слишком много времени, пытаясь получить правильное неблокирующее решение ввода-вывода (по неправильным причинам).
См. также связанный с SO.