Member 13702159 Ответов: 2

Tomcat / обработка соединений при использовании режима NIO


Не могли бы вы сказать мне вот что:

Tomcat работает в режиме NIO – неблокирующего ввода-вывода (гораздо больше соединений, чем потоков).

maxConnections = 1000
maxThreads = 200

Предположим, что 300 соединений , например, все 300 пользователей могут быть обслужены Tomcat ??

Я имею в виду, что один поток из пула может переключаться между 2 или более соединениями из-за 300 > 200 ?

Что я уже пробовал:

Я попытался найти что-нибудь в интернете.

2 Ответов

Рейтинг:
2

Greg Utas

Вещи, которые я описал выше, обычно используют блокировку ввода-вывода. Но если это действительно не блокирует, вот что может происходить вместо этого.

Глобальная переменная отслеживает последний обслуживаемый сокет, чтобы потоки могли выполнять циклический перебор через сокеты. Когда поток запускается, он переходит к следующему сокету и читает его. Если в гнезде ничего нет, он переходит к следующему, и так далее, пока не найдет что-то. Затем он вызывает приложение, сообщая ему, какой сокет (=клиент) он обслуживает. Приложение создает фреймы сообщений и, когда оно имеет полное сообщение, выполняет работу, связанную с сообщением. Следующий поток для запуска продолжается со следующим сокетом, и так далее.

Это все еще оставляет вопрос о сокете слушателя, который должен обслуживаться чаще. Возможно, существует глобальный счетчик, который инициализируется некоторым значением. Каждый поток уменьшает его, и когда он достигает нуля, поток обслуживает сокет слушателя вместо следующего клиентского сокета.

Результат этого будет похож на то, что я описал ранее. Частота блоков приложения определяет, сколько потоков требуется для обработки клиентов. Если приложение никогда блоки, достаточно одной нити. Чем чаще блокируется приложение и чем больше времени требуется для завершения операций блокировки, тем больше потоков потребуется. Теория массового обслуживания или моделирование даст вам лучшее представление о том, сколько их на самом деле требуется.


Рейтинг:
0

Greg Utas

Я ничего не знаю о Tomcat, поэтому я буду следовать вашему описанию и ответу, который вы получили на свой вопрос. первоначальный вопрос[^].

Я не знаю, для чего нужны все эти нити, но догадываюсь. Более одной нити на порт прослушивателя в этом нет необходимости. Одна нить может listen для новых соединений, accept их до какого-то предела, poll все полученные сокеты для новых пакетов, recv пакеты из этих сокетов и с помощью обратного вызова приложения собирают их в правильно оформленные сообщения, которые в конечном итоге помещаются в очередь в качестве рабочих элементов для рабочих потоков приложения.

Я могу назвать две причины, по которым на службу TCP приходится более одного потока. Во-первых, поток, который делает то, что я только что описал, может не получить достаточно процессорного времени, когда он борется с большим количеством других потоков. Таким образом, игра, в которую играют, состоит в том, чтобы создать больше потоков, чтобы получить больше процессорного времени. Это одна из радостей упреждающего и приоритетного планирования, и я написал статьи о том, почему это глупо. Но это то, что делает большинство систем, так что это не будет сюрпризом.

Во-вторых, работа приложения может выполняться непосредственно из этих потоков. То есть, система не имеет слой массового обслуживания между уровнем ввода-вывода и прикладным уровнем. Приложение не предоставляет свои собственные потоки, но вместо этого вызывается потоками, которые также обслуживают сокеты. Обычно это плохая конструкция, но она также объясняет существование всех этих потоков, особенно если приложения часто выполняют блокирующие операции (например, дисковый ввод-вывод или чтение/запись базы данных).

Это может дать вам некоторое представление о том, что может происходить. Если ввод-вывод не блокируется, то 200 потоков вполне могут обрабатывать 300 клиентов, если система работает так, как описано в предыдущем параграфе, при условии, что приложение не блокирует потоки так часто, что ни один из них не доступен для обработки входящей работы.