Параметри TCP з низькою затримкою на Ubuntu


10

У моїй лабораторії є сервер для вимірювань, що працює на Ubuntu. І є програма C, яка отримує дані через TCP-з'єднання і повинна якомога швидше надсилати відповідь.

Конфігурація

  • Процесори: 2 процесори x 4 ядра - Intel (R) Xeon (R) процесор E5345 при 2,33 ГГц
  • ОЗУ: 12 ГБ
  • NIC: Intel Corporation 80003ES2LAN Gigabit Ethernet Controller / 82546EB Gigabit Ethernet Controller
  • Мережевий комутатор: Cisco Catalyst 2960
  • Інформація про дані: Блоки даних надходять приблизно кожні 10 мілісекунд. Розмір блоку даних становить приблизно 1000 байт.

Затримка мережі при отриманні пакетів дуже важлива (важливі десятки мікросекунд). Я оптимізував програму по максимуму, але у мене немає досвіду налаштування Ubuntu.

Що можна налаштувати в Ubuntu, щоб зменшити локальну затримку обробки / відправки пакетів?


Так, я хотів би знати марку / модель сервера.
ewwhite

вам слід копати глибше. читайте деякі відомості про оптимізацію ядра для торгівлі на високих частотах. Будь-який папір Cisco з продажу: cisco.com/c/dam/en/us/products/collateral/switches/…, тож отримайте гідну карту PCI-E з обох сторін, і заощадите трохи. Швидше за все (залежно від того, скільки часу ви хочете витратити на це), ви відновите принаймні ядро ​​з різними налаштуваннями, видаливши багато речей, які потрібні ubuntu, але ви цього не зробите. Так як ewwhite писав у коментарях, ubuntu може бути не ідеально підходить для найнижчих налаштувань.
Денніс Нолте,

З перерахованим обладнанням, це обладнання 2008 року (процесори серії Intel 5300). Тоді спеціальних змін апаратного забезпечення з низькою затримкою не було можливим. Я встановив би, що системний BIOS запускається у високоефективному режимі та відключає CP-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-States, C-States).

На рівні ОС ви можете змінити пріоритет свого додатка в режимі реального часу ( chrt), оптимізуючи для зменшення перерв, закріпивши його на процесорі або групі процесорних процесорів ( taskset) та зупинивши непотрібні сервіси чи демон.

Ви також можете ознайомитись із порадами: Як усунути затримки між двома хостами Linux

Важко отримати більш конкретні дані, не знаючи, яке обладнання та мережеве обладнання.


3
Це насправді не місце для релігійних дебатів. Візьміть його в іншому місці, наприклад, в чаті.
Майкл Хемптон

1
@MichaelHampton Були цікаві посилання в дискусії, пов'язані з питанням: Посібник з налаштування реального часу з Red Hat .
Олексій V

6

Якщо ви їдете по маршруту з високою продуктивністю, вам потрібно запустити якомога менше інших (запланованих) процесів, оскільки вони будуть перешкоджати вашій програмі.

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

TCP / IP, як правило, налаштовується для запобігання перепадів з'єднання та ефективного використання пропускної здатності. Щоб отримати найменшу можливу затримку з дуже швидкого зв'язку, а не отримувати максимальну пропускну здатність із з'єднання aa, де деякі проміжні посилання є більш обмеженими, ви збираєтеся скорегувати налаштування мережевого стеку.

 sysctl -a 

покаже вам безліч налаштувань ядер, які ви можете настроїти. Налаштування залежать від того, ви використовуєте IPv4 чи IPv6 і що саме ви вже робите у своїй програмі, але це може бути цікавим:

  • net.ipv4.tcp_window_scaling=1 RFC 1323 - підтримка IPV4 розмірів вікон TCP більше 64K - зазвичай потрібна у мережах з високою пропускною здатністю
  • net.ipv4.tcp_reordering=3 Максимальний раз, коли пакет IPV4 може бути переупорядкований у потоці пакетів TCP, без TCP припускати втрату пакету і переходити до повільного запуску.
  • net.ipv4.tcp_low_latency=1призначений віддати перевагу низькій затримці над більшою пропускною здатністю; налаштування = 1 вимикає обробку попередніх запитів IPV4 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) брандмауери відключені.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.