Как выяснить, почему UDP принимает пакеты только с относительно медленной скоростью?

Я использую Interix в Windows XP для переноса моего приложения на C ++ Linux с большей готовностью для переноса на Windows XP. Мое приложение отправляет и получает пакеты через сокет от соседней машины под управлением Linux. При отправке я получаю только пропускную способность около 180 КБ / с, а при получении — около 525 КБ / с. Тот же код, работающий в Linux, становится ближе к 2500 КБ / с.

Когда я пытаюсь отправить со скоростью, превышающей 180 КБ / с, пакеты отбрасываются, чтобы снизить скорость примерно до этого уровня.

Я чувствую, что смогу получить лучшую пропускную способность при отправке, чем 180 КБ / с, но не уверен, как определить причину отброшенных пакетов.

Как я могу исследовать эту медлительность в надежде улучшить пропускную способность?

—Еще немного истории—

Чтобы достичь вышеуказанных значений, я уже немного улучшил пропускную способность, выполнив следующее (это не имело никакого значения в Linux, но помогло повысить пропускную способность в Interix):

  • Я изменил SO_RCVBUF и SO_SNDBUF с 256 КБ до 25 МБ, это улучшило пропускную способность примерно на 20%
  • Я запустил оптимизированный вместо отладки, это улучшило пропускную способность около 15%
  • Я отключил все сообщения журнала, поступающие на стандартный вывод, и файл журнала, это удвоило пропускную способность.

Поэтому может показаться, что CPU является ограничивающим фактором для Interix, но не для Linux. Кроме того, я работаю на виртуальной машине, размещенной в гипервизоре. Windows XP предоставляется 2 ядра и 2 ГБ памяти.

Я заметил, что профилировщик показывает процессор на двух ядрах, который никогда не превышает 50% загрузки в среднем. Это происходит даже тогда, когда у меня запущено два экземпляра приложения, но оно остается на 50% на обоих ядрах. Возможно, мое приложение, которое является многопоточным, с выделенным потоком для чтения из сокета UDP и выделенным потоком для записи в сокет UDP (только один активен в любой момент времени) не спланировано должным образом в Interix, и поэтому мои пакеты капельный?

3

Решение

Отвечая на ваш вопрос, я делаю следующие предположения на основе вашего описания проблемы:

(1) Вы используете точный та же программа в Linux при достижении пропускной способности 2500 КБ / с, кроме библиотеки сокетов, которая, конечно, будет отличаться в Windows и Linux. Если это предположение верно, нам, вероятно, не нужно беспокоиться о других частях вашего кода, влияющих на пропускную способность.

(2) При использовании Linux для достижения пропускной способности 2500 КБ / с узел находится в точный то же место в сети. Если это предположение верно, нам не нужно беспокоиться о проблемах сети, влияющих на вашу пропускную способность.

Учитывая эти два предположения, я бы сказал, что у вас, вероятно, есть проблема в настройках сокетов на стороне Windows. Я бы посоветовал сначала проверить размер буфера отправки. Размер буфера отправки по умолчанию составляет 8192 байта. Если вы увеличите это, вы увидите увеличение пропускной способности. Используйте setsockopt (), чтобы изменить это. Вот руководство по использованию: http://msdn.microsoft.com/en-us/library/windows/desktop/ms740476(v=vs.85).aspx

РЕДАКТИРОВАТЬ: Похоже, я неправильно прочитал ваш пост в первый раз слишком быстро. Я только что заметил, что вы используете Interix, что означает, что вы, вероятно, не используете другую библиотеку сокетов. Тем не менее, я предлагаю сначала проверить размер буфера отправки.

1

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

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

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