#java #sockets #nio
#java #сокеты #nio
Вопрос:
У меня есть программа, которая считывает данные сокета в реальном времени из внешнего источника и передает их нескольким клиентам так быстро, как только может. Пропускная способность данных от источника составляет 200 КБ, а клиентов меньше 10.
Сервер и клиенты находятся в интрасети и на карте gigabit Ethernet.
В настоящее время я использую mina 1.x, который является платформой nio. Но я обнаружил, что производительность не так хороша, как я ожидал.
Я думаю, правильно ли использовать nio для этого приложения? (Я слышал, что nio подходит для тысяч клиентов)
Имеет ли традиционный сокет лучшую производительность, чем nio в этом случае?
Комментарии:
1. какую производительность вы видите? Что вы хотите, чтобы это было?
Ответ №1:
По моему опыту, блокировка NIO лучше всего работает для небольшого количества (около 10) подключений. Однако любой используемый вами подход обычно достаточно быстр, чтобы насытить сеть 10 гигабайт. (Это имеет значение только при обратной связи или если у вас пропускная способность намного больше 10 гигабайт)
Какую сеть вы используете? Какие цифры вы получаете?
Вот старый тест, который я сделал. http://vanillajava.blogspot.com/2010/07/java-nio-is-faster-than-java-io-for.html Даже один клиент насыщает соединение объемом 1 Гб, используя любой из этих подходов. Кстати, это было запущено на старом ПК.
Комментарии:
1. Сервер и клиенты находятся в интрасети и на карте gigabit Ethernet.
2. @PerterLawrey, из вашего блога NIO всегда имеет лучшую производительность, чем socket? Неважно, сколько там клиентов?
3. Блокировка NIO очень хорошо работает для соединений с малым и средним числом. Для большого количества подключений я бы использовал неблокирующий NIO. Я бы использовал IO, если у вас есть библиотеки, для которых требуются потоки ввода / вывода.
4. NIO блокируется по умолчанию, как и IO. NIO часто делается неблокирующим, что добавляет некоторую сложность, но вам не обязательно использовать неблокирующий NIO.