Много клиентов и большой трафик
От: yslag Украина  
Дата: 11.02.04 09:41
Оценка:
Ситуация:
В сети выделен специальный компьютер, задача которого принимать 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) — не помогло.


Ищутся идеи для более оптимальной реализации.
Спасибо.

ahyba (at) ukr (dot) net
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.