IRCaBot 2.1.0
GPLv3 © acetone, 2021-2022
#dev
/2025/04/27
~AreEnn
~AreEnn_
~R4SAS
~acetone
~orignal
~villain
@onon
&N00B
+Xeha
GFW
Most2
Nikat
Opax
Vort
`
anon
b3t4f4c3
duck
hidden_gamer
iiii
karamba_i2p
meowking
not_bob_afk
osoznayka
poriori
profetikla
qend
r3medi7z
rc13
segfault
slfd
soos
spider
teeth
tensor
un
whothefuckami
woodwose
onon I2P_TUNNEL_CONNECTION_BUFFER_SIZE = 16384
onon ^тут проблема
orignal это псих такое поставид
orignal скажи в чем проблема
onon Ща погоди перепроверю
orignal я не вижу особой проблемы кроме паяти
onon Короче смысл такой что у меня с ростом размера окна не увеличивается скорость
orignal и ты считаешь что виноват буфер
onon Ну он за 1 раз не может отправить больше чем есть в этом буфере
onon 16кбайт
onon А у меня в логах видно что этот буфер при максимальной скорости или постоянно пустой или полный
onon Т.е. он отправил 1 раз а в след. раз отправлять нечего т.к. буфер пустой
onon Вот я ничего другого не менял, буфер этот в 4 раза поднял, скорость стала в 2 раза выше
onon Максимальная скорость имею в виду
orignal выражайся конкретнее
onon Ладно, сформулирую, напишу.
onon Короче у тебя так сделано, что этот буфер запрашивает новые данные только когда пустой
onon Отсюда все проблемы
onon Я сделал его в 512кб и вижу, что он постепенно уменьшается до нуля по мере отправки, а потом снова набирает 512кб
onon Нужно бы как-то сделать чтобы буфер пополнялся после отправки пачки пакетов
orignal запрашивает откуда? с i2p или с клира?
onon С клира
orignal а ну это кривизна рук ясен пень
orignal я починю
orignal вечером
onon Тот, который m_SendBuffer
onon В стримах
orignal там же не так делается
onon Я по логам вижу что так
orignal там ждем коллбэка от AsycSync и читает клир
orignal AsyncWrite
orignal насколько я помню счас я читаю порцию отсылаю потом читаю следующую когда отправилась
onon Можешь проверить, сделать этот буфер пару мегабайт и в вебконсоли смотреть
onon По мере отправки он будет уменьшаться а потом резко наполняться
onon Там с этими буферами у тебя сложный запутанный код, я не могу пока разобраться
onon Кто кого вызывает и когда
orignal я знаю как он работает
orignal ты объясни что требуется
onon Чтобы после отправки пачки пакетов в SendBuffer() он подгружал новую порцию данных из клира в этот буфер
onon Чтобы он не опустошался
onon До нуля
onon SendBuffer()
onon sendSomePackets;
onon refillBuffer;
orignal даже если буфер не полностью отослан?
onon Да
orignal ну раньше так было но был совсем пиздец
onon А в чем проблема?
orignal просто оно набивалось в стрим и все
onon Проц грузит?
orignal а клиент думал что отправляется быстро
onon Ммм...
orignal тут короче думать надо
onon А что значит набивалось в стрим
onon У тебя же буфер не бесконечный
onon Он должен заполнить буфер и встать
onon И ждать
onon Буфер понемногу опустошается - он доливает.
onon Это в какой версии так было. Может я поищу, потестирую
orignal вообще то бесконечный у стрима
orignal ну посмотри историю I2PTunnel.cpp
orignal в этом суть что теперь мы ждем отправки пакета в стрим а не просто запихивания в буфер
onon Как я вижу делается сейчас: ты из сокета клира берёшь кусок данных 16кб, помещаешь его в буфер стрима, стрим отправляет этот буфер, ты берёшь новый кусок данных 16кб из клира...
onon Так?
orignal не так
orignal не 16K а вплоть до 16K
orignal там может и один байт быть например
onon Это понятно
onon Из-за такой работы у вас и не работает интерактив
onon Потому что CC на этом сокете клира не может нормально работать
onon Поэтому ваш iPerf не работает
orignal ну так а что ты то предлагаешь?
onon А по поводу размера буфера в 16кбайт. У нас сделана отправка 1 раз в ~11мс. Т.е. 1000/11*16384=1489454байт/с
orignal мы прочитали с клира в буфер запихали его в стрим
orignal дальше что?
orignal чего мы ждем
onon Получается лимит в ~1,5 мбайта/с
orignal там это лимит стримов
onon Потому что за раз SendBuffer() отправляет только один буфер
orignal ну так я жду твоих предложений
onon А я думаю нужно делать так: отправил ты из 16кб например 6кб - запрашиваем эти 6кб из сокета и вставляем в конец бкфера
onon И буфер снова полный
orignal ладно подумаю
orignal то есть ты хочешь коллбэ
onon Т.е. брать из сокета меньшими порциями и чаще
onon Да
orignal когда сколько то отправилось
onon Да
orignal а не все
orignal сделаю
Most2 12.<taureg> после последнего обновления i2pd-tools не компилится
Most2 12.<taureg> https://xmpp.trus.i2p:5343/upload/b84216eb030e2571c35fc6b97615ae02bf6c762e/hTePIegZIBFh8KadFMQoDmWly3NUm1ZvUWVJBMwC/431fd009-39a9-471a-9c66-510e85a93415.png
Most2 12.<taureg> мало ему
Most2 12.<taureg> шланг тоже не доволен
Most2 12.<taureg> https://xmpp.trus.i2p:5343/upload/b84216eb030e2571c35fc6b97615ae02bf6c762e/tTPbNx2yJ1MUQfdr0wDqAwuFJzIwRfWdfyqHLGpd/e1ae0c60-b409-44e1-95a1-028f3b623425.png
weko onon, orignal я про эту штуку вроде уже давно говорил. видимо сказал хреново
weko что стрим до роутера плохо работает с нашими стримами и может слать слишком дохуя
weko он и шлёт
weko когда ещё со стримами возился
Vort weko: 16к - это как бы не особо дохуя. наверно ещё где-то есть подобное место
weko Вполне достаточно
onon Нет, там в буфер сокета льёт
onon Пока не заполнит
Vort onon: даже если юзерская программа (i2pd) против, всё равно будет лить что ли?
Vort плохо этот механизм помню
onon Да
Vort понятно
onon Ты вычитываешь из буфера - место освобождается
onon Он шлёт акк - получает новые данные
onon Если не хочешь такого поведения - делай recieve buffer на этом сокете маленьким
Vort может так и надо сделать? я, правда, сомневаюсь, что ОС обязана сделать именно такой буфер как заказано
Vort если у стрима 16к, то нафига сокету больше?
onon Если у тебя сокет локальный - то больше и не нужно
Vort есть, правда, юзеры, у которых локальный сокет нифига не локальный. но, скорее всего, этот сценарий можно как-то отловить
onon А если удалённый - то малый буфер на приёме ограничит скорость
onon Из-за flow control
Vort смотреть куда bind сделан. вроде
Vort я думаю у 99% юзеров сокет таки локальный. или нет?
onon Я тоже так думаю
weko ну у меня i2pd на сервере, и я бывает к нему подключаюсь из жопы
weko ну через впн но не суть
weko точнее важно, потому что это qg
weko wg'
Vort а там не будет ещё одного слоя буферизации?
onon Я вот тоже думаю, почему нельзя чтобы стрим сразу читал данные из буфера сокета
weko wg через udp
Vort onon: думаю это архитектурный вопрос. не будет ли говнокода если так завернуть
onon Просто это всё дополнительные задержки
orignal можно
orignal просто я так не сделал изначально
orignal потому что стримы и тоннели деались в разное время
orignal так что решили делаем?
orignal как только часть буфера запихнули в стрим вызываем коллбэк с размером?
onon А сложно это сделать?
orignal и читаем сокет на такой же объем
orignal не сдожно
onon Тогда делаем
orignal просто я пытаюсь понять концептуально
orignal что надо
onon Ну вот то что ты описал
onon И размер этого буфера увеличить
onon Чтоб хотяб мегабайт 5 было
onon в секунду имею в виду
orignal на сколько увеличить?
orignal weko считает что даже 16K много
onon Ну сейчас около мегабайта реальной скорости
weko тут проблема что пинг
weko растёт
weko когда упор в скорость
onon Ну вот, если важны задержки - то много, если важна скорость - то мало
weko чот не правильно получается
weko надо сделать чтобы были и то и то нормально
orignal я в упор не понимаю чего мы выигрываем этим
orignal что мы забираем из сокета по частям а не пачкой
orignal у меня есть другое предложение
onon Что сокет отправляет подтверждения когда буфер освобождается
orignal разбивать буфер на пакеты в 1K
onon И получает новую порцию данных
orignal неправда
orignal он отправляет потдверждение на кусок
orignal котоырй впихнули
orignal а если мы будем пихать по 1K?
onon А почему именно по 1?
orignal ну наример
orignal можно по 4K
onon Ничего не понимаю
orignal пришел буфер 16K
orignal мы пихаем в стрим 4 пакета по 4K
orignal после подверждения каждого читаем новый
onon Это чтобы не читать по байтам?
onon Типа нагрузка меньше будет?
orignal чтобы аллоцировать фиксированные куски
orignal и да ты будешь пихать по 100 байт например что хорошего
onon Важно что: плохо когда у нас сейчас в буфере осталось 500байт а мы должны в этот такт оправить пять пакетов например
onon А он отправит один получается
orignal то есть в буфере осталось мало а в сокете сидит много и ждет
onon Да
orignal я счас подумаю