Настройки TCP с низкой задержкой в ​​Ubuntu

10

В моей лаборатории есть сервер для измерений на Ubuntu. И есть программа C, которая получает данные через TCP-соединение и должна как можно скорее отправить ответ.

конфигурация

  • Процессоры: 2 процессора x 4 ядра - Intel (R) Xeon (R) CPU E5345 @ 2,33 ГГц
  • Оперативная память: 12 ГБ
  • Сетевая карта: Корпорация Intel, 80003ES2LAN, гигабитный Ethernet-контроллер / 82546EB, гигабитный Ethernet-контроллер
  • Сетевой коммутатор: Cisco Catalyst 2960
  • Информация о данных: блоки данных прибл. каждые 10 миллисекунд. Размер блока данных составляет ок. 1000 байт.

Сетевая задержка при получении пакетов очень важна (важны десятки микросекунд). Я максимально оптимизировал программу, но у меня нет опыта настройки Ubuntu.

Что можно настроить в Ubuntu для уменьшения локальной задержки обработки / отправки пакетов?

Алекс V
источник
Да, я хотел бы знать марку / модель сервера.
ewwhite
Вы должны копать глубже. Прочитайте некоторые материалы об оптимизации ядра для высокочастотной торговли. Например, в продаже Cisco Paper: cisco.com/c/dam/en/us/products/colficial/switches/… так что приобретите приличную карту PCI-E с обеих сторон, вы сэкономите. Скорее всего (в зависимости от того, сколько времени вы хотите потратить на это) вы пересоберите хотя бы ядро ​​с различными настройками, удалив много вещей, которые нужны Ubuntu, но вы этого не делаете. Так что, как пишет в комментариях ewwhite, Ubuntu может не подойти для самых низких настроек.
Деннис Нольте
С перечисленным оборудованием это оборудование эпохи 2008 года (процессоры Intel серии 5300). В то время не было слишком много специальных изменений оборудования с низкой задержкой. Я бы установил системный BIOS для работы в высокопроизводительном режиме и отключил C-состояния процессора.
ewwhite
@ewwhite Да, вы правы насчет оборудования 2008 года. Я попробую ваши предложения. Спасибо!
Алекс V
Любая возможность настроить это программное обеспечение для TCP_NODELAY?
Мэтт

Ответы:

10

Честно говоря, я бы не стал использовать Ubuntu для этого ... но есть опции, которые можно применить к любому варианту Linux.

Вы хотите увеличить ваши буферы сетевого стека:

net.core.rmem_default = 10000000
net.core.wmem_default = 10000000
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

Если приложение записывает данные на диск, возможно, потребуется изменить планировщик / лифт (например, deadlineлифт).

На уровне сервера вы можете изменить регулятор ЦП и управление питанием и частотой ЦП (P-состояния, C-состояния).

На уровне ОС вы можете изменить приоритет вашего приложения в реальном времени ( chrt), оптимизируя его для сокращения прерываний, прикрепляя его к ЦП или группе ЦП ( taskset) и останавливая ненужные службы или демоны.

Вы также можете увидеть некоторые предложения по адресу: Как устранить задержки между двумя хостами Linux

Трудно быть более конкретным, не зная аппаратного или сетевого оборудования.

ewwhite
источник
3
Это не совсем подходящее место для религиозных дебатов. Возьмите это в другом месте, например, в чате.
Майкл Хэмптон
1
@MichaelHampton В обсуждении были интересные ссылки, связанные с вопросом: Руководство по настройке Red Hat Realtime .
Алекс V
6

Если вы идете по пути высокой производительности, обычно вам нужно запускать как можно меньше других (запланированных) процессов, поскольку они будут мешать вашему приложению.

Linux, как и классические операционные системы UNIX, предназначен для одновременной справедливой работы нескольких приложений и пытается предотвратить нехватку ресурсов, и вы будете стремиться к обратному, истощать все остальное, кроме вашего приложения. Простые шаги на уровне ОС меняют хороший уровень и приоритет вашего приложения в реальном времени, меняют планировщик или переходят на ядро реального времени .

TCP / IP обычно настраивается для предотвращения разрыва соединения и эффективного использования доступной пропускной способности. Чтобы получить наименьшую возможную задержку на очень быстром канале, а не на максимально возможной полосе пропускания для соединения, где некоторые промежуточные каналы более ограничены, вам нужно настроить параметры сетевого стека.

 sysctl -a 

покажет вам множество настроек ядра, которые вы можете настроить. Настройки зависят от того, используете ли вы IPv4 или IPv6 и что именно вы уже делаете в своем приложении, но может представлять интерес:

  • net.ipv4.tcp_window_scaling=1 RFC 1323 - поддержка размеров окна TCP IPV4 больше 64 КБ - обычно требуется в сетях с высокой пропускной способностью
  • net.ipv4.tcp_reordering=3 Максимальное количество раз, когда пакет IPV4 может быть переупорядочен в потоке пакетов TCP без TCP при условии потери пакетов и медленного старта.
  • net.ipv4.tcp_low_latency=1намеревался отдавать предпочтение низкой задержке по сравнению с более высокой пропускной способностью; Параметр = 1 отключает обработку пре-очереди IPC4 tcp
  • net.ipv4.tcp_sack=0 значение 1 включает выборочное подтверждение для IPV4, которое требует включения tcp_timestamps и добавляет некоторые издержки пакета, которые вам не нужны, если вы не испытываете потери пакетов
  • net.ipv4.tcp_timestamps=0 Рекомендуется только в тех случаях, когда требуется мешок.
  • net.ipv4.tcp_fastopen=1 Включить отправку данных в открывающем пакете SYN.

Большинство, если не все, лучше документированы в исходном коде ядра .

Конечно, вы можете кодировать необработанные TCP-сокеты и в целом обходить стек TCP / IP ядра.

Часто хорошо настроенные системы работают в доверенной сети и их локальные (iptables) брандмауэры отключаются.

HBruijn
источник