Подтвердить что ты не робот

Архитектура коннектора Tomcat, пулы потоков и асинхронные сервлеты

Я хотел бы понять модель потока Tomcat для разъемов BIO и NIO. Я ссылаюсь на официальный документ Tomcat 7 для разъемов, который можно найти здесь. Основываясь на этом, я сомневаюсь:

  • acceptorThread (s). Это один или не более чем 2 потока (как указано в документе), который отвечает только за принятие входящих соединений. Это можно настроить с помощью acceptorThreadCount, и он предположил, что для многопроцессорной машины может использоваться более двух -
    • почему это?
    • Означает ли это, что количество одновременных открытых подключений масштабируется с числом процессоров в зависимости от количества дескрипторов открытых файлов, разрешенных в серверной системе?
  • maxConnections (s):
    • Какова связь между этим параметром и acceptCount и количеством дескрипторов открытых файлов в системе.
    • Почему значение по умолчанию для этого гораздо выше для NIO-коннектора (10000), чем для BIO (= maxThreads)?
  • acceptCount. Это очередь для запросов, когда все потоки обработки запросов заняты.
    • Когда запросы помещаются в эту очередь, также назначен дескриптор файла? Или это только, когда запрос активно обрабатывается, использует ли он файловый дескриптор?
  • запросы обработки запросов. Количество потоков в этом пуле настраивается атрибутами maxThreads и minSpareThreads.
    • Какова связь между этим пулом потоков и acceptorThreads? Влияет ли нить акцептора в поток в этом пуле?
    • Как я понимаю, модель NIO более эффективна с потоками обработки запросов, чем модель BIO. Как он достигает этой эффективности?
    • Как я читал в разных источниках, потоки в модели NIO соответствуют парадигме потока за запрос по отношению к парадигме потока для каждой модели BIO. Кроме того, в модели соединителя NIO фактическая обработка запроса делегируется в другой поток, контролируемый приложениями, тогда как поток обработки запросов сервера возвращается в пул потоков, чтобы принимать больше соединений. Итак, подразумевает ли это, что преимущества модели NIO будут очевидны только в том случае, если соединения с сервером имеют характер сохранения HTTP или если приложение использует асинхронную обработку сервлетов 3.0?
  • Servlet 3.0:
    • При использовании Servlet 3.0, каков должен быть размер пула потоков сервлета приложения (относительно размера пула соединительных нитей) для достижения оптимальной эффективности?
    • При использовании модели BIO и вместе, будет ли какая-либо разница в том, как обрабатываются запросы (учитывая, что потоки соединителей все еще будут использовать поток для каждой модели подключения)?

Обратите внимание: все обсуждения в отношении tomcat 7.

4b9b3361

Ответ 1

  • acceptorThread (s): это одиночный или не более 2 потоков (как упомянутый в документе), который отвечает только за принятие входящие соединения. Это можно настроить с помощью acceptorThreadCount, и он предположил, что можно использовать более двух для машины с несколькими процессорами -

    почему это?

Принятие соединений - операция с очень низкой стоимостью, поэтому просто не имеет смысла выделять более одной нити этой задачи.

Does this imply that the number of simultaneous open connections 
scales with the number of cpus versus the number of open file descriptors 
allowed on the server system ?

Нет, это не так, потому что это очень низкая стоимость с точки зрения процессора. Что касается дескрипторов файлов, каждое принятое соединение будет использовать файловый дескриптор, поэтому максимальный номер соединений, которые может принимать сервер, ограничен количеством доступных дескрипторов файлов.

  • maxConnections (s):

    Какова связь между этим параметром и acceptCount и числом открытых файловых дескрипторов в системе.

maxConnections не может быть больше числа дескрипторов открытых файлов в системе. Имейте в виду, что в других процессах также используются дескрипторы файлов, поэтому они могут быть консервативными с maxConnections в отношении доступных дескрипторов файлов, скажем, maxConnections < файловые дескрипторы /2.

Why is the default value for this so much higher for the NIO connector 
( 10000 ) than for the BIO ( = maxThreads ) ?

Это связано с тем, что в NIO один обрабатывает все IO, а в BIO серверу необходимо создать/использовать отдельное поточное соединение.

  • acceptCount. Это очередь для запросов, когда все запросы обработки запросов заняты.

    Когда запросы помещаются в эту очередь, также назначен дескриптор файла?

Да, это исправляет запрос на соединение, но сервер еще не готов к отправке запросов, поэтому соединение помещается в очередь. Это делается для того, чтобы избежать сбоев синхронизации TCP/стека, которые могут выглядеть как сервер с точки зрения клиента. Другими словами, сервер говорит: "Я здесь и обработаю ваш запрос, когда у меня есть ресурсы, чтобы сделать это".

Или это только, когда запрос активно обрабатывается, использует ли он файловый дескриптор?

Неа.

Надеюсь, это поможет.

Привет,

Слава Имешев