Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: Размер буфера при приеме данных через сокет  (Прочитано 2459 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн IVT

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Добрый день. В данный момент занимаюсь приемом/передачей данных по LAN. Имеются 2 соединенных с помощью кабеля между собой компьютера. Для передачи данных через сокеты использую набор юнитов Synapse, программирую в Лазарусе. Фактически использую ф-ции RecvBufferEx на приемной стороне и Sendbuffer на передающей. Столкнулся со следующей проблемой : мне необходимо передавать большие объемы информации раз в секунду. Основной параметр у меня - это длина массива данных,при передаче массива длиной 3,4,5 млн байт - такая система работает нормально, приходят все байты, один компьютер может часами передавать какую-нить последовательность, а второй принимать. Но как только в параметр ф-ции передается значение 8 или 10 млн байт - передача проходит нес-ко раз (иногда 10 раз, иногда 100) - после чего ПРИЕМНЫЙ компьютер попросту зависает. Причем зависает весь Линукс, без какой-либо возможности что-либо сделать без RESETа ПК. При этом до зависания принимаются все 8(10) млн байт из единичной посылки.
В связи с этим вопрос - в Линуксе каким-либо образом задается текущий максимальный объем приходящего буфера? Гугл отправляет к файлу /etc/sysctl.conf  - пробовал задавать значение там в районе 32 МБ - картина не изменилась.

http://synapse.ararat.cz/doc/help/synaser.TBlockSerial.html#RecvBufferEx  Cобссно вот ф-ция, с помощью которой идет прием данных - параметр Length - туда и ставлю значение 2,4,5 млн(всё работает), 8 (10) млн - не работает.

P.S. Надеюсь на помощь,Линуксом занимаюсь не так давно

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Размер буфера при приеме данных через сокет
« Ответ #1 : 21 Декабря 2012, 08:25:17 »
Ну 8Мегабайт/секунду это физический предел 100Мбит/с соединения. Ничего удивительного что упираясь в него ты начинаешь ловить глюки.
Принимающий компьютер скорее всего зависает из-за того что твое приложение выжирает всё ОЗУ и система уходит в дикий своппинг. По симптомам оно. Ограничь приложению максимальный объем ОЗУ в который оно должно укладываться, если что будет падение приложения а не всей системы.

Ну и не мешало бы тебе вообще поплотнее познакомиться с тем что стоит за используемыми тобою компонентами прежде чем ломать стек протоколов у операционной системы.

Читай книжку У. Стивенс "UNIX: Разработка сетевых приложений"

Оффлайн IVT

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: Размер буфера при приеме данных через сокет
« Ответ #2 : 21 Декабря 2012, 12:32:23 »
Да, но скорость соединения не 100Мбит/с, а 1Гбит/с, в том-то и дело, что должно успевать и успевает передавать те же 10 млн, но до опр. момента
Вот все операции, к-ые проводятся с моим массивом:
Объявление:
bufferTCP : array of byte;
Перед началом приема :
Setlength(BufferTCP,2*numbytes);  // где numbytes - задаваемая длина (8, 10 млн) ,увеличил в 2 раза после первых неудачных попыток, по логике вроде не нужно, но попробовал выделять в 2 раза больше.

во время приема :

ret:=RecvBufferEx(@BufferTCP[0],numbytes,3000);

Больше ничего с массивом не делаю, только пытаюсь принимать пока его.
Повторюсь, с размером передаваемого/принимаемого буферов в 3 млн - прием может работать хоть час времени (дольше не пробовал), а 8 млн - от силы минуту и виснет, т.е. как мне кажется если бы накапливалась какая-то ошибка или занятость памяти постоянно,то при 3 млн уже б давно вылетело. Поправьте, если ошибаюсь

p.s. на книжку обращу внимание, спасибо

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Размер буфера при приеме данных через сокет
« Ответ #3 : 24 Декабря 2012, 08:00:30 »
С буферами ОС лучше не играть. Оставь как было. оно уже не плохо настроено. Лезть туда следует лишь с пониманием что и как работает. У тебя такого понимания нет. Поэтому "не ломалось - не чини".
Первое что стоит сделать для передачи таких больших объёмов поднять MTU на интерфейсах (обрати внимание на обоих интерфейсах). 9000 вместо 1500 будет не плохо смотреться. главное чтобы сетевухи и свитч осилили.

Ну книжку впарил, дальше уже сами разбирайтесь со своим паскалем :) Тут любителей хоть отбавляй.
« Последнее редактирование: 24 Декабря 2012, 08:02:54 от Yurror »

 

Страница сгенерирована за 0.033 секунд. Запросов: 25.