~AreEnn
~R4SAS
~orignal
~villain
&N00B
+Xeha
+relaybot
DUHOVKIN
Guest18377
HackerMan
KabaOS
Most2
Nausicaa
Ruskoye_911
Spirit90
Trusishka
Vort
`
acetone_
anon3
b3t4f4c3
mittwerk
nemiga
not_bob_afk
plap
poriori_
profetikla
segfault
soos
teeth
tensor
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_
DHT
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
там надо блокировку всего итератора дела
orignal
ть
Vort
итератор портится если коллекцию где-то в другом месте поменять?
orignal
да
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
большой путь начинается с малого шага
orignal
его то и закоммитил
Vort
ага
Vort
можешь про мьютексы подсказать?
Vort
я думал, что что-то понимаю по результатам прошлых обсуждений
Vort
но, похоже, не особо
Vort
в каких случаях в i2pd используется std::unique_lock, а в каких std::lock_guard?
orignal
не то сделал
orignal
счас поправлю
orignal
везде можно lock_guard
orignal
но псих использовал unique_mutex
Vort
:(
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
Так это Лось всё сломал...
Vort
)
onon1
Ещё мелкий баг, роутер, похоже не совсем правильно считает скорость транзита. Когда он является одновременно и выходной точкой сервиса и входной точкой клиента, показывает двойную скорость.
onon1
Я через него пустил 3мб/с он показывает 6мб/с
orignal
ну так поправль
orignal
так и должен показывать
orignal
он же просто считает пакеты
orignal
а так да это следует поправить