Ситуация:
В сети выделен специальный компьютер, задача которого принимать UDP пакеты с
одного канала и рассылать их многим клиентам.
Число клиентов: 500
Данные приходят со скоростью 500 000 bit/sec
Сеть: 1GB
Машина: P4, 1.8 ГГц, Win2k
Теоретический суммарный исходящий трафик: 500 * 500 000 = 250 000 000 < 1GB
Реальное количество компов клиентов ~10, просто на каждом из них настроено
50 IP-адресов на один сетевой интерфейс.
Реализация:
Сейчас программа состоит из двух потоков и буфера.
Один читает данные (recvfrom) с принимающего сокета в буфер.
Другой берет пакеты из буфера по одному и рассылает (sendto) их всем
клиентам используя один сокет в цикле.
Проблемы:
Исходящий трафик не превышает 180 000 000 bit/sec (Windows Performance
analyzer). Причем сторонних пакетов практически не встречается (Ethereal)
Очевидно, часть отправленных пакетов теряется.
Использование процессора — 100%
Анализ показал, что основную часть времени процессор проводит в системных
библиотеках (ntdll.dll, ws2_32.dll и т.д.)
Возможно, время тратится на переходы в режим ядра и обратно при многократных
вызовах sendto()
Пробовал убрать копирование на отсылающем сокете через
setsockopt(SO_SND_BUF, 0) — не помогло.
Ищутся идеи для более оптимальной реализации.
Спасибо.