[Netty] «Расширенная оптимизация» (4) Изучите параметры конфигурации Netty и создайте отличные сетевые приложения.
[Netty] «Расширенная оптимизация» (4) Изучите параметры конфигурации Netty и создайте отличные сетевые приложения.

Предисловие

Эта запись в блоге называется «Обучение от 0 до 1». Netty》От среднего до продвинутогосистема Четвертая запись в блоге из этой серии.,Основное содержание — этопроходить Исходный коди Пример комбинированного анализа,Исследовать Netty Общие константы конфигурации для управления поведением базовых сетевых операций.,Прошлые проблемысистема Для статей, пожалуйста, посетите Блогер Столбец Нетти,Все коды в сообщении блога собраны.существоватьРепозиторий Blogger на GitHubсередина;

представлять

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

  1. CONNECT_TIMEOUT_MILLIS:соединятьтайм-аут。
  2. SO_BACKLOG:соединять Запрошеноочередьразмер。
  3. TCP_NODELAY:Запрещать Nagle алгоритм уменьшения задержки.
  4. SO_SNDBUF и SO_RCVBUF:Отправить буферибуфер приемаизразмер。
  5. ALLOCATOR:распределитель памяти,Для выделения объекта ByteBuf.
  6. RCVBUF_ALLOCATOR:распределитель буфера приема,для распространения SocketChannel Буфер для приема данных.

В дополнение к приведенным выше примерам, Netty Дополнительные параметры предусмотрены для настройки сетевых операций на разных уровнях, например. SSL/TLS Поддержка, настройки прокси и т.д. Эти параметры можно передать Bootstrap или ServerBootstrap Объект option() метод установки.

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

CONNECT_TIMEOUT_MILLIS

существовать Netty середина,CONNECT_TIMEOUT_MILLIS Параметр, используемый для установки времени ожидания соединения. Он определяет максимальное время, в течение которого клиент ожидает ответа от сервера при попытке установить соединение.

когда мы используем Netty При создании клиента подключаться,Отправит запрос на соединение на сервер,и дождитесь ответа сервера. Если сервер существует не отвечает в течение указанного таймаута,соединение будет считаться тайм-аутом и не удастся.

установив CONNECT_TIMEOUT_MILLIS Параметры, которые могут контролировать таймаут соединения. Если лимит времени превышен и соединение не установлено, то Netty бросит ConnectTimeoutException Исключения, чтобы мы могли соответствующим образом обрабатывать их в нашем коде.

Вот пример кода:

Создайте Bootstrap Экземпляр, используемый для запуска и подключения клиента, вызова option() метод и передать ChannelOption.CONNECT_TIMEOUT_MILLIS параметр, установите тайм-аут соединения на 5 секунд, это означает, что когда существование пытается построить соединение сервера, если время соединения соединения превышает 5 секунд, будет выдано исключение тайм-аута соединения.

Язык кода:javascript
копировать
new Bootstrap().option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000);

Создайте ServerBootstrap Экземпляр, используемый для запуска и подключения на стороне сервера. Вот option() Метод устанавливает параметры уровня сервера, которые влияют на все полученные соединения.

Язык кода:javascript
копировать
new ServerBootstrap().option(ChannelOption.CONNECT_TIMEOUT_MILLIS,5000);

Создайте ServerBootstrap Экземпляр, используемый для запуска и подключения на стороне сервера. Вот childOption() Метод устанавливает параметры подуровня соединения, влияющие на каждое принятое соединение. SocketChannel。

Язык кода:javascript
копировать
new ServerBootstrap().childOption(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000);

Хочу больше идти глубжепониматьсоединятьдогонятьчас Принцип настройки,Пожалуйста, переместите Блогер Предыдущая статья:«Анализ исходного кода» (3) Установить таймаут соединения: идти к углублению анализа ChannelFuture.sync() исполнения процесса

SO_BACKLOG

Настройки параметров

концепцияпредставлять

существоватьNettyсередина,SO_BACKLOG Параметры, используемые для установки ожидания сокета серверасоединятьочередьизразмер,Он контролирует, когда сервер установил все доступные потоки обработки.,И запрос на соединение и существование продолжает поступать,можно спастисуществоватьочередьсерединаизмаксимумсоединятьчисло。

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

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

Следует отметить, что,SO_BACKLOG женьшеньчислоиз Фактическое поведение может отличаться в зависимости от операции.системаварьируются от системы к системе,существоватьопределенные операциисистема Систематически,SO_BACKLOG Значение параметра усекается до максимального значения, разрешенного операционной системой. Кроме того, если в операционной системе нет ограничения на размер очереди ожидания соединений, то SO_BACKLOG Для значения параметра не будет явного верхнего предела.

существовать До реализации кода,Давайте сначала поймем TCP Процесс установления соединения показан на рисунке ниже:

существовать Изображение вышесередина,Сначала серверпроходить bind() и listen() Функция привязки и порта прослушивания, который передает клиент connect() Функция отправляет серверу запрос на установление соединения:

  1. Клиент отправляет на сервер SYN числопакет данных,Запрос на созданиесоединять。
  2. После того, как сервер существует, он получит пакет данных, он сохранит объект, инкапсулирующий информацию о соединении, в половине соединенияочереди. syns queue , и в то же время сервер также отправит SYN+ACK ответный пакет.
  3. После того как клиент существует, получает ответный пакет, он переходит в состояние, установленное соединением.
  4. После того, как сервер существует, получит ответный пакет, он передаст и сохранит объекты от половины соединения до полного соединения. accept queue , и в то же время статус сервера меняется на ESTABLISHED。

существовать Заканчивать TCP После трехстороннего рукопожатия сервер передает accept() Функция извлекает информацию о соединении из полной очереди подключений и завершает установление соединения.

Читатели, желающие узнать больше о протоколе TCP, могут прочитать предыдущие записи блоггера:


демо-код

проходить option() Метод устанавливает полный размер очереди подключений сервера равным 2:

Язык кода:javascript
копировать
new ServerBootstrap().option(ChannelOption.SO_BACKLOG, 2);

Результаты запуска:

Почему одновременно запускаются три клиента, что явно превышает установленный нами полный размер соединения, но никаких исключений не возникает?

Это потому, что эффективность обработки данных Netty очень превосходна.,Эти три запроса на соединение были обработаны за короткое время.,поэтому Это не вызвало наплыва запросов。

Далее используем точки останова для имитации ситуации накопления запросов, как показано на следующем рисунке:

использовать концепцию достоинства, мы знаем, что сервер в конечном итоге позвонит accept() Комплексный подходсоединятьочередьсерединавыигратьсоединятьинформация,поэтому,Давайте сделаем точку останова в месте, показанном на картинке выше.,Поддержание совместной информации всегда в режиме совместного существования,Тем самым вызывая блокировку поворота.

Запустите сервер в режиме DEBUG, а затем одновременно запустите три клиента. Результаты следующие:

Вышеуказанные результаты больше соответствуют нашим ожидаемым результатам.

Читатели, которым нужен полный код, посетите блоггера. Github:TestBacklogServer,TestBacklogClient

значение по умолчанию

потому что это bind() Метод будет использоваться BACKLOG, поэтому мы начинаем с этого метода, чтобы проверить его настройки по умолчанию.

существовать ServerSocketChannel нашел в классе bind() метод,проходить Найти метод Функция, найдите ее существование NioSocketChannel.doBind Метод используется следующим образом:

doBind() Исходный код выглядит следующим образом:

Язык кода:javascript
копировать
@Override  
protected void doBind(SocketAddress localAddress) throws Exception {  
    if (PlatformDependent.javaVersion() >= 7) {  
        javaChannel().bind(localAddress, config.getBacklog());  
    } else {  
        javaChannel().socket().bind(localAddress, config.getBacklog());  
    }  
}

Приведите приведенный выше исходный код, мы можем знать BACKLOG иззначение по умолчаниюдасуществовать config центр, справа config Проследите и обнаружите, что его значение является вызывающим методом. NioServerSocketChannelConfig приобретено, в то время как BACKLOG изначальное значение Точносуществовать NioServerSocketChannelConfig родительский класс DefaultServerSocketChannelConfig Инициализация в коде следующая:

Язык кода:javascript
копировать
public class DefaultServerSocketChannelConfig extends DefaultChannelConfig  
                                              implements ServerSocketChannelConfig {  
  
    private volatile int backlog = NetUtil.SOMAXCONN;

}

Продолжать следить NetUtil Посмотреть в классе:

Язык кода:javascript
копировать
/**  
* The SOMAXCONN value of the current machine. If failed to get the value, {@code 200} is used as a  
* default value for Windows or {@code 128} for others.  
*/  
public static final int SOMAXCONN;

Как говорится в комментариях, если вы можете получить это из файла конфигурации SOMAXCONN значение, используйте его напрямую, иначе Windows Операционная система SOMAXCONN Значение по умолчанию равно 200,И другие Операционная система SOMAXCONN Значение по умолчанию равно 128。

TCP_NODELAY

существовать Netty Средний, TCP_NODELAY это TCP Параметр, используемый для управления возможностью включения Nagle алгоритм. Нэгл алгоритмдасетьоптимизацияалгоритм,Он объединяет небольшие пакеты данных в более крупные пакеты данных для передачи.,Чтобы уменьшить накладные расходы на передачу по сети.

TCP_NODELAY Функция параметра – контролировать, следует ли отключать Nagle алгоритм. когда TCP_NODELAY Параметры установлены на true , это значит отключено Nagle алгоритм,Данные отправляются немедленно,Вместо ожидания заполнения буфера или задержки истечения таймера,Это важно для приложений, которым требуется низкая задержка.,Например, общение в реальном времени или интерактивные приложения.

Однако,существовать в определенных конкретных сценариях,Если вам нужно минимизировать сетевые передачи,Рассмотрите возможность включения Nagle Алгоритм, скоро TCP_NODELAY Настройки параметровдля false

Пример кода выглядит следующим образом:

Язык кода:javascript
копировать
new ServerBootstrap().childOption(ChannelOption.TCP_NODELAY, true)

SO_SNDBUF & SO_RCVBUF

существовать Netty середина,SO_SNDBUF и SO_RCVBUF — это два параметра, связанные с размером буфера сокета. Они используются для установки размера буфера сокета, используемого для передачи и приема данных в базовой операционной системе.

  1. SO_SNDBUF(Отправить буфер):это значит отправитьчислов соответствии счасприложение Можетиспользоватьизбуфер сокетаизразмер。Когда приложениепроходитьсокет отправкичислов соответствии счас,Данные сначала будут скопированы в буфер отправки.,Затем он отправляется операционной системой. Если буфер отправки слишком мал,Это может привести к снижению скорости отправки или невозможности отправки. увеличение количества SO_SNDBUF Это значение может повысить эффективность и производительность отправки данных.
  2. SO_RCVBUF(буфер приема):это означает получениечислов соответствии счасприложение Можетиспользоватьизбуфер сокетаизразмер。При работесистемасистема получаетчислов соответствии счас,Данные будут храниться в буфере приема.,Затем приложение считывает данные из этого буфера. Если буфер приема слишком мал,может привести кчислов соответствии с丢失или Прием идет медленно。проходитьувеличивать SO_RCVBUF Это значение может повысить эффективность и производительность получения данных.

эти двое Параметры значения по По умолчанию обычно определяется операционной системой и может содержать ChannelOption.SO_SNDBUF и ChannelOption.SO_RCVBUF возможность продолжить Конфигурация。существовать Netty середина,Можетпроходить ServerBootstrap и Bootstrap сорт option() Методы устанавливают значения этих опций.

Пример кода выглядит следующим образом:

Язык кода:javascript
копировать
new ServerBootstrap()  
        .option(ChannelOption.SO_SNDBUF, 1024 * 1024)  
        .option(ChannelOption.SO_RCVBUF, 1024 * 1024)

new ServerBootstrap()
        .childOption(ChannelOption.SO_SNDBUF, 1024 * 1024)  
        .childOption(ChannelOption.SO_RCVBUF, 1024 * 1024)

существуют В приведенном выше коде,Установите размер буфера отправки и размер буфера приема сервера на 1 МБ.,существоватьклиентсередина,Можетпроходить Bootstrap класс для установки.

ALLOCATOR

существовать Netty середина,ALLOCATOR Параметры, используемые для указания распределителя, используемого для выделения памяти. Нетти Предоставляются разные типыизраспределитель,Можно выбрать в соответствии с конкретными потребностями,Используйте подходящий дозатор.,Возможна оптимизация распределения памяти и повышение производительности.

существовать Bootstrap или ServerBootstrap середина,Можетпроходить option(ChannelOption.ALLOCATOR, allocator) установить ALLOCATOR женьшеньчисло。Чтосередина,allocator Это реализовано ByteBufAllocator объект интерфейса.

Теперь необходимо добавить код написания существующего в клиенте,существует Добавить код чтения на сервере,Как показано ниже:

Язык кода:javascript
копировать
// client
@Override  
public void channelActive(ChannelHandlerContext ctx) throws Exception {  
    ctx.writeAndFlush(ctx.alloc().buffer().writeBytes("Hello, World! --sidiot.".getBytes()));  
}

// server
@Override  
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {  
    log.debug(String.valueOf(ctx.alloc().buffer()));  
}

Результаты запуска:

значение по умолчанию

PooledUnsafeDirectByteBuf Точно ALLOCATOR Параметры значения по По умолчанию, мы продолжим анализировать его исходный код так же, как и раньше, и найдем ChannelConfig в классе ALLOCATOR Параметры:

Продолжайте следить и узнавать DefaultChannelConfig унаследованный ChannelConfig,И для allocator Инициализировано:

Язык кода:javascript
копировать
public class DefaultChannelConfig implements ChannelConfig {
    private volatile ByteBufAllocator allocator = ByteBufAllocator.DEFAULT;
}

Продолжайте идти глубже ByteBufAllocator класс, открытие ByteBufAllocator.DEFAULT значение определяется ByteBufUtil Дано классом:

Язык кода:javascript
копировать
public interface ByteBufAllocator {
    ByteBufAllocator DEFAULT = ByteBufUtil.DEFAULT_ALLOCATOR;
}

идти глубже ByteBufUtil Можно обнаружить, что блок статического кода, реализованный внутри его класса, DEFAULT_ALLOCATOR Для назначения, если это система Android, по умолчанию используется не объединенный в пул. ByteBuf; в то же время, если пары нет. VM опция установлена, по умолчанию используется пул. ByteBuf:

Затем мы устанавливаем параметры виртуальной машины и устанавливаем для нее тип без объединения. Результаты следующие:

Однако мы использовали прямую память, так что же нам делать, если мы хотим использовать динамическую память?

Мы идем глубже PooledByteBufAllocator.DEFAULT Исследуя и обнаружил, что он вызывает PlatformDependent.directBufferPreferred():

Язык кода:javascript
копировать
public static final UnpooledByteBufAllocator DEFAULT =  
        new UnpooledByteBufAllocator(PlatformDependent.directBufferPreferred());

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

продолжатьустановив VM варианты изменения ByteBuf Тип:

Настройки параметров

АЛЛОКАТОР используется следующим образом:

Язык кода:javascript
копировать
new ServerBootstrap().childOption(ChannelOption.ALLOCATOR, new PooledByteBufAllocator());

Второй параметр необходимо передать в ByteBufAllocator, используемый для указания сгенерированного ByteBuf Тип:

Объединение & Прямая память:

Язык кода:javascript
копировать
new PooledByteBufAllocator(true);

Объединение & Куча памяти:

Язык кода:javascript
копировать
new PooledByteBufAllocator(false);

Нет Объединение & Прямая память:

Язык кода:javascript
копировать
new UnpooledByteBufAllocator(true);

Нет Объединение & Куча памяти:

Язык кода:javascript
копировать
new UnpooledByteBufAllocator(false);

постскриптум

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

провести конфигурацию по параметрам в статье,Мы можем оптимизировать время ожидания, управлять полной длиной последовательностей соединений, корректировать стратегию передачи данных, контролировать размер буферов отправки и приема и достигать эффективного распределения памяти. Гибкость и возможность настройки этих параметров конфигурации.,делать Netty Станьте предпочтительной средой для создания высокопроизводительных масштабируемых веб-приложений.

Вот и все исследовать Netty Параметры конфигурации для создания превосходных сетевых приложений Весь контент, надеюсь, этот пост в блоге будет полезен всем!

ссылка:

📝 Последняя глава посвящена:「Анализ исходного кода" (3) Установить таймаут соединения: углубить анализ ChannelFuture.sync() процесса исполнения 💖 Я 𝓼𝓲𝓭𝓲𝓸𝓽, жду вашего рассмотренияПримечание,Творить непросто,Пожалуйста, поддержите меня; 👍 Официальный аккаунт:sidiotтехнологическая станция; 🔥ОтделСписок Столбец:исследовать Netty:источникАнализ кода и обмен кейсами приложений

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose