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