~AreEnn
~AreEnn_
~R4SAS
~acetone
~orignal
~villain
&N00B
+Xeha
Guest58423
Guest7184
Leopold
Most2
Nausicaa
Nikat
Opax
Vasservate
Vort
`
anon3
b3t4f4c3
fidoid
i
karamba_i2p
lolwut
nemiga
not_bob_afk
poriori
profetikla
qend
segfault
soos
teeth
uis
un
user
whothefuckami
woodwose
orignal
отвечаю по порядку
orignal
разным пиздаболам: нигде речь не шла о сбросе на диск под мьютеркаов
orignal
Vort как думаешь сколько миллисекнуд занимает полный проход по такому списку?
orignal
запись на диск делается в отдельном треде с собственной копией роутеров
Vort
orignal: какой такой проход? со сбросом на диск изменённых RI? так это смотря сколько поменялось. но, думаю, где-то секунду надо на это
orignal
нет просто пройти во всем ротуреам и скопировать буфера
Vort
это выходит скопировать 10 мегабайт данных. из памяти в память. провёл сейчас бенчмарк через AIDA, получил скорость памяти 10 GB/s
Vort
выходит, несколько миллисекунд должно занять
orignal
ну там еще и 10 тс раз надо мьютекс заблокировать азблокирвать
orignal
чего однозначено нет так это записи на диск под мьютексом но копирование есть
orignal
кстати надо будет посмотреть на предмет чтения
Vort
так если этот процесс не будет ничего блокировать, то точное значение нагрузки не так уж важно
orignal
вот проход под 10 тыс там постояно этот мьютекс блокирется
orignal
а вот чтение просто возможно прямо из треда
orignal
надо глянуть
orignal
например на пир тесте
Vort
по сравнению с самим сбросом, который может занимать до нескольких секунд, простое копирование - это мелочь
Vort
тем более, это раз в минуту. тут хоть 1мс, хоть 10мс - пофигу. вот 100мс уже многовато, но тоже терпимо
orignal
так а если чтение
orignal
может ли оно подсивать налолго?
orignal
даже еслти раз в минуту у тебя же как раз тогда и просиходит хрень с очередью
orignal
вопрос второй
orignal
сколько будет дполнительного оверхеда если доваить мьютекс в каждый RouterInfo
Vort
тогда я плохо понимаю, что ты пытаешься сделать. чисто копирование SSU2 треду не помешает
orignal
итак
orignal
раз в минуту собираются буффера которые надо сборосить на диск
orignal
копирование буфера происходит под мьютексом
Vort
насчёт чтения - как повезёт. в винде обычно только первый раз если. в линуксе, насколько помню, чтения "реальные", то есть подвисать будет всегда. но я давно проверял
orignal
SSU2 иногда вставляет роутеры под тем же самым мьютексом
taureg
😶🌫️️
taureg
а чо ш2з не сразу кидает все на диск?
taureg
разве
orignal
в результате тред SSU2 будет ждать когда мьютекс совободится
orignal
конечно нет
orignal
это было бы глупостью
Vort
"<~orignal> копирование буфера происходит под мьютексом" в смысле, сейчас так сделано или так хочешь сделать?
Vort
секундные лаги просто быть от копирования буферов не могут. поэтому я не понимаю ситуации
orignal
явчера смотрел где мьютексы
orignal
и сейчас так сделано
Vort
а прямого доступа к диску, в обход функций сброса, в SSU2 треде нету?
Vort
а профили влиять не могут?
Vort
похоже, что надо дальше лаги изучать. тут что-то не сходится
orignal
если есть то только чтение
orignal
вот оно может быть
orignal
профили тоже в памяти и сброс на диск отдбено
Vort
где там чтение? надо туда измерение времени вкорячить
orignal
в пиртесте как минимум
Vort
в обработке чужих запросов?
Vort
функцию скажи, поставлю туда измерительный код
orignal
auto r = i2p::data::netdb.FindRouter (GetRemoteIdentity ()->GetIdentHash ());
orignal
if (r && (r->IsUnreachable () || !i2p::data::netdb.PopulateRouterInfoBuffer (r))) r = nullptr;
orignal
нввскидку
orignal
PopulateRouterInfoBuffer
orignal
а там вот такое вот
orignal
return r->LoadBuffer (m_Storage.Path (r->GetIdentHashBase64 ()));
taureg
мудрый ш2з и вася
Vort
а интродьюсеры?
orignal
расчет был на то что как правило буфер есть в памяти
orignal
ну надо смотреть на фукрция начинабщиеся с Relay
Vort
в HandleRelayRequest тоже вижу PopulateRouterInfoBuffer
orignal
вот она может порождать тормоза
Vort
сейчас вставлю логирование
orignal
прямо скажем неприятная штука
orignal
тут надо думать что с этим делать
Vort
ну для начала я постараюсь найти подтверждение
orignal
так в любом случае дисковая операция посреди потока это гадость
Vort
я вот две вещи думаю
orignal
самое простое
Vort
1. насколько это могло вредить во время атак
orignal
если с ротуром есть сессия то буфер не дропать
Vort
2. насколько это мешает узлам с ещё более медленным железом, чем у меня
orignal
особенно телефоны с сдкартойц
Vort
по поводу скорости дисковых операций в винде: если диск чем-то сильно занят, то операции могут ждать секунды. а если ещё приоритет вдруг у процесса низкий, так вообще минуты
Vort
меня uTorrent так задолобал, что я ему минимальный приоритет поставил. и вот когда другие процессы требуют диск, то uTorrent ждёт. иногда по 10 минут
Vort
хм. или я логирование неправильно сделал, или в коде несколько причин. словил на тестовом узле лаг в 40мс, а логирование внутри PopulateRouterInfoBuffer не сработало
Vort
попробую ещё на основном узле, но, скорее всего, проблема где-то в другом месте
Vort
на основном узле ловушки из PopulateRouterInfoBuffer сработали, но пока что все чтения там быстрые
Vort
100-200 микросекунд
Vort
а вот лаги SSU2 потока до 50 миллисекунд вполне в наличии
Vort
сейчас главный вопрос в том, лаги по 10-50 мс - это мелкие версии многосекундных лагов или это отдельные механизмы
Vort
возникло у меня подозрение, что на винде медленных чтений RI может не быть вообще
Vort
мелкие файлы ведь в MFT хранятся, а эта структура, по-моему постоянно в памяти. ну или почти постоянно
Vort
хотя я думал, что там лимит в 4К, но нет, меньше. до 1К примерно. так что некоторые RI будут в MFT, а некоторые - нет
orignal
в общем возможны тормоза
orignal
в любом случае надо что то делать
orignal
а 10-50 миллисекнд я думаю просто копирование буферов
Vort
реальный лаг словить важнее, чем теоретический. попробую сейчас погонять
Vort
мелкие лаги по 10-20мс происходят намного чаще, чем сброс RI на диск
Vort
и, судя по распределению, это вполне может быть тот же самый процесс, который даёт секундные лаги
orignal
виндовый тот? а как это влияет на i2pd?
Vort
нее, тот скорее всего вообще не при чём. я вчера его перезапустил и через 2 минуты словил жирнющий лаг
Vort
я имею в виду механизм возникновения проблемы
orignal
если диск дерагет часто то вполне
Vort
я же говорю - я сделал логирование PopulateRouterInfoBuffer. связи с лагами вообще никакой не нашлось
Vort
может, где-то ещё диск используется. вот буду разбираться
DUHOVKIN
ВОРТ КРУТОЙ
DUHOVKIN
ОН МЕГАМОНСТР
DUHOVKIN
ПОКЛОНЯЙТЕСЬ ВРОТУ
Vort
orignal: в общем, механизма, похоже, таки два
Vort
пока я писал новый логгер, старый логгер вот такое словил:
Vort
NetDb::PopulateRouterInfoBuffer / LoadBuffer from SSU2 # 1 duration 2113800 us
Vort
я уже удалил код прошлого логгера, но, думаю, #1 - это из HandleRelayRequest
Vort
NetDb::PopulateRouterInfoBuffer / LoadBuffer from SSU2 # 3 duration 456792 us
Vort
# 3 из HandlePeerTest лезет реже
Vort
второй логгер тоже уже успел кое что наловить
Vort
мелкие лаги, 10-50мс лезут как из ProcessNextPacket, так и из m_LastSession->FlushData
Vort
так что с PopulateRouterInfoBuffer таки надо что-то делать. но это не всё, и жирные лаги (в том числе, секундные) есть где-то ещё
Vort
а вот и мега-лаг словился. наверно компиляция в Visual Studio "помогла" (она у меня отжирает почти все ресурсы)
Vort
SSU2: Received queue size 6086 exceeds max size2500
Vort
NetDb::PopulateRouterInfoBuffer / LoadBuffer from SSU2 # 1 duration 11651646 us
Vort
да уж. такое ощущение, что источники лагов в этом потоке везде. только что словил лаг на 434мс в SendQueue
Vort
профили, наверно, постоянно ещё читаются. дофига лагов идёт из SSU2Session::ProcessSessionConfirmed
Vort
подозрение на i2p::data::netdb.AddRouterInfo, в котором присутствует GetProfile
Vort
в общем, заканчиваю пока что тесты с выводом, что надо ещё чтение профилей проверить
orignal
отлично. значит таки чтение
orignal
да кстати GetProfile тоже может быть если подгужается с дикска
orignal
а вот SendQueue это инетреснее потому что там только шифрование и отпрвака
Vort
работа с пулами ещё, дропы (в которых хрен знает что)
Vort
на пулы подозрение слабое, правда. но кто знает
orignal
так в пулах вообще ничего нет
Vort
ну а в дропах я там видел мьютексы
orignal
дропы должны перекидывать на другой тред
Vort
насколько далеко они идут - не знаю
Vort
не всегда
orignal
вот давай дроп с мьютексом
Vort
ща
orignal
это чинить надо
Vort
github.com/PurpleI2P/i2pd/blob/4bb82110ab7ac47e2f27bd8efba1fecb35cbc1c4/libi2pd/TunnelPool.cpp#L428-L440
Vort
может, они и безобидные, не знаю
orignal
да тут стоит тоже продумать
orignal
по уму надо на треде Tunnles делать