IRCaBot 2.1.0
GPLv3 © acetone, 2021-2022
#dev
/2024/05/16
~AreEnn
~R4SAS
~acetone
~orignal
~villain
&N00B
+relaybot
Guest7184
Most2
Nausicaa
Vort
Xeha
anon2
b3t4f4c3
guest
karamba_i2p
nemiga
not_bob_afk
plap
poriori_
profetikla
soos
un
weko
whothefuckami_
НАТАШКА
onon Стоит отметить, что с последним коммитом я не вижу ни одного дропа на сокете:
onon skmem:(r0,rb2621440,t0,tb2621440,f4096,w0,o0,bl0,d0)
onon Аптайм примерно 10часов
onon Попробую пообновлять другие роутеры тоже.
orignal может все так не с последним а с предпоследним?
orignal потому что последий был явно про netdb
onon С тем, где ты с очередями мутил
onon на SSU2
onon 1246988 this
orignal ну да но он не последний
orignal потом я взялся мутить другое ))
onon Ты мути отправку небольшими пачками лучше, это важно.
onon Но правда, там работы много.
orignal ну я вообще то стримы собраюсь сделать как ты предлагаешь
onon Тогда не отвлекайся
onon1 Ещё нужно добавить проверку лизсета, что бы он был опубликован не более 10 мин назад. Я нашёл у себя лизсет с очень старой датой публикации.
orignal а дата протухания какая?
orignal в смысле время
onon1 Истечение лизов нормальное
onon1 По дате последнего лиза
orignal нет у него есть время
orignal именно протухания
onon1 А нет
onon1 На минуту больше
onon1 Чем у лиза
onon1 Самого старшего
orignal ну это нормально
orignal скорее всего джвисты так делают
orignal и мне надо
onon1 Там дата публикации 31/12/1969
orignal иначе говоря там время 0 стоит
onon1 Он такой единственный
onon1 Остальные нормальные
orignal да надо сделать проверку
onon1 Модифицированный клиент похоже
onon1 Ещё там несколько инвалидов есть
orignal да проверку добавлю это правильно
onon1 Хз, что за такие
onon1 !!! Invalid !!!
onon1 как-то так
orignal да это типа 5
orignal просто псих хуйню сделал там
orignal еще надо проверку сделать что время пубдикации не из будущего
onon1 Да
orignal для роутеров все это сделано а для лизсетов нет
` <onon1> Там дата публикации 31/12/1969
` Как это так, до нашей эры?
` Первым делом root сотворил 1970-01-01 ☝🏻
` Blinded message
Vort "<onon1> Потому что сейчас он слишком долго ждёт" если я правильно помню, скорость создания туннелей от таймаута не зависит
Vort увеличить её можно, но не нужно - сеть и так сейчас значительную часть ресурсов тратит на бестолковые построения туннелей (после которых туннель через несколько минут фейлится)
Vort тут не скорость менять надо, а надёжность туннелей повышать. только вот как именно это делать - пока что не ясно
Vort (хотя один из методов понятен - надо пиртест чинить, это ситуацию явно улучшит, но не сильно - есть ещё проблемы)
weko Vort: да нихрена не тратит
weko Сеть в обычном состоянии перегружена по твоему?
weko Ну точнее тратит это да, но вот от скорости это не отжимает
orignal кстати лизсеты на предмет из будущего я проверяю
onon Лось, тогда придётся тебе делать таймауты строительства туннелей. Ворт, похоже, не понимает как это работает.
orignal а я что не делаю что ли?
onon1 Ну ты пока стримы делаешь вроде.
onon1 Вот тебе ещё в туду лист
WayBest_ <~orignal> еще надо проверку сделать что время пубдикации не из будущего
WayBest_ а как мы гарантируем что время на машине ок?
orignal ну там определенный дисапазон допустим
orignal 2 минуты допустимо
weko Опять пошло говно по трубам?
Vort "<weko> Опять пошло говно по трубам?" - 599 штук "2.5.1" у меня в netdb. было раньше около 150
weko Значит пошло
Vort "<weko> Сеть в обычном состоянии перегружена по твоему?" - в состоянии низкого рейта - да. < ~15% TCSR - и узел хреначит построения нон-стоп
weko Ну у него ограничено сколько он за раз попыток делает
weko Но кажется я понял про что ты
weko Если убрать этот лимит будет перегрузка
Vort "<weko> Ну точнее тратит это да, но вот от скорости это не отжимает" откуда тогда фоновый трафик ~полмега/сек? пинги + построения мне кажется
orignal понятно что они будут засирать
weko Vort: ну ещё флуд
weko Vort: ну сравнительно мало
Vort "<onon> ... Ворт, похоже, не понимает как это работает." если моё описание неверно, то предлагаю рассказать, где именно. пока что мне кажется, что это твоё предложение исходит из непонимания
weko Если убрать лимит будет жопа
Vort "<weko> Если убрать этот лимит будет перегрузка" - обратная связь будет. больше построений -> больше фейлов -> больше построений. сейчас есть "failsafe". или как оно там зовётся
weko Vort: так я об этом же
weko Только всё ещё хуже
weko Ведь тогда будет больше узлов которые упёрлись в лимит
Vort угу
weko А значит что ещё больше фейлоа
Vort отсутствие туннелей на дестинейшене - это по сути признак срабатывания защитного механизма
weko Думаю надо для начала сделать чтобы был TCSR 100% хотя бы в тестнете
Vort weko: не будет :( но 99% можно
weko Vort: да просто строиться не успевают
Vort я же рассказывал про хитрую проблему в i2p
weko Vort: ну если дропов не будет
onon Vort, объясняю. Если у тебя в нетдб, напрмер много фейковых роутеров и ты пытаешься строить через них туннели. Они тебе не ответят, сколько бы ты ни ждал, понимаешь?
weko То можно и 100%
weko Vort: какую?
Vort weko: значит не читал мой рассказ
weko Vort: а в чём суть?
Vort потери пакетов в i2p "by design" - из-за коллизий идентификаторов
Vort это мелочи, но эта хрень 100% достичь не даст
Vort "парадокс дней рождения" даёт о себе знать
weko id туннелей имеешь ввиду?
Vort да всего почти. i2np сообщений, допустим
weko Ну тоже да
Vort пожалели 64 бита на идентификаторы, а теперь исправить это нереально
weko В любом случае на тестнете ssu2 only я получаю ~70%
weko Но у меня там 8 хопов стоят туннели
Vort 70% - это стабильное значение? просто при старте какие-то узлы же будут оффлайн
weko Vort: ну пару секунд
weko 10 секунд
weko Запускается 200 роутеров
Vort так эти несколько секунд вполне рейт немного просадят
weko Помнишь я кстати говорил про штормы, которые сами собой образуются?
weko Именно в тестенете
Vort короч если стабильные 70% - значит где-то жирный баг сидит
weko Vort: ну можно подождать
weko Вот штормы точно есть. Два раза было
Vort weko: а ты CPU мониторил?
weko Vort: да
weko Там дохуя
weko Какой-то тред упирался
weko Какой уже не помню
Vort просто при перегрузке i2pd вообще себя неадекватно ведёт, этот вариант пока что даже рассматривать не стоит
weko Можно в логах найти
Vort попробуй без перегрузке по CPU на рейт посмотреть
weko Несколько основных роутеров, которых штурмует, остальных думаю как побочный эффект задевает
weko Vort: так перегрузка только когда шторм
weko А это не часто случается
weko Надо ждать
Vort а, понял
Vort то есть, нормальная работа без перегрузки, а потом хреняк - и глюки?
Vort weko: ты же давно тесты делал, много багов с тех пор починено, может уже и не будет такого эффекта?
weko Не знаю. Это херня случайно появляется
weko Эта
weko Но как я сказал была два раза, так что не так уж редко
weko Вполне может быть что какая петля образуется
Vort weko: так это на последних версиях было или нет?
weko Vort: на тот момент была последняя
Vort надо перепроверять как минимум с 2.52.0
Vort onon: хоть за секунду не ответят, хоть за 30 секунд - на скорость построения туннелей это не повлияет. ну или если считаешь, что повлияет, то расскажи, почему
onon Потому что я поставил таймаут на 10 сек и мне стало хорошо =)
onon Не предлагаю никому так делать, дисклеймер.
Vort TUNNEL_CREATION_TIMEOUT - вот это?
onon Нужно реальное значение выставлять, в зависимости от состояния сети оно будет меняться
onon а константа мне не нравится
onon TUNNEL_CREATION_TIMEOUT = 10;
Vort по коду этот таймаут на скорость влиять не должен. так что или тебе показалось или я неправильно понимаю код
Vort "<onon> Нужно реальное значение выставлять" - адаптироваться к багам и глюкам - сомнительная идея
onon Хорошая идея.
orignal тут доапаптироваться к реальному состоянию сети можно до того что любая мелкая атака все обрушит
onon Из того, что я предложил, хуже точно не станет.
onon Если будет много фейлов, он точно так же будет болтаться около максимального таймаута.
onon А при нормальной работе будет реагировать быстрее
onon А потом, когда Лось переделает транспорты, сделаем приоритезацию пакетов, и ещё лучше станет работать.
onon Хотя, наверное, это можно сделать уже сейчас. Но некому.
onon Vort, извини, ты был прав. Я не прав, это действительно ни на что не влияет.
onon Я попытался разобраться в коде, там все сильно хуже, чем я предполагал.
onon Теперь понятно, почему он строил 16 туннелей, когда я просил всего 3
onon Мне не совсем понятно это:
onon auto msg = m_Queue.GetNextWithTimeout (1000); // 1 sec
onon И вот это
onon msg = (numMsgs <= MAX_TUNNEL_MSGS_BATCH_SIZE) ? m_Queue.Get () : nullptr;
onon Он 256 сообщений собирает и раз в секунду tunnel->FlushTunnelDataMsgs ();
Vort первая часть - для того, чтобы гарантированно попасть на Manage методы даже если не будет никаких сообщений в очереди
Vort по второй части - не знаю
Vort а, понял вторую часть - она просто собирает все сообщения из очереди (если их меньше 100)
Vort если больше 100, то обрабатывает пачками по 100
Vort почему важно делить на пачки - ещё не разбирался, наверно, чтобы не держать выполнение в потоках слишком долго - чтобы блокировок было поменьше
Vort подробней про GetNextWithTimeout: если сообщения в очереди есть, то вызов отработает очень быстро. 1 секунду будет ждать только если очередь пустая
onon Откуда взялось число 100
Vort const int MAX_TUNNEL_MSGS_BATCH_SIZE = 100; // handle messages without interrupt
Vort а вот почему именно 100 - не знаю, наверно наугад
onon И если очередь пустая, тред будет спать и ничего не делать?
Vort но я подозреваю, что это значение не критичное, и 10 и 1000 будут работать
Vort будет просыпаться раз в секунду и проверять не надо ли Manage вызывать
orignal да это от фонаря я поставил
orignal смысл этого числа чтобы если большая нагрузка тред иногда засыпал
orignal если очерель пустая тред просто повсинет на условной переменной
Vort в каком месте он засыпать должен?
orignal нкогда у условной переменной вызывается wait то просиходит переключение контекста
Vort так где этот wait будет?
orignal в GetNextWithTimeout
Vort если очередь набита, то, думаю, ожидания не будет
orignal да не будет
orignal я видимо потом переделал ))
orignal как всегда
orignal по сути тот кусок кода счас можно выкинуть
orignal msg = (numMsgs <= MAX_TUNNEL_MSGS_BATCH_SIZE) ? m_Queue.Get () : nullptr;
orignal а нет вот что
orignal все дело в этом
orignal tunnel->FlushTunnelDataMsgs ();
orignal мы делаем флаш или когда все сообщения прочли или каждую сотню
orignal но 100 это много
onon1 А почему не по 1му
onon1 Я так понимаю, он уже на транспорт перекладывает
orignal потому что они дальше пакуются пачками
orignal не всегда
orignal бывает что и входящие в тоннель
orignal вот тогда и имеет смысл паковать пачки
orignal в транспорт кстати тоже
orignal отослать 1 фрейм в 16K куда как лучше чем 16 фреймов по 1K
orignal я бы заменил 100 на 16 для начала
onon1 В общем, я надеюсь донёс мысль про очереди и вставку туда больших пачек сообщений.
onon1 Очередь может быть уже не пустая.
orignal почему? потому что в NTCP2 счас фреймы по 16k
orignal <onon> Он 256 сообщений собирает и раз в секунду tunnel->FlushTunnelDataMsgs ();
orignal флаш не раз в секунду а когда очередь пустая или 100 накопилось
orignal предлагаю поменять на 16
onon1 Это я ошибся, не ту переменную посмотрл
onon1 А так да, меншими пачками лучше
orignal и для 16 есть рациональное основание в виде разумера фрейма NTCP2
onon1 А с какой периодичностью он будет вставлять?
orignal когда набралось 16 или в очереди пусто
orignal никакой периоличнности нет
relaybot 13apophis: так что, опять атаки возобновились или мен показалось ?
onon Я всё равно не догоняю, как это работает, я не вижу что бы он куда-то складывал сообщеня
onon Он их только считает.
orignal они и не прекрашались
orignal в TransitTunnel.cpp посмотри что куда складывается
Vort apophis: атака уже длится неделю, но сегодня усилилась
relaybot 13apophis: ясно, спасибо за подтверждение
orignal там просто цикл do-while
orignal там в начале идет обраюботка
orignal Vort намногол усилилась?
orignal я не вижу большой разницы
Vort раза в 3-4
Vort я мусор в netdb считаю просто
orignal ну так уменьшим это 100 до 16?
Vort я без понятия как измерять эффект, так что не знаю
orignal кстати я вспонил еще почему мы входил их этого цикла если 100
orignal чтобы тоннели обсулужить
orignal очистку там построение и прочее
orignal но 100 это реально много
onon Я всё равно не вижу, где бы он размер передавал.
Vort как я понимаю, чтобы обслуживание туннелей залагало, этот поток должен быть конкретно перегружен
Vort но вообще смысл понимаю, да
Vort в теории
orignal разумер чего?
onon Как я понимаю, он их всё-таки отдаёт по одному, а после того как отдал 100, переключается на обслуживание туннелей
orignal Vort может получиться так что 100 сообщений слишком долго обрабатываются
orignal он по одному их расшифровывает
orignal этот тяжелый код в TunnelEndpoint тоже там же
Vort ну тут важно не столько долго или нет, а то, прочищается очередь до нуля или нет
orignal если 100 сообщений подряд обработал делает flush
orignal и переключасется на обслуживание
orignal Vort допустим что нет
Vort ну вот тогда важно делать паузы, да
orignal но там же на веб морде видно
orignal Tunnels:
orignal Queue size: 0
orignal она почти всегда 0
orignal но бывают скачки
orignal меня бекспоит больше когда 100 пакетов подряд с одного тоннеля прилетело
onon Вот только не понятно, зачем они в одном цикле... Менеджер туннелей и обработка пакетов
Vort orignal: интуитивно кажется, что имеет смысл размазать лучше
orignal onon согласен TunnelData и TunnelGateway можно вынести
orignal но там ведь запросы на построение тоннелей
orignal а они в одном цикле с менеджером чтобы в одном треде
orignal Vort вот я и предлагаю 16
Vort меня вообще беспокоит образование очередей в том месте. я не верю в тяжелость нагрузки
orignal в каком?
Vort <~orignal> Queue size: 0
orignal и в чем вопрос то?
orignal ты думаешь что несколько за раз никогда не приходит или что?
orignal приходит
Vort ну я подозреваю, что там ожидания где-то внутри могут быть раз очередь иногда накапливается
orignal потому что в NTCP2 мы фрейм сбрасываем за раз
Vort сейчас подумаю, как лучше объяснить
orignal смотри
orignal в NTCP2 мы получаем фрейм целиком
Vort понятно, что очередь будет набираться. не понятно, почему она не может рассосаться мгновенно, допустим, за 10мс
orignal после чего читаем I2NP блоки по одному
orignal а тоннельные мы накапливаем
orignal и сбрасывааем в ту очередь только когда фрйем закончился
orignal рассосется мгновенно разумеется
Vort тогда её практически нереально в интерфейсе заметить
orignal бывает иногда щтук по 10 сам видел
orignal потому что в этом треде криптография
Vort ну смотри - допустим, 10мс работает, 990мс ждёт. шанс заметить очередь - 1%
Vort ну и сколько процентов времени тред активно жрёт CPU ?
orignal дохуя кстати
orignal S 22.2 9.9 306:52.16 Tunnels
Vort транзитные туннели тоже в этом потоке?
orignal на 2RRY
orignal 22% ядра весьма немало
orignal да тоже в этом же
Vort тогда понятно
orignal разумеется отправка уже в других
orignal тут только шифрование и перепаковка пакетов
Vort надо бы узнать, сколько примерно сообщений в секунду он переваривает
Vort вот ты говоришь, что надо Manage дёргать. раз в секунду же нормально делать проверку, верно?
Vort и сколько за секунду сообщений тред может переработать?
Vort вот мне кажется, что это не 16 и не 100
orignal за секунду разумеется сильно больше
Vort ну вот значит Manage - не главная причина для перерывов в обработке
orignal а кто сказал что это причина?
orignal я не понимаю о чем вообще речь
Vort <~orignal> кстати я вспонил еще почему мы входил их этого цикла если 100 / чтобы тоннели обсулужить
Vort вот я говорю, что туннелям так часто не надо
orignal возможно
orignal говорю же я это от фонаря сделал
Vort я имею в виду, что стоит вспомнить все причины по которым стоит делать перерывы / разбиение на блоки
onon А мы теперь разбираемся и ищем в этом "Скрытый Глубокий Смысл"
orignal ну я писал по прициипу "лишь бы как то работало"
Vort для того, чтобы обосновать выбор нового значения
orignal первое что в голлову пришло
orignal но я не могу пронять какая проблема возникла что стали в этом копаться
Vort это к onon вопрос
Vort он туда зачем-то полез
onon Это я открыл рандомный файл в libi2pd и начал задавать вопросы.
onon Я часто так делаю...
orignal и да разнести построение тоннелей и тоннельные сообщения стоит разнести по двум тредам
onon Вы ещё не заметили?
Vort стандартная процедура при поиске багов, понятно
Vort но бывает и погоня за конкретной проблемой, поэтому имело смысл уточнить
orignal я вот как раз и занимаюсь разделением netdb на 2 треда
Vort бить имеет смысл или из-за существенной нагрузки или для повышения логичности происходящего
Vort иначе это шанс создать глюки без заметного положительного эффекта
Vort вроде, это должно быть понятно, но на всякий случай пишу
orignal ну насчет netdb мы уже говорили в чем дело
orignal там просто запросы криво приделаны сбоку
Vort я помню обсуждение блокировок из-за файлов
Vort но раз это для уменьшения кривизны - то всё ок
orignal нет там уже не файлы
orignal там зоопарк ненужных мьютексов
Vort я поддерживаю рефакторинг до тех пор, пока он не становится самоцелью
orignal самоцели тут точно нет
Vort "любую проблему можно решить увеличением количества абстракций, кроме проблемы слишком большого количества абстракций"
onon Ещё вопрос мимо темы:
onon Когда он делает auto leaseRouter = i2p::data::netdb.FindRouter (path->remoteLease->tunnelGateway);
onon Он же потом полезет на флудфил, искать этот роутер?
orignal тоннели же считаю и счас неплохо работают
onon Плохо работают
onon Когда придумаю, как сделать лучше, расскажу.
orignal нет эта функция делает только локальный поиск
orignal полагаю он так выбирает тоннель
orignal исходящий
orignal чтоюы была совместимость
onon Да, это так для понимания.
orignal а если нет роутера в нетдб то и не ищет
orignal кстати в том цикле в тоннелях может ограничивать не число сообщений а время?
Vort для выпрыгивания из цикла в целях обслуживания это вполне логично. но, как я понимаю, есть ещё причины для разделения на блоки и вот по поводу этих причин я без понятия, подойдёт там проверка по времени или нет
orignal да нет причин для разеления на блоки
orignal я именно сделал чтобы цикл периодически завершался
Vort я так и не понял, есть ли для этого какие-то ещё причины кроме обслуживания
orignal еще флэш сообщений в тоннели
orignal если у тебя поток с одного идет подряд
Vort нормально ли его дробить по времени?
Vort ну и вообще - как часто его надо делать?
orignal там можно по числу если 16 пакетов набралось то сбрасывать
Vort сбрасывать, но из цикла не выпрыгивать?
Vort точнее выпрыгивать, но по другому словию
orignal выпрыгивать только по времени
Vort вроде норм
onon Лось, я придумал как просто сделать определение ретрансмита в стримах.
onon if (receivedSeqn <= m_LastReceivedSequenceNumber)
onon // we have received duplicate
onon LogPrint (eLogWarning, "Streaming: Duplicate message ", receivedSeqn, " on sSID=", m_SendStreamID);
onon SendQuickAck (); // resend ack for previous message again
onon if (receivedSeqn <= m_PreviousReceivedSequenceNumber)
onon m_CurrentOutboundTunnel = m_LocalDestination.GetOwner ()->GetTunnelPool ()->GetNextOutboundTunnel (m_CurrentOutboundTunnel);
onon UpdateCurrentRemoteLease ();
onon m_PreviousReceivedSequenceNumber = receivedSeqn;
onon m_LocalDestination.DeletePacket (packet); // packet dropped
onon Ложное срабатывание будет только если при ретрансмите будет реордеринг пакетов.
onon Только SendQuickAck (); конечно после проверки перенести
onon Это я поспешил
` #офтоп. Why отступ 8 проблемофф?
onon табы
` табы не по 4? как-то жырно смотрица
onon В редакторе ставишь сколько хочешь
onon 1 таб = 2 спейса
orignal у меня есть еще лушчше идея
onon Давай
orignal if (receivedSeqn == m_LastReceivedSequenceNumber)
orignal менять тоннели
orignal то есть если мы видми перепосылку самого последнего то меня того а иначе ниебет
onon Типа если до конца списка дойдёт
onon Вроде логично
orignal перепосылка самого свежего
onon Надо подумать
orignal ну и возможно проверять сколько раз пришел
onon Не, лучше сделать как я предложил
onon Сейчас объясню почему
onon Потому что ретрансмитить в пустоту всё окно - плохая идея. Потом мы переделаем, чтобы слал по одному пакету, как у меня сделано. И тогда == перестанет работать
onon А то что я предложил будет работать в обоих случаях.
orignal так на этой стороне мы же не делаем ретрансмит мы толлько ack шлем
onon Я про то что отправитель в будущем, не будет слать всё окно
onon Потому что бесполезная нагрузка на сеть
onon Мы переделаем потом
orignal так наша цель доставить ему ack
orignal тогда он сразу перестанет
onon Ну, так мой код сработает так же
orignal не надо лишнюю переменную держать и думать о ней
onon Зато универсально
onon И с заделом на будущее
onon Единственный момент, если проверять на == сработает при первом же ретрансмите, а в моём коде на втором
onon Думаю можно добавить в мой код проверку == тоже
onon Вот так вот:
onon if (receivedSeqn <= m_PreviousReceivedSequenceNumber || receivedSeqn == m_LastReceivedSequenceNumber)
onon m_CurrentOutboundTunnel = m_LocalDestination.GetOwner ()->GetTunnelPool ()->GetNextOutboundTunnel (m_CurrentOutboundTunnel);
onon UpdateCurrentRemoteLease ();
onon m_PreviousReceivedSequenceNumber = receivedSeqn;
orignal возможно