Редакция 1: очистка очевидного

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

Предупреждение

Этот пример приложения обеспечивает намеренно низкую производительность, чтобы проиллюстрировать возможные улучшения производительности с помощью изменений в коде. Не используйте этот пример кода в приложении; Оно предназначено только для иллюстрации.

 

#include <windows.h>

BYTE Set(row, col, bAlive)
{
    SOCKET s = socket(...);
    BYTE byRet = 0;
    BYTE tmp[3];
    tmp[0] = (BYTE)row;
    tmp[1] = (BYTE)col;
    tmp[2] = (BYTE)bAlive;
    bind( s, ... );
    connect( s, ... );
    send( s, &tmp, 3 );
    recv( s, &byRet, 1 );
    closesocket( s );
    return byRet;
}

Изменения в этой версии

Эта версия отражает следующие изменения:

  • Удален SNDBUF=0. Удалены задержки в 200 миллисекунд из-за небуферированных отправлений и отложенных подтверждений.
  • Удалено поведение отправки и отправки и получения. Это изменение устраняет задержки в 200 миллисекунд из-за нейгла и отложенных взаимодействий ACK.
  • Удалено допущение с маленьким эндианом. Теперь байты находятся в порядке.

Оставшиеся проблемы

В этой версии сохраняются следующие проблемы:

  • Приложение по-прежнему работает с интенсивным подключением. Так как задержки в 600 миллисекунд удалены, приложение теперь достигает постоянной скорости 12 подключений в секунду. Многие одновременные подключения теперь становятся проблемой.
  • Приложение по-прежнему толстый; неизменимые ячейки по-прежнему распространяются на сервер.
  • Приложение по-прежнему демонстрирует плохую потоковую передачу; 3-байтовые отправки по-прежнему являются небольшими.
  • Теперь приложение отправляет 2 байта/RTT, что равно 4 КБ/с на напрямую подключенном Ethernet. Это не слишком быстро, но TIME-WAIT, скорее всего, вызовет проблемы в первую очередь.
  • Накладные расходы снизились до 99,3%, что по-прежнему не является хорошим процентом накладных расходов.

Ключевые метрики производительности

Следующие ключевые метрики производительности выражаются в времени кругового пути (RTT), Goodput и издержках протокола. Описание этих терминов см. в разделе Сетевая терминология .

Эта версия отражает следующие метрики производительности:

  • Время ячейки — 2×RTT
  • Goodput — 2 байта/RTT
  • Издержки протокола — 99,3 %

Улучшение медленного приложения

Терминология сети

Базовая версия: очень низкопроизводительное приложение

Редакция 2. Перепроектирование для уменьшения количества подключений

Редакция 3. Отправка сжатого блока

Будущие улучшения