2015-05-18 2 views
1

У меня возникают проблемы с производительностью с использованием TCP Sockets в .NET. Мое приложение отправляет файлы исключительно в локальной сети. Если я запускаю свой код на localhost, производительность отличная (полная скорость - около 250 Мбайт/сек на SSD). Но когда я пытаюсь отправить большие данные в свою локальную гигабитную сеть между разными устройствами, скорость составляет всего около 2-4 Мбайт/с.Медленная производительность сокетов в .NET - все советы?

Я попытался оптимизировать размер буфера (также установите Receive- и Sendbuffersize с обеих сторон), но это не помогло. Вот важная часть кода:

Принимающий:

'f contains the file path 
'client = listener.AcceptTCPClient... 
client.ReceiveBufferSize = RECSENDBUFFSIZE 
client.SendBufferSize = RECSENDBUFFSIZE 
Dim stream As IO.Stream = client.GetStream() 

Dim buffer(BLOCKSIZE - 1) As Byte 
Dim fstream As New IO.FileStream(f, FileMode.Open) 
Dim flen As ULong = fstream.Length 
While fstream.Position < fstream.Length 
    Dim count As Integer = fstream.Read(buffer, 0, BLOCKSIZE) 
    stream.Write(buffer, 0, count) 
End While 
fstream.Close() 

Отправка:

'f contains the file path 
client.Connect(_address, PORT) 
stream = client.GetStream 
client.ReceiveBufferSize = RECSENDBUFFSIZE 
client.SendBufferSize = RECSENDBUFFSIZE 

Dim target As String = IO.Path.Combine(MAINFOLDER, f) 
Dim fstream As New IO.FileStream(target, FileMode.Create) 
Dim buffer(BLOCKSIZE - 1) As Byte 
Dim flen As ULong = filesizes(i) 
Do 
    'I use the min function because there are many files that are transmitted in one connection 
    Dim count As Integer = stream.Read(buffer, 0, Math.Min(flen, BLOCKSIZE)) 
    If count = 0 Then 'some error handling... 
    fstream.Write(buffer, 0, count) 
    flen -= count 
    If flen = 0 Then Exit Do 
Loop 
fstream.Close() 

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

У вас есть рекомендации по производительности? Спасибо.

+0

Какова ценность 'BLOCKSIZE'? – jch

+0

Благодарим вас за ответ. Для целей тестирования я выбрал значения между 1024 и 131072. – Vincent

+0

Скопируйте большой файл между двумя хостами, чтобы подтвердить, что вы получаете ожидаемую пропускную способность. Если он медленный, то это что-то в сети (которое начинается с сетевых драйверов в каждой системе), не обязательно в вашем коде (ваш код может также иметь проблемы, но если есть сетевая проблема, вам нужно исправить это посмотрите, как работает ваш код). –

ответ

0

Вы сравниваете неправильные вещи. Вы не должны сравнивать скорость локального хоста с реальным доступом к сети. Когда вы используете TCP для localhost, единственными слоями, которые действительно используются, являются TCP и IP. IP обнаруживает, что все локально и сразу возвращается к TCP, без какого-либо контроля потока. Когда задействованы фактические сетевые уровни, необходимо связать управление потоком в одном из других сетевых уровней или с драйвером.

То, что вы действительно должны сравнить, это скорость вашей локальной сети. Это немного сложно, но это может помочь: http://www.makeuseof.com/tag/test-home-network-speed-decipher-results/

Скорость сети обычно отображается в мегапикселях в мегабит в секунду. На приведенном выше сайте есть диалоговое окно для локальной сети, которое дает 17 Мбит/с, у вас было 2-4 * 8 = 16-32 Мбит/с без учета служебных расходов TCP.

Но вы должны запустить тест на производительность локальной сети и сравнить с ним, а не с localhost.

+0

Благодарим вас за ответ. Я попытаюсь выполнить некоторые тесты, используя инструмент, представленный в статье в следующие дни. Возможно, я обвинил неправильные вещи. – Vincent

Смежные вопросы