LINUX.ORG.RU

Система задерживает данные приложению


0

0

Серверное приложение через poll ждет события, что пришли данные на неблокирующий(ие) сокет(ы), далее читает их и обрабатывает. Алгоритм Нейгла отключен. Клиент передает большой файл (1.5M) пакетами по 60k.

Проблема следующая: после приема одного или нескольких пакетов, poll перестает сигнализировать, что пришли новые данные, система сохраняет их в своих буферах и сигнализирует только когда клиент передаст все данные и передает их приложению. Вся эта буферизация жрет кучу ресурсов и сильно снижает производительность приложения.

Пробовал тупое решение: Клиент после отправки каждого пакета делал задержку 200-300 ms, это помогает, только величину задержки надо менять для соединений на разных скоростях, да и неправильно это...

Вопрос: как заставить систему не буферизовать данные, а отдавать их по мере получения? И в чем собственно проблема?

anonymous

Я не уверен но попробуй вкИ еще откуда ты уверен, что данные действительно пришли? Попробуй сделать мини версию с одним сокетом и без Poll на одной из сторон, может это проблема с серверной (клиентской) стороной. Ответь, потом будем дальше думать. А нейгла обратно включи, тебя он трогать не должен. Он для реализации ТСП нужен.

OxiD ★★★★
()
Ответ на: комментарий от OxiD

То что данные пришли сомнений нет, потому как с клиента они ушли. Когда ставишь на клиенте задержки между отправкой соседних пакетов, то сервер весь этот поток принимает кусками, а если задержек нет - то почти целиком. В принципе, это правильно - TCP протокол потоковый, приложению он может отдавать данные какими хочешь кусками, лишь бы в правильной последовательности.

Думаю, правильней подтверждать каждый мой пакет (60k), а клиенту отправлять следующий, после потверждения предыдущего. Однако, я хотел производительность повысить, но тут еще другие приколы вылазят, так что буду делать как надо.

Но все равно спасибо за совет.

anonymous
()

попробуй уменьшить буфер сокета на приемном конце через setsockopt. не уверен, но может помочь. вообще, мне кажется, это происходит из-за того, что по мере успешной передачи данных увеличивается окно ТСР и пакеты с флагом ПУШ приходят все реже. после того, как клиент делает задержку 200-300 ms, модуль ТСР решает, что это переполнение канала, уменьшает окно и ПУШы начинают приходить чаще.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.