OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 29 Март, 2024 16:18

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 28 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Особенности работы TCP-сокетов
СообщениеДобавлено: Четверг, 03 Декабрь, 2009 12:45 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Занялся вот в образовавшийся день оптимизацией :)

Коллеги, кто-нибудь может строго объяснить такие моменты:

1) Когда сервер работает под большой нагрузкой (обслуживается много параллельно открытых сокетов - запросов), то статистически прилично шустрее работает при разбитии на мелкие порции FOR i := 1 TO 4 WriteBytes(..., 256) END по сравнению с WriteBytes(..., 1024).
Алгоритм Нагля при большой нагрузке начинает пулять более мелкими пакетами и оно быстрее уходит?
Тогда: насколько эти параметры будут зависеть от машины (т.е. не окажется ли совсем наоборот на технике другой производительности, в разных ОС)?

2) Тогда уж до кучи вопрос... Была такая история. В ситуации, когда последним sendbytes записывается малый "хвостик" данных (< 40 байт), был сильный протормоз их отправки (фактически, скорость обслуживания падала примерно в 100 раз). Решилось-то просто (не оставлять такие хвостики), но вот внятного объяснения нет. Это проявлялось и в случае ненагруженного сервера.
Потому что если это алгоритм Нагла, то
а) в ненагруженной ситуации порог кэширования для него должен быть порядка сотен байт (т.е. и со 128-байт куском должна быть такая же задержка, а тут только < 40);
б) тормоза-то не должно быть, ибо ответ о доставке должен быстро приходить (клиент интенсивно читает).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Особенности работы TCP-сокетов
СообщениеДобавлено: Четверг, 03 Декабрь, 2009 13:16 

Зарегистрирован: Вторник, 25 Март, 2008 23:04
Сообщения: 81
Откуда: Львів
Ответа о доставки прикладное ПО не получает, стек сразу рапортирует что все ок, ТСР не гарантирует доставку.
Данные попадают в "окно" и там лежать пока стек не соизволит отправить. Команда push не поможет, она другим занята.
Если в момент передачи выдернуть шнур то вы потеряете забуфиризированные данные, даже потеряете если окно выставите в 0, и не узнаете что доставлено а что потеряно, только обратная связь помогает выяснить ситуацию.

Примечание, под стеком я имею ввиду реализацию протокола.

Алгоритм Нагля наоборот, собирает мелкие данные и отправляет их минимальным ТСР пакетом, что бы не слать по одному байту:
Код:
if there is new data to send
  if the window size >= MSS and available data is >= MSS
    send complete MSS segment now
  else
    if there is unconfirmed data still in the pipe
      enqueue data in the buffer until an acknowledge is received
    else
      send data immediately
    end if
  end if
end if


Вот ваш пункт 2 и демонстрирует работу Алгоритма Нагля.

http://www.stuartcheshire.org/papers/NagleDelayedAck/


Под нагрузкой увеличивается число коллизий/задержек и большие пакеты приходится снова отсылать, что в свою очередь увеличивает нагрузку :)
Разбиение на мелкие пакеты позволяет минимизировать повторные отсылки но в свою очередь увеличиваются затраты на опроси. Тут главное найти баланс.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Особенности работы TCP-сокетов
СообщениеДобавлено: Четверг, 03 Декабрь, 2009 14:11 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Спасибо, в общем, понятно!

А под ответом о доставке я имел в виду подтверждение прохождения предыдущих TCP-пакетов, после чего "Нагл" должен посылать новый сразу, забивая на ожидание (по третьей ветке вышеприведённого алгоритма).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Особенности работы TCP-сокетов
СообщениеДобавлено: Четверг, 03 Декабрь, 2009 14:13 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Вообще, опять ощущение чрезмерной умности нижележащих "чёрных ящиков". И проблем, огребаемых от этого (в виде непредсказуемости поведения).

В данном случае, конечно, логика понятна (априори считать программиста идиотом и невзирая ни на что не позволить ему загаживать сеть). Т.е. защита ресурса коллективного пользования от потенциального идиота-вредителя :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Особенности работы TCP-сокетов
СообщениеДобавлено: Четверг, 03 Декабрь, 2009 14:21 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Да, но в итоге не могу найти информацию: какой размер порций (с т.з. вызова send) можно считать малым, а какой - уже нормальным?

Вот реально в вопросе (1) сервер ещё более шустреет, если бить на порции 128; но такой размер уже кажется опасным с т.з. нарывания на того же Нагла.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Особенности работы TCP-сокетов
СообщениеДобавлено: Четверг, 03 Декабрь, 2009 14:40 

Зарегистрирован: Вторник, 25 Март, 2008 23:04
Сообщения: 81
Откуда: Львів
Нагла можно отключить, но надо всегда смотреть на реализацию протокола, можно нарваться на нюансы...

Минимальной/оптимальной порции нет.

Не забывайте о времени "жизни", о автоматическом разбиение в зависимости от канала передачи.

Для определения оптимальных параметров надо привлекать теорию вероятности и анализировать канал в реальном времени...

Ещё, в протоколе TCP есть дефект, он и позволяет злоумышленнику выводить систему из рабочего состояния...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Особенности работы TCP-сокетов
СообщениеДобавлено: Четверг, 03 Декабрь, 2009 14:43 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Илья Ермаков писал(а):
какой размер порций (с т.з. вызова send) можно считать малым, а какой - уже нормальным?
Это зависит не от отправителя (не только от него), а в значительной степени от получателя. Если получатель мерзавец и вычитывает из сокета не всё что в нём есть на данный момент, а мелкими порциями выщипывает, то и отправителю тоже придётся посылать мелкими порциями - больше в буфер получателя не влезет пока тот его не соизволит опустошить. По умолчанию размер сокетного буфера равен 128Кб. В современных виндусах размер сокетного буфера можно выставлять самостоятельно, хоть на 10Мб, в линуксах - нельзя.

Короче, правильный алгоритм работы:

1) для получателя - как можно быстрее ("со скоростью света") вычитывать из сокета все что там есть и складывать уже в свой "безразмерный" буфер для дальнейшей неспешной обработки.

2) для отправителя - засовывать в socket.Send всё что только есть, а она уже сама разберётся что к чему.

3) Если работаете под виндами (линуксы - в пролёте), то выставить размер сокетного буфера побольше (несколько мегабайтов, но это уже от задачи зависит).

Кстати, в Блэкбоксе в CommTCP используются "старые" сокеты, там размер буфера не конфигурируется, надо бы переписать на "новые"...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Особенности работы TCP-сокетов
СообщениеДобавлено: Четверг, 03 Декабрь, 2009 15:14 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Фишка в том, что мы кроссплатформенно - и под Виндами, и под Линухами.
Именно поэтому хочется чего-то средне-хорошего :)

Над CommStreams ещё слои абстракций есть - и хочется маневрировать политикой записи именно на них, считая, что ниже только этот тупой WriteBytes и больше ничего...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Особенности работы TCP-сокетов
СообщениеДобавлено: Четверг, 03 Декабрь, 2009 15:17 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Сергей Губанов писал(а):
1) для получателя - как можно быстрее ("со скоростью света") вычитывать из сокета все что там есть и складывать уже в свой "безразмерный" буфер для дальнейшей неспешной обработки.

2) для отправителя - засовывать в socket.Send всё что только есть, а она уже сама разберётся что к чему.


Про 1) - ясное дело.

А вот про 2) - испытания-то показывают, что лучше не сильно большими кусками. Порциями в 1024 уже замедляет (при сотнях-тысячах запросов в секунду).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Особенности работы TCP-сокетов
СообщениеДобавлено: Четверг, 03 Декабрь, 2009 15:25 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
Илья Ермаков писал(а):
Фишка в том, что мы кроссплатформенно - и под Виндами, и под Линухами.
Именно поэтому хочется чего-то средне-хорошего :)

Над CommStreams ещё слои абстракций есть - и хочется маневрировать политикой записи именно на них, считая, что ниже только этот тупой WriteBytes и больше ничего...

Сокеты - платформозависимая вещь. Запихнуть Send в подсистему Host. Пусть он и разбирается куда какими порциями.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Особенности работы TCP-сокетов
СообщениеДобавлено: Четверг, 03 Декабрь, 2009 15:38 

Зарегистрирован: Вторник, 25 Март, 2008 23:04
Сообщения: 81
Откуда: Львів
В тему, протокол TCP не гарантирует достоверность доставленных данных.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Особенности работы TCP-сокетов
СообщениеДобавлено: Четверг, 03 Декабрь, 2009 15:54 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Илья Ермаков писал(а):
А вот про 2) - испытания-то показывают, что лучше не сильно большими кусками. Порциями в 1024 уже замедляет (при сотнях-тысячах запросов в секунду).

Замедляется Блэкбоксовская реализация? Это не удивительно.

Блэкбоксовская реализация осуществляя чтение опрашивает сокет периодически (вроде один раз в 50 миллисекунд), а не непрерывно. Быстро вычитывать = вычитывать непрерывно. То есть если хотите получить высокую скорость, то первое что надо сделать - выбросить блэкбоксовскую реализацию и написать свою.

Оптимальная по скорости работы реализация такова:

Сокет надо сделать блокирующим.
Надо создать два потока. Один на чтение, другой на запись.

Читающий поток (его приоритет можно поднять до максимального) постоянно спит в функции socket.Receive.
Как только в сокет поступили новые данные этот поток (обладающий высоким приоритетом) тотчас же (в туже самую "наносекунду") будится операционкой, вычитывает данные из сокетного буфера, кладёт их в "безразмерный" приёмный буфер приложения и сразу же возвращается в спячку внутри socket.Receive. Вот это и есть вычитывание "со скоростью света" -- надо чтобы приёмный сокетный буфер всё время был пустым.

Записывающий поток берёт данные из "безразмерного" отправительного буфера приложения и засовывает их в socket.Send большими порциями - сколько есть. Но слишком часто ему это делать не обязательно и даже вредно. Иногда нужно немного поспать. Если мы сказали функции Send послать много, а она послала мало, значит на приёмной стороне в приёмном сокетном буфере закончилось место, следовательно надо дать время принимающей стороне успеть его опустошить - немножко спим прежде чем вызвать socket.Send в следующий раз.


Последний раз редактировалось Сергей Губанов Четверг, 03 Декабрь, 2009 16:06, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Особенности работы TCP-сокетов
СообщениеДобавлено: Четверг, 03 Декабрь, 2009 15:59 

Зарегистрирован: Вторник, 25 Март, 2008 23:04
Сообщения: 81
Откуда: Львів
Когда сеть перегружена эта стратегия как мертвому припарка. Я уже писал почему. Про физику нельзя забывать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Особенности работы TCP-сокетов
СообщениеДобавлено: Четверг, 03 Декабрь, 2009 16:02 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Когда сеть перегружена -- это форсмажор. В этом случае пусть заитересованные лица прокладывают "провода потолще".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Особенности работы TCP-сокетов
СообщениеДобавлено: Четверг, 03 Декабрь, 2009 16:08 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Сергей Губанов писал(а):
Замедляется Блэкбоксовская реализация? Это не удивительно.
Блэкбоксовская реализация осуществляя чтение опрашивает сокет периодически (вроде один раз в 50 миллисекунд), а не непрерывно. Быстро вычитывать = вычитывать непрерывно. То есть если хотите получить высокую скорость, то первое что надо сделать - выбросить блэкбоксовскую реализацию и написать свою.

Оптимальная по скорости работы реализация такова:

Сокет надо сделать блокирующим.


Ну, Сергей, я же не столь наивен, чтобы использовать Action, графический режим и т.п. :) ("один раз в 50 мс").
Диспетчеризация задач совершенно другая. На производительность в целом тоже жаловаться грех - уровень Апача (+/- по ситуации) достигается. Просто можно теперь поискать и более мелкие тормоза, потому что раньше в детали работы сокетов не углублялись.

Касательно блокирующего режима - это как раз анахронизм, ибо это требует многопоточности уровня ОС, а многопоточность уровня ОС - это тормоза по определению :) И проблемы с программированием.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Особенности работы TCP-сокетов
СообщениеДобавлено: Четверг, 03 Декабрь, 2009 16:23 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
> а многопоточность уровня ОС - это тормоза по определению

Во-первых, не по определению... Во-вторых, по сравнению с сокетными тормозами какие-то там тормоза переключения потоков просто стремятся к нулю.

И быстрее опустошать приёмный сокетный буфер чем с блокирующим socket.Receive вы не сделаете. Если всё же сделаете, то сообщите пожалуйста, я буду потрясён.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Особенности работы TCP-сокетов
СообщениеДобавлено: Четверг, 03 Декабрь, 2009 16:29 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Илья Ермаков писал(а):
И проблемы с программированием.
Так те потоки не будут объекты создавать, они просто будут копировать байты из одного буфера в другой. То есть стеки тех потоков сборщиком мусора окучивать не надо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Особенности работы TCP-сокетов
СообщениеДобавлено: Четверг, 03 Декабрь, 2009 16:42 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Да, Сергей, а это мысль. Она у меня крутилась как-то, потом как-то не до этого было...

Однако и на неблокирующих сокетах приличная скорость выжимается.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Особенности работы TCP-сокетов
СообщениеДобавлено: Четверг, 03 Декабрь, 2009 16:49 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Илья Ермаков писал(а):
Порциями в 1024 уже замедляет
Размер Ethernet пакета от 72 до 1526 байт. Если работа замедляется при посылке 1024 байт, то с большой вероятностью дело всё же в принимающей стороне - сделайте так чтобы она принимала быстрее.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Особенности работы TCP-сокетов
СообщениеДобавлено: Четверг, 03 Декабрь, 2009 16:50 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
И меня пока больше заботил режим "отдающего сервера", т.е. много данных отдаётся, а запросы принимаются маленькие (и большое количество). Так что скорость чтения не очень важна, а вот лёгкая диспетчеризация производительности прибавляет.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 28 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB