Назад | Перейти на главную страницу

Нужна сверхнизкая задержка, как ее минимизировать?

У меня есть несколько компьютеров с Windows Server 2008 R2, которые действуют как клиенты и подключены к другому серверу в том же центре обработки данных. У меня нет доступа к серверу. Мне нужно минимизировать задержку между клиентами и сервером. Они общаются через Macromedia Flash (Winsockets) и обмениваются очень небольшими командами (20-30 байт). Обычная задержка составляет 200-400 микросекунд, но из моего опыта и некоторых тестов (выполненных с помощью MS Network Monitor) кажется, что во Flash-приложении время отклика очень часто составляет несколько миллисекунд, по крайней мере, и это не из-за программное обеспечение.

Я подозреваю, что это могло быть из-за алгоритма Нэгла или задержанных ACK. Я попытался отключить оба через реестр, но, похоже, это не повлияло на Server 2008 R2. Я знаю, что могу настроить MTU и некоторые другие значения с помощью реестра: DefaultSendWindow, DefaultReceiveWindow, GlobalMaxTcpWindowSize, TcpWindowSize. Я предполагаю, что я должен попытаться установить буфер отправки на 0 и буфер приема на большое значение, это правильная стратегия?

У меня самый быстрый процессор, который я мог получить, я отключил модерацию прерываний для сетевой карты, что еще я могу сделать, чтобы минимизировать задержку? Для меня важны даже 100 микросекунд.

Вот документ Microsoft по настройке производительности для Windows Server 2008 R2:

http://download.microsoft.com/download/6/B/2/6B2EBD3A-302E-4553-AC00-9885BBF31E21/Perf-tun-srv-R2.docx

В этом документе 136 страниц рекомендаций по настройке производительности.

Вы также можете получить интересную информацию на сайте support.microsoft.com/kb/214397/en-us.

Вы также можете попробовать отключить платформу фильтрации Windows, что обычно не рекомендуется, но может помочь сократить путь ввода-вывода через операционную систему.

У вас также есть множество технологий, которые Microsoft внедрила в Windows, которые были специально предназначены для сетей с низкой задержкой, хотя большинство из них являются конкретными улучшениями 2012 года, а не 2008 R2:

http://technet.microsoft.com/en-us/library/hh831415.aspx

  1. Мост для центров обработки данных

  2. Протокол управления передачей данных в центре обработки данных (DCTCP)

  3. Удаленный прямой доступ к памяти в режиме ядра (kRDMA)

  4. Сетевая карта (NIC) Teaming

  5. NetworkDirect

  6. Объединение сегментов приема (RSC)

  7. Масштабирование стороны приема (RSS)

  8. Зарегистрированные расширения API ввода / вывода (RIO)

  9. Оптимизация обратной связи протокола управления передачей (TCP)

  10. Управление рабочими нагрузками и операциями с низкой задержкой

Но с настройкой программного обеспечения вы сможете сделать лишь так много. Просто обновив свое оборудование до Infiniband / RDMA через конвергентный Ethernet, вы получите резкое сокращение задержки, которого вы никогда не сможете добиться, переключая биты в реестре Windows.

Наконец, вот кое-что более непосредственное отвечая на ваш вопрос об отложенном ACK. Не знаю, действительно ли это ваша проблема или нет, но:

Подраздел: HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters \ Interfaces \

Запись: TcpAckFrequency

Тип значения: REG_DWORD, число Допустимый диапазон: 0-255 По умолчанию: 2
Описание: указывает количество ожидаемых ACK до того, как таймер отложенного ACK будет проигнорирован. Microsoft не рекомендует изменять значение по умолчанию без тщательного изучения окружения.

Если вы установите значение 1, каждый пакет будет подтвержден немедленно, потому что есть только один ожидающий TCP ACK, поскольку сегмент только что получен. Значение 0 (ноль) недействительно и рассматривается как значение по умолчанию, 2. Номер ACK равен 0, только когда сегмент не получен и хост не собирается подтверждать данные.

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