Блокировка сокета send () стоимость звонка - PullRequest
0 голосов
/ 13 октября 2018

Добрый день!Кажется, что вызов функции send () для блокировки сокета должен только скопировать буфер приложения в сетевой буфер драйвера ядра.Я думал, что это должно быть очень быстро, если буфер драйвера пуст.Это должно стоить только одного системного вызова (изменение контекста).

В моей системе простой системный вызов стоит около 2500 тактовых импульсов tsc ~ 0,5-1,0 мкс.

Но мои измерения противоречат приведенным выше выводам.

Вот пример кода.

uint32_t garb;
uint64_t t0 = __rdtscp(&garb); 

iResult = send(ConnectSocket, sendbuf, (int)strlen(sendbuf), 0);

uint64_t t1 = __rdtscp(&garb);

std::cout << "CORE SENT (" << (t1 - t0)/1000  << "k ticks)\n" << std::flush;

Я пробовал такой код в системе Windows 10 с компилятором VS2015 и компилятором gcc MSYS2 (MingW) с данными небольшого размера для отправки (около14 байт например).Во всех случаях такой код стоит (t1-t0) около 100–350 тыс. Тиков, в среднем около 250 тыс. Тиков.То есть это стоит около 25-80 мкс в среднем 60 мкс.Это гораздо больше, чем простой системный вызов + копирование памяти.Время вызова при отправке никогда не превышает 100 тыс. Тиков, и это не выглядит как отсутствие кеша.

Это нормальное поведение или нет?Можете ли вы объяснить мне это?Может быть, функция отправки занимает еще несколько накладных расходов.Почему время отправки может быть больше, чем простой системный вызов + копирование памяти.Это проблема моей системы?Это та же стоимость в системе Linux?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...