IRCaBot 2.1.0
GPLv3 © acetone, 2021-2022
#dev
/2025/01/19
~AreEnn
~AreEnn_
~R4SAS
~acetone
~orignal
~villain
&N00B
+Xeha
Guest58423
Most2
Nausicaa
Nikat
Opax
Vort
`
anon3
b3t4f4c3
fidoid
i
karamba_i2p
nemiga
not_bob_afk
poriori
profetikla
qend
r3med1tz
segfault
soos
teeth
uis
un
user
weko
whothefuckami
woodwose
Vort посмотрел я изменения последних двух коммитов
Vort во-первых, мне кажется, что в слове Appling опечатка
Vort во-вторых, лаги остались, на примерно таком же уровне, что и раньше
Vort но поменялся их характер
Vort раньше лаг чаще попадал в блок с единственным пакетом
Vort теперь же чаще лагают кучи размером побольше
Vort раньше лаг в блоке с одним пакетом приводил к сильному накоплению очереди
Vort теперь лаги накапливают очередь слабее
Vort однако, выводы эти неточны, так как нагрузка на мой узел нестабильна. может, дело просто в разном её характере во время теста
Vort но что могу сказать точно - надо искать дальше источники лагов
Vort хех. начал писать код в Visual Studio и характер лагов стал таким же, как и при прошлом тесте
Vort эффекта от предпоследнего коммита не видно - все три вызова PopulateRouterInfoBuffer в SSU2Session как лагали, так и лагают
orignal ну хначит надо смотреть дальше
Vort насчёт последнего коммита и оставшихся лагов я пока в сомнениях
orignal в любом случае убрать обращение к диску из треда полезно
Vort это ты про профили сейчас говоришь?
un 'однако, выводы эти неточны, так как нагрузка на мой узел нестабильна.' <<< это долгий процесс тестирование и наблюдение
orignal PopulateRouterInfoBuffer это была не починка как таковая а уменьшение числа
un главное не дергаться. спешка только при ловле блох.
orignal да про профили
un :) особенно с сетью
orignal про PoulateRouterInfoBuffer тут думать надо
orignal при каком сценрий возможно загрзука буфера без соединения
orignal Applying поправилю
Vort вот ещё пример нестабильности: при прошлых тестах PoulateRouterInfoBuffer был не главным источником лагов. теперь же - главный. то ли последний коммит помог, то ли нагрузка поменялась
orignal вопрос тут в другом как часто возникает переполнение SSU2 очереди
orignal если уменьшить котсанту ту с 2500 скажем до 250
Vort ну вот когда чтение RI у меня на 10 секунд залагало, тогда и возникло переполнение :)
orignal одного RI на 10 секунд?
Vort ну да, я же показывал строчку из лога
orignal как такое может быть?
Vort компиляция в Visual Studio наверно все ресурсы сожрала тогда
Vort я же собирал одни логи и писал сбор вторых логов :)
orignal надо (как говорит Путин) посмотреть в каком случае RI подгужается без существующего соединения
orignal я что то не могу сообразить
Vort имеешь в виду случаи, когда требуется вызов PopulateRouterInfoBuffer ?
orignal ну то есть он вызывается часто но там не должно быть загрузхи
orignal с диска
orignal if (r->GetBuffer ()) return true;
orignal return r->LoadBuffer (m_Storage.Path (r->GetIdentHashBase64 ()));
orignal то есть когда проваливается в LoadBuffer
Vort PopulateRouterInfoBuffer в случае "case 1: // Bob from Alice" кстати довольно редко случается
Vort в основном лаги лезут из "case 3: // Bob from Charlie" и "// send relay intro to Charlie"
orignal и вот это не понятно
orignal ибо там должны быть установленные соединрения везде
Vort по логике RI Чарли должен быть загружен?
orignal ты смотришь просто вызовы или LoadBuffer?
orignal по логике он должен быть в памяти когда есть соединение
Vort я по разному делал. сейчас я тупо смотрю на время выполнения вот этой строчки
Vort if (r && (r->IsUnreachable () || !i2p::data::netdb.PopulateRouterInfoBuffer (r))) r = nullptr;
Vort если больше 10мс, то пишу в лог
orignal а не может быть больше 10 мс потому что треду этому проц не дается?
orignal я бы проверял частоту вызовов LoadBuffer
Vort это случается слишком часто и слишком надолго
Vort точнее даже не так
Vort среди всех лагов, в этих местах лаги самые частые
Vort вокруг LoadBuffer я тоже логирование ставил
Vort сейчас просто поменял метод
Vort ну и там же не только около 10мс. вот к примеру такое бывает: SSU2Checkpoint 55 delta 140563 us / HandleReceivedPacketsQueue size 1 duration 140775 us
Vort то есть, 99.9% времени лага попало именно на ту строчку
orignal тогда буду думать
orignal почему вообще LoadBuffer вызывается
Vort "<~orignal> по логике он должен быть в памяти когда есть соединение" пир тесты считаются за полноценные соединения?
Vort я просто помню, что там какие-то специальные состояния были у сессий
orignal ну есть пир тесты от чарли к алисе без сессии
orignal но тут то зачем RI?
orignal точнее RI нужен не нужен буфер
Vort окей, понял
orignal кроме того он прилетает от боба
orignal аналогично с HolePunch
Vort посмотрел я ещё на логи и делаю вывод, что вопрос про LoadBuffer таки самый главный сейчас
Vort остальные источники могут быть действительно из-за того, что ОС отняла процессор не вовремя. а вот LoadBuffer явно "светится" в логах
orignal вот это надо понять почему требуется его прогружать если он не должен брасываться
orignal так а если закомментрирвать вот эту строчку
orignal void DeleteBuffer () { m_Buffer = nullptr; m_IsBufferScheduledToDelete = false; };
orignal в RouterInfo.h
orignal m_Buffer = nullptr;
orignal чтобы гарантированно не сбрасылвался
Vort ок, сейчас сделаю
orignal тогда паяти будет жрать меньше
orignal *больше
orignal но LoadBuffer вообще не должен вызываться
Vort то есть, вопрос в том, уберёт ли это лаги в строчках с PopulateRouterInfoBuffer ?
Vort в общем, собираю бинарник с /*m_Buffer = nullptr;*/, посмотрю на эффект
orignal именно так
Vort с обрезанным DeleteBuffer пока что за 20 минут ни разу не залагало около PopulateRouterInfoBuffer. при прошлом тесте за такое же время уже 17 лагов было там
orignal ага
orignal значит надо ращбираться почему вообще дроп происходит
orignal короче
orignal мы при старте зануляем буфер
orignal но он при утсановке соединения должен обновиться
Vort в NetDb::LoadRouterInfo есть r->DeleteBuffer ();
orignal да но оно вызывается только при старте
orignal дальше допустим мы установили соединение и сразу придет одновление
Vort не могут ли запросы приходить до того, как приходит свежий RI ?
Vort и как там вообще дела с "гонками" ?
Vort не может ли запрос на обновление RI "застрять" где-то?
orignal может наверное но все это должно быстро просраться
orignal грубо говоря через час на флудфиле этого быть не должно
orignal тут логика какая
orignal новый RI всегда прилетает в SessionConfirmed
orignal а боб первым шлет свой RI
orignal if (sendDatabaseStore)
orignal session->SendLocalRouterInfo ();
orignal в PeerConnected
Vort в таком случае подозрение на m_Peers
Vort это не там ли случаем хаос с мьютексами?
orignal гонка разумеется может быть в SessionConfirmed между auto ri1 = i2p::data::netdb.AddRouterInfo (ri->GetBuffer (), ri->GetBufferLen ());
orignal и PeerConnected
orignal если в этот момент из NetDB будет сброс на диск то вполне
orignal соотвественно
orignal надо сброс буфера включать только через время
orignal что я и намерен сделать
Vort так что получается - пир отключился, буфер сбросился, пир подключился, буфер обновиться не успел, но уже пришёл запрос?
Vort кстати. там около строчки "// update RouterInfo in netdb" я тоже лаги замечал
Vort и около ExtractRouterInfo
Vort но не настолько явные, как возле PopulateRouterInfoBuffer
Vort при выключении узла особо лагало там
Vort наверно как раз из-за сбросов
orignal ну там скорее всего мьютекс
orignal а вот задержку сброса да надо бы сделать
Vort так в чём смысл идеи задержки сброса? я так понимал ситуацию, что сброс мог быть в условно-далёком прошлом, а вот когда пришло время записать (обновить) свежий буфер, тогда случается гонка
Vort "<~orignal> ну там скорее всего мьютекс" который ждёт копирование буферов? вполне соответствует. в этом месте лаги где-то 30-60мс
orignal смысл в том что мы смотрим
orignal если обновление роутера свежее то не удалячем
orignal с тем мьютексом это след шаг
orignal я думаю не сделать ли мне на каждлый RouterInfo отдельный мьютекс
orignal это решит проблема
Vort да ну если там реально не больше 100мс, то это не приоритетно
Vort "<~orignal> если обновление роутера свежее то не удалячем" то есть это только уменьшит шанс попасть на лаг?
orignal нет
orignal если у тебя лаг между получением роутера в SecssionConfirmed и вызовом PeerConnected
orignal то секундная задрежка решит проболему
Vort ок
orignal о и да надо это флаг сбрасмывать при обвнлении
orignal m_IsBufferScheduledToDelete
orignal и скорее всего дело в этом
orignal мы флаг поставили обновление пришло а флаг отсается и сбрасывается
orignal вроде нормально там сбрасываю
orignal нашел я ошибку
orignal r->SetUpdated (false);
orignal updatedCount++;
orignal continue;
orignal вот и ответ
orignal поправил
orignal счас должно стать нормально
Vort поставил тестироваться
Vort orignal: функция CancelBufferToDelete осталась без дела?
orignal пока да
orignal но не надолго ))
Vort пулл реквест на гитхабе про работу с буферами видел?
orignal еще нет
orignal я не вижу разницы
Vort я не разобрался, в чём там дело
Vort наверно предупреждения у какого-то компилятора лезут
Vort так что если хуже не стало, то можно и влить
Vort но только проверить хорошо...
orignal тот тип тоже
orignal а я знаю в чем дело
orignal позже
Vort гуглёж подсказывает, что это cppcheck такое выдавать любит
orignal я думаю закрыть нахуй
orignal он там хуйни написал
orignal как же заебили все эти ИИ и анализаторы кода
orignal главное вот чувак бы хоть головой то подумал но зачем?
Vort ну вообще-то иногда такие инструменты всё же помогают находить ошибки
Vort но отличить правильное срабатывание от ложного часто довольно сложно
orignal ну вот он бы хоть сколько то подумал
orignal нахуя переделывать размер на то что копируется а не куда
orignal проблема не в интрументах а в людяъ которые их используют а потом как попугаи говорят "попка дурак"
Vort этот инструмент - не ИИ, поэтому рандомные глюки исключены и его явно что-то триггернуло. если там ошибки нету, то значит два варианта: или код написан непонятно, или инструмент баганутый
orignal ну так понятно что mempcy идет в буфер меньшего размера чем буфер
orignal потому и ругается
Vort то есть, переполнение сделано намеренно?
orignal это не переполнение
orignal вот смотри
orignal uint8_t publicKey[256];
orignal uint8_t signingKey[128];
orignal uint8_t certificate[3];
orignal там так объявлено
orignal я просто копирую в publicKey 387 байт
orignal одним memcpy
orignal потому что я точно знаю как там память расположена
orignal что так с LoadBuffer?
Vort этот код явно можно переписать понятнее. сразу только не соображу, как
Vort memcpy(this может?
orignal можно сделать union
orignal mcemcpy(this рисковано
orignal тут реально можно получить UB
Vort понял
orignal хотя наверное нет
orignal да с this будет нормально
Vort "<~orignal> что так с LoadBuffer?" ушли лаги около PopulateRouterInfoBuffer
orignal то есть это просто была моя бага
Vort осталась всякая фигня, за которой я сейчас гоняться не хочу
orignal и не надо
Vort на всякий случай опубликую мой извращённый метод ловли этого бага
Vort вдруг кому понадобится
onon congrat
orignal надо будет еще в тоннельном треде переделать чтобы не грузились профили с диска