IRCaBot 2.1.0
GPLv3 © acetone, 2021-2022
#dev
/2024/03/01
~AreEnn
~R4SAS
~acetone
~orignal
~villain
&N00B
+Xeha
+relaybot
DUHOVKIN
Guest7184
Leopold
Most2
Nausicaa
Ruskoye_911
Vort
`
anon2
b3t4f4c3
karamba_i2p
nemiga
not_bob_afk
plap
poriori
profetikla
soos
teeth
un
weko_
whothefuckami
weko_ 2.59% i2pd [.] i2p::data::RouterInfo::IsFloodfill() const
weko_ выглядит как проблема
orignal в чем проблема?
weko_ хотя я на самом деле не очень понимаю что именно он считает
orignal bool IsFloodfill () const { return m_Caps & Caps::eFloodfill; };
weko_ orignal: функция вторая по потреблению
orignal так один &
weko_ видимо она очень много вызывается
orignal надо смотреть откуда
weko_ 2.95% i2pd [.] std::__shared_ptr<i2p::data::RouterInfo, (__gnu_cxx::_Lock_policy)2>::get() const
weko_ ну первом месте
orignal ну наверное
orignal только я не вижу никакой проблемы
weko_ ну откуда так много
orignal потому что везде используетсяч
weko_ 0.23% NTCP2 libc.so.6 [.] malloc
weko_ 0.23% SSU2 libc.so.6 [.] malloc
orignal а вот интереснее
orignal потому что там ведь пулы
weko_ 37.35% i2pd
weko_ 33.28% libcrypto.so.3
weko_ 19.21% [kernel]
weko_ 7.75% libc.so.6
weko_ 1.41% libz.so.1.3.1
weko_ 0.78% libstdc++.so.6.0.32
weko_ 0.21% [vdso]
weko_ 0.01% libm.so.6
weko_ 0.00% libboost_filesystem.so.1.83.0
orignal что криптография больше всего это естествнно
weko_ ну значительная часть
weko_ GetClosestNonFloodfill вот кажется тут проблема
weko_ из того, что увидел
weko_ сложно настраивать профилировщик
orignal у тебя флудфил что ли,
orignal эта функция как раз делает тупой перебор без DHT
weko_ <orignal> у тебя флудфил что ли,
weko_ давно известно
weko_ да вижу
weko_ тупой перебор тут
weko_ а нахера она вообще?
orignal для зондирования
weko_ зачем именно не флудфилы
weko_ вот что не пойму
orignal чтобы узлы находили не флуфдфилы
orignal ибо флудфилы и так найдут
weko_ выглядит костыль, но может я что-то не понимаю
weko_ как костыль*
weko_ ну вот эта функция оч много жрёт
orignal надо подумать как переделать
weko_ для зондирвоания вообще зачем ближайшие выдавать
weko_ можно просто случайные
orignal спроси у деда
orignal но он скажет "так задумал jrandom" )))
weko_ ну вот а почему он так задумал ))
orignal меня тоже давно интересует этот вопрос
weko_ может в доках есть
orignal так он все равно не скажет
orignal ибо он умер
weko_ <orignal> меня тоже давно интересует этот вопрос
weko_ значит в доках нет
orignal в доках есть только что блтижайший
orignal а почему нету
orignal но спросить у деда это стоит
weko_ ладно
orignal он еще обещал рассказать про баг с пир тестом
weko_ он у себя нашёл что-ли?)
orignal говорит что у нас
weko_ ну так пусть говорит )
orignal ждем-с
weko_ 0.27% NetDB i2pd [.] i2p::data::operator^(i2p::data::Tag<32ul> const&, i2p::data::Tag<32ul> const&)
weko_ хе
weko_ ну понятно
weko_ чем больше изучаешь i2p, тем больше вопрос и проблем всплывает
Vort weko_: не пойму, как вот это соотносится: "37.35% i2pd" и "2.95% i2pd [.] std::__shared_ptr<i2p::data::RouterInfo..." "ну первом месте". получается, одной сильно жрущей функции нету, но есть куча мелочи?
Vort "GetClosestNonFloodfill вот кажется тут проблема" - и сколько же процентов CPU она жрёт, относительно общего количества?
Vort "сложно настраивать профилировщик" - с ним есть одна особенность - если включать дебаг режим и выключать оптимизации, то будет жраться больше CPU, чем надо
Vort если же включать оптимизации, то профилировщик будет немного привирать - к примеру, инлайн функции учитывать как родительскую функцию
Vort я думаю что IsFloodfill как раз похожий пример - нечему там жрать много ресурсов, профилировщик скорее всего что-то упростил/придумал
Vort weko_: попробуй профилировщик переключить в древовидный режим: nanxiao.me/en/wp-content/uploads/2017/05/Capture.jpg
Vort тогда будет понятно, какие функции из каких вызываются
Vort и можно будет логически сгруппировать источники нагрузки
Vort ещё кое что - надо же как-то из профиля исключать нагрузку при запуске узла - загрузку netdb и так далее - это не то, что нам надо
Vort как это делается с помощью perf я не разбирался, но явно такая функция должна быть
Vort о, я вспомнил кое что - для того, чтобы получить отображения в виде дерева, надо какую-то опцию при сборе данных включить
Vort без неё ничего полезного я получить от профилировщика не мог. ну если я правильно помню. сейчас погуглю
Vort попутно нашёл про пропуск сбора данных с запуска - вроде можно подключаться к PID - perf record -p $PID
Vort "Since v3.16 the 'children' overhead is shown by default and the output is sorted by its values."
Vort может, дерево и так там нормальное уже
Vort а нет, надо кое что таки указывать при сборе данных
Vort -g Enables call-graph (stack chain/backtrace) recording for both kernel space and user space.
Vort вот, если включить -g, вывод профилировщика станет намного понятнее
weko_ [06:36:49] <Vort> ещё кое что - надо же как-то из профиля исключать нагрузку при запуске узла - загрузку netdb и так далее - это не то, что нам надо
weko_ Я его подключаю к уже запущеному процессу по pid
weko_ Vort: да -g я ставил, но там не особо дерево
weko_ Я так и не понял что значит
Vort weko_: таблица с Children и Self есть как на том скрине что я показал?
Vort её же потом раскрыть можно как-то так: i.stack.imgur.com/RipG0.png
Vort + слева позволяет раскрыть ветку дерева
Vort решил я рассмотреть получше код теста туннелей и нашёл подозрительное место
Vort боюсь, что похожих мест по всему коду много и они могут заметно гадить. но сейчас надо хотя бы с этим разобраться
Vort orignal: у меня есть вопрос по мьютексам тестов туннелей. как сможешь этим заняться, скажи пожалуйста
rev онотоле отакуэ
orignal давай твой вопрос
Vort orignal: я же правильно понимаю, что нельзя в одном потоке перебирать коллекцию, а в другом добавлять/удалять из неё что-то?
orignal с std стурутурами нет
orignal на работе у нас есть свои с которыми можно
Vort похоже, что такая ситуация в двух функциях TunnelPool::TunnelExpired
Vort там for (auto& it: m_Tests) не прикрытые мьютексом
orignal а там есть вызов из друогого треда?
orignal вопрос то ведь в этом
Vort TunnelPool::ProcessTunnelTest делает m_Tests.erase (it);
Vort а он вызывается и из Router и из Destination
orignal скажи строчки
orignal откуда
Vort сейчас
orignal я думал он только из Tunnels
Vort могу перепроверить
orignal это и надо
orignal если из разных то ясен пень что надо
Vort ^ вот два вызова TunnelPool::ProcessTunnelTest
orignal да согласен
orignal что это из треда RouteContext
orignal так погоди а где мьютекса то нету?
orignal ага все вижу
orignal явная бага
orignal счас починю
orignal еще где то есть кроме Tunnelxpired?
onon Мне кажется, мы лечим насморк при гангрене, разбирая мьютексы в тестах туннелей.
Vort orignal: я ещё видел m_Tests.clear (); в TunnelPool::DetachTunnels. но не знаю, нужен ли там мьютекс
Vort ну и самих TunnelExpired же две штуки
Vort onon: дело в том, что подобные проблемы есть и в других местах
Vort по-хорошему, надо все мьютексы по коду перепроверить
Vort но начать можно с тестов туннелей :)
orignal не повредит
orignal больше нигде?
Vort с m_Tests всё
Vort больше не вижу
orignal тогда коммичу
Vort ок
Vort я ещё сам код тестов посмотрю, есть у меня кое какое подозрение
Vort но это отдельный вопрос
orignal закоммитил
Vort хорошо, сейчас на тестовом узле чутка погоняю
orignal ну вряд ли оно сильно изменит
Vort знаю
Vort подозрение же у меня касается возможности коллизии между статусом eTunnelStateExpiring и eTunnelStateTestFailed
Vort но пока что доказательств у меня нету
orignal такое возможно
Vort скорее всего надо делать две переменные статуса
Vort ну или налету expiring считать
orignal я так не думаю
orignal expiring должен быть наввегда expitring
orignal это правильно решение
Vort значит отдельно состояние тестирования хранить, чтобы различать established + test failed и expiring + test failed
orignal не вижу смысла
Vort сейчас test failed считается как established, а он вполне может быть expiring
onon А может просто перед установкой test failed проверять на expired?
orignal с чего вдруг? если ему время перейти в expiring он должен в него перейти вне зависиомсти от теста
orignal вот это надо проверить
orignal то есть в expiring переходит всегда по времени если не failed
Vort а результат теста не может из Expiring перевести в test failed?
orignal вот это и надо проверить
orignal если переводит то бага
Vort вначале поставится expiring, а затем фейлящимся тестом снимется
orignal надо чинить
orignal поправлю счас
orignal точнее часа через 2
orignal немного занят
Vort хорошо
Vort решил поискать фразу "std::mutex" в .h файлах i2pd. нашлось 19 файлов. масштаб требуемых проверок немаленький
Vort ткнул вот в одно из важных мест - Transports с его m_Peers / m_PeersMutex
Vort и сразу вижу кучу неприкрытых мьютексами m_Peers.find
Vort подобные участки вполне могут создавать эффект ухудшения работы узла в зависимости от нагрузки
Vort чем чаще коллекция дёргается, тем больше шанс коллизии
onon У меня такое ощущение, что где-то есть LIFO буфер, не знаю, у нас в роутере или на промежуточных маршрутизаторах. При тесте чаще всего пакеты я получал в обратном порядке блоками по ~15~25 сообщений.
onon И если я правильно понял по коду, мы перезапрашиваем ещё не полученные пакеты, if (ackTimeout > m_AckDelay), потом сообщения из "основного потока" до нас доходят в обратном порядке.
onon А приходящие перезапрошенные сообщения дропаются
onon Хотя вот сейчас смотрю, бывает что и в нормальном порядке приходят.
Vort может от количества хопов зависит?
Vort чётное или нечётное количество раз переворачивается массив
Vort проверять конечно это надо
onon Не, я пока через 1 свой роутер всё гоняю
orignal onon там не LIFO
orignal SSU2 просто не соблюдает последовательность
onon Я на чистом NTCP2, ssu отключил
Vort он говорил вообще про пакеты стримов
onon SSU может быть только на том узле, который у меня точка выхода сервера и точка входа прокси.
Vort ну если и клиент и сервер NTCP2, то у промежуточного узла выбора нету
orignal со стримами так не должно быть
orignal короче все прочитало что дед нашел с peer test?
onon Кстати на NTCP only выдаёт ~1.2mb/s
Vort что с пир тест? не знаю, где это читать
onon Я прочитал, но ничего не понял...
Vort я ж только на этом канале сижу
Vort firewalled - без адреса?
Vort "firewalled charlie"
orignal короче суть такая
orignal какая нибудь тупая обезьяна ставит у нас в конфиге ipv6=true
orignal при этом не имея его реально
orignal ну потому что тупая оезьяна или ослоеб
onon Или игдрасильщик?
orignal поскольку мы не знаем есть ли он у нас реально мы публикуем его в списке адресов с кодом 6
orignal для ygg свой код
orignal свой конфиг
orignal далее что происходит
orignal бобу приходит запрос на пир тест ipv6
orignal о выбирает чарли который поддерживает ipv6
orignal поскольку у макакаи в RI есть адрес с кодом 6 то может выбрать и ее
Vort так почему пир тест "обезьяны" не уберёт адрес нахрен?
Vort интродьюсеры поставит
orignal потому что у нее висит все время в состоянии testing
orignal обезьяна етественно никакой адрес не публикует
orignal она публикует только 6 и ключи
orignal в итоге пир тест приходит к обезьяне обезяна даже на него отвечает бобу
orignal а отослать алисе не может потому что у нее нет ipv6
orignal в результате дискуссии пришли к выводу
Vort меня давно беспокоил подобный вопрос
orignal что надо ставить флаг насчет пир теста только если статус не testing
Vort firewalled и нет нифига сети - это две разные вещи
orignal у нас два флага
orignal понимаешь нет сети ты не определишь
orignal дед наивно считал что у всех будет реальный ipv6
orignal но это не так
orignal из-за тупых хостеров впс многие используют нат
orignal и теперь вторая пробелма
orignal боб когд выбирает чарли он этот флаг не проверяет
Vort "<~orignal> понимаешь нет сети ты не определишь" - ни одного пакета по интерфейсу не пришло = нет сети
orignal это очвевидная бага
orignal Vort а если по локальной сети ходит?
Vort ну ни одной транспортной сессии не удалось установить значит
orignal именно
orignal так и предлаагается
orignal если сесии не устновишь то будет висеть в testing
Vort да уж, даже явные баги уже в очередь на исправление выстроились :/
Vort что про мьютексы в Transports скажешь?
Vort ну и про Expiring надо не забыть...
orignal чинить надо мьютексы
orignal expiring счас сделаю
Vort ок
orignal починил expiring
Vort хорошо
orignal счас займусь пиртестами
Vort а я попробую залатать m_Peers.find, уж очень интересно, повлияет ли это как-то заметно на показатели узла
orignal вряд ли
Vort хотя сейчас смотрю, там же ещё и ручной перебор есть
Vort так что ещё и m_Peers.end надо смотреть
orignal там надо блокировку всего итератора дела
Vort итератор портится если коллекцию где-то в другом месте поменять?
orignal ну не всегда конечно смотря в каком месте поменяли
orignal но в целом да может
orignal если ты обращение из разных тредов то надо мьютекс
Vort а я ведь один раз словил L узел на прокси после своих изменений. теперь понятно, почему
Vort потому что Transports::GetRandomPeer без блокировки
orignal вполне
Vort хотя.. есть она там, но не сразу. в общем, сейчас порассматриваю получше
onon В туннельных сообщениях бывает только два фрагмента?
orignal нет
orignal в основном два
orignal но бывает и 16 и 32
onon bool isFollowOnFragment = flag & 0x80, isLastFragment = true; это как работает?
onon Он в любом случае будет LastFragment, или нет?
orignal там сложнее
onon Не пинайте сильно, я не умею си, только учусь.
orignal естественно оно где то дальше может меняться
onon Ок, буду разбираться дальше.
orignal раньше запросы на построение тоннелей всегда были 3-х фрагментные
orignal и работало
orignal с этими адресами даже конь не валялся
Vort это про ipv6 ?
orignal неважно
orignal проверка этого флага
Vort получается и ipv4 пир тесты из-за этого могут быть глюченые?
orignal если адрес по каким то причинам не поддерживает
orignal буду думать как делать
orignal большой путь начинается с малого шага
orignal его то и закоммитил
Vort ага
Vort можешь про мьютексы подсказать?
Vort я думал, что что-то понимаю по результатам прошлых обсуждений
Vort но, похоже, не особо
Vort в каких случаях в i2pd используется std::unique_lock, а в каких std::lock_guard?
orignal не то сделал
orignal счас поправлю
orignal везде можно lock_guard
orignal но псих использовал unique_mutex
orignal потому что про lock gaurd не знал
Vort я так понял, unique_lock даёт возможность вручную менять блок
Vort а это наверно и не используется нигде
Vort но эта фича вроде как тратит кое какие ресурсы
Vort не то чтобы много, но всё же
Vort я запутался, думая, что их различие в разрешении рекурсивной блокировки. но нет
Vort для рекурсивной блокировки, похоже, надо сам мьютекс менять на std::recursive_mutex
Vort хотя лучше писать код так, чтобы этого не было нужно
Vort но я пока что втупую понатыкал lock`ов в Transports и вляпался в рекурсию
Vort теперь попробую с рекурсивным
Vort попробую сейчас на свой узел поставить кое-как наговняканую переделку блокировок в Transports :) ожидаю мега-фейл
orignal вот теперь сделал верно
Vort в общем, я тестирую свой коммит по поводу потокобезопасности, но, скорее всего, правильно переделать этот код будет сложно, а эффект от переделки будет малозаметным
Vort так что может стоит более явные баги ловить в первую очередь
orignal ну да
orignal но я посмотрю если ты про пиры
Vort там просто задница. или накрывать всё, как надо, и получать тормоза плюс необходимость рекурсивного мьютекса или конкретно переделывать алгоритмы, рискуя вляпаться в регрессию
Vort я покажу свой черновик на всякий случай. вливать это, конечно, не надо
orignal я знаю
orignal потому и хочу переделать
orignal значит что надо делать правильно?
orignal этот запрос асихнронно
orignal чтобы он возвращал future
orignal короче подумать надо
onon Vort, мне кажется, у меня не работают твои тесты. Ты у себя видел, чтобы туннель из состояния testfailed возвращался в established?
Vort onon: почему мои?
Vort видел, что возвращались. но редко. почему редко - надо разбираться
onon Похоже это теперь мои проблемы, твои новые тесты сломали мне логику.
Vort я пока что плохо понимаю, о каких конкретно изменениях сейчас речь
Vort вспоминаю, что недавно была добавлена обработка просрочки i2np сообщений. может, в этом дело?
onon С лосиными тестами я как делал, просто переставал их фейлить, так они и висели в test failed, данные туда переставали слаться, а тесты периодически отправлялись, через некоторое время туннель "оживал", я туда снова слал данные.
onon А твои тесты не хотят лезть в туннель, который не IsEstablished
Vort ну или мне кажется, плохо помню
onon Лось потом сделал, чтобы test failed приравнивались к Established, так я это просто убирал, а теперь нифига не работает.
onon У лосиных тестов, видимо было исключение, они в не IsEstablished отправлялись.
onon Так это Лось всё сломал...
onon1 Ещё мелкий баг, роутер, похоже не совсем правильно считает скорость транзита. Когда он является одновременно и выходной точкой сервиса и входной точкой клиента, показывает двойную скорость.
onon1 Я через него пустил 3мб/с он показывает 6мб/с
orignal ну так поправль
orignal так и должен показывать
orignal он же просто считает пакеты
orignal а так да это следует поправить