boost asio :: async_write () занимает слишком много времени

Возможный дубликат:
boost :: async_write занимает слишком много времени

В моем серверном приложении я запускаю службу asio в одном из них, чтобы обработать около 100 соединений. Я обнаружил, что async_write () иногда занимает слишком много времени, около 15 мс. (Пакет очень маленький)

У меня вопрос, почему async_write () занимает так много времени? Я думаю, что async_write () должен вернуться немедленно. Так медленно, трудно отправить много данных.
Я имею в виду, что функция не вернется сразу. Я не сказал, что отправка не завершена немедленно. 15 мс слишком долго для синхронной функции. И приложение действительно заблокировано. (все равно GetTickCount)

Тестирование кода, как это:

uint64_t TStart = 0, TEnd = 0;
TStart = GetTickCount();

async_write(*this->m_Socket,
boost::asio::buffer(pSendData->m_buf.GetBuffer(), pSendData->m_buf.GetSize()),
boost::bind(&SttSocketConnection::OnSended, this,
pSendData, placeholders::error, placeholders::bytes_transferred));

TEnd = GetTickCount();
if (TEnd - TStart > 1) {
__asm int 3;
TStart = TEnd;
}

-1

Решение

Звучит так, как будто вы где-то переключаете контекст. 15 мс — квант планирования на многопроцессорной машине с Windows.

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

Если у вас есть проблема при каждом вызове, вы должны выполнить системные вызовы и выяснить, какой из них вызывает переключение контекста. Я видел подобные проблемы при использовании портов завершения ввода-вывода, последовательных портов и небольших тайм-аутов, когда некоторые системные вызовы всегда заканчиваются с задержкой 15 мс. Чтобы исправить это, мне пришлось реструктурировать код так, чтобы выполнение асинхронных операций не требовало таймера.

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]