У меня возникают проблемы с производительностью с использованием 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-потоков, но опасаюсь, что затраты на синхронизацию настолько высоки, что это не изменит ситуацию.
У вас есть рекомендации по производительности? Спасибо.
Какова ценность 'BLOCKSIZE'? – jch
Благодарим вас за ответ. Для целей тестирования я выбрал значения между 1024 и 131072. – Vincent
Скопируйте большой файл между двумя хостами, чтобы подтвердить, что вы получаете ожидаемую пропускную способность. Если он медленный, то это что-то в сети (которое начинается с сетевых драйверов в каждой системе), не обязательно в вашем коде (ваш код может также иметь проблемы, но если есть сетевая проблема, вам нужно исправить это посмотрите, как работает ваш код). –