В моей лаборатории есть сервер для измерений на Ubuntu. А есть программа на C, которая получает данные через TCP-соединение и должна как можно скорее отправить ответ.
Конфигурация
Сетевая задержка при получении пакетов очень критична (важны десятки микросекунд). Оптимизировал программу по максимуму, но опыта настройки Ubuntu у меня нет.
Что можно настроить в Ubuntu для уменьшения локальной задержки обработки / отправки пакетов?
Честно, Я бы не стал использовать для этого 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
Трудно получить более конкретную информацию, не зная задействованного оборудования или сетевого оборудования.
Если вы идете по пути высокой производительности, обычно вам нужно запускать как можно меньше других (запланированных) процессов, поскольку они будут мешать вашему приложению.
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 отключает обработку предварительной очереди TCP IPV4net.ipv4.tcp_sack=0
установка значения 1 включает выборочное подтверждение для IPV4, что требует включения tcp_timestamps и добавляет некоторые служебные данные для пакетов, которые вам не нужны, если вы не испытываете потери пакетовnet.ipv4.tcp_timestamps=0
Рекомендуется только в тех случаях, когда нужен мешок.net.ipv4.tcp_fastopen=1
Разрешить отправку данных в открывающем SYN-пакете.Большинство, если не все, лучше документированы в исходный код ядра.
Вы, конечно, можете кодировать необработанные сокеты TCP и в значительной степени полностью обойти стек TCP / IP ядра.
Часто хорошо настроенные системы работают в доверенной сети, и их локальные (iptables) брандмауэры отключены.