наткнулся тут на Prophetic - штуку, которая пытается научить тебя управлять снами
суть такая: надеваешь девайс на голову перед сном, он через ультразвук влияет на активность мозга и повышает шанс словить осознанный сон
сейчас это выглядит как "прикольный гаджет для осознанных снов" (и честно, пока прям немного sci-fi), но мне больше интересен сам концепт
если такие штуки реально научатся достаточно точно влиять на состояние мозга, дальше открывается ОЧЕНЬ много всего - от сна до концентрации/памяти и тд
в общем слежу, очень интересно, куда это всё придёт
суть такая: надеваешь девайс на голову перед сном, он через ультразвук влияет на активность мозга и повышает шанс словить осознанный сон
сейчас это выглядит как "прикольный гаджет для осознанных снов" (и честно, пока прям немного sci-fi), но мне больше интересен сам концепт
если такие штуки реально научатся достаточно точно влиять на состояние мозга, дальше открывается ОЧЕНЬ много всего - от сна до концентрации/памяти и тд
в общем слежу, очень интересно, куда это всё придёт
❤2
march comes in like a lion
тайтл про то, как чел в 17 вытаскивает себя из ямы через доску 9x9
кирияма рей стал профи по сёги в 15
он живёт один в токио, ест что попало, в школу ходит через раз, а родителей и сестру потерял в аварии. под своё крыло его взял знакомый отца, тоже игрок, и рей в итоге сломал жизнь двум его друзьям - просто потому что оказался сильнее за доской
вот с этим он и живёт: каждая его победа это разрушенная жизнь человека за доской напротив
депрессия тут скорее как путь и борьба, а не как картинка с грустным парнем под дождём. рей просыпается и не понимает зачем. садится играть и плывёт, потому что в голове шум, ему буквально нечем ходить. SHAFT просто заливает комнату водой, изображая безысходность. гг тонет и нет ни одной реплики. cinema)
вытаскивают его две вещи: сёстры кавамото, которые живут у реки и просто кормят его лапшой и сладостями, вайбят с набэ на котацу и подбадривают. и сама игра
игра в сёги тут показана как скучная работа, без криков и спортивной драмы: разобрать партию ночью, проиграть симаде, который старше лет на пятнадцать и играет с убитым желудком
и сесть считать, где именно ты поплыл. никакого момента озарения нет, есть 10000 часов за доской и человек, который каждый раз заставляет себя становится лучше
и вот название
так у англичан говорят про март: приходит львом, уходит ягнёнком (в начале месяца ещё бьётся зима, ветер и холод, а к концу уже тихая тёплая весна)
в японии март это ещё и конец учебного года, выпускные, все куда-то уезжают. сёстры живут в сангацу-тё ("мартовский квартал")
а рей всю дорогу пытается быть львом, хотя по факту он ягнёнок, которого трясёт, и весь тайтл про то, как он перестаёт себя за это корить
так как, в большинстве своём, я заларпил кирияму в своё время, то не мог обойти стороной столь жизненного для меня персонажа
тайтл про то, как чел в 17 вытаскивает себя из ямы через доску 9x9
кирияма рей стал профи по сёги в 15
он живёт один в токио, ест что попало, в школу ходит через раз, а родителей и сестру потерял в аварии. под своё крыло его взял знакомый отца, тоже игрок, и рей в итоге сломал жизнь двум его друзьям - просто потому что оказался сильнее за доской
вот с этим он и живёт: каждая его победа это разрушенная жизнь человека за доской напротив
депрессия тут скорее как путь и борьба, а не как картинка с грустным парнем под дождём. рей просыпается и не понимает зачем. садится играть и плывёт, потому что в голове шум, ему буквально нечем ходить. SHAFT просто заливает комнату водой, изображая безысходность. гг тонет и нет ни одной реплики. cinema)
вытаскивают его две вещи: сёстры кавамото, которые живут у реки и просто кормят его лапшой и сладостями, вайбят с набэ на котацу и подбадривают. и сама игра
игра в сёги тут показана как скучная работа, без криков и спортивной драмы: разобрать партию ночью, проиграть симаде, который старше лет на пятнадцать и играет с убитым желудком
и сесть считать, где именно ты поплыл. никакого момента озарения нет, есть 10000 часов за доской и человек, который каждый раз заставляет себя становится лучше
и вот название
march comes in like a lion, goes out like a lamb
так у англичан говорят про март: приходит львом, уходит ягнёнком (в начале месяца ещё бьётся зима, ветер и холод, а к концу уже тихая тёплая весна)
в японии март это ещё и конец учебного года, выпускные, все куда-то уезжают. сёстры живут в сангацу-тё ("мартовский квартал")
а рей всю дорогу пытается быть львом, хотя по факту он ягнёнок, которого трясёт, и весь тайтл про то, как он перестаёт себя за это корить
так как, в большинстве своём, я заларпил кирияму в своё время, то не мог обойти стороной столь жизненного для меня персонажа
❤2 2 2 1
сколько стоит указатель [кейс discord на Go 1.27.1]
одни и те же 10 млн записей в Go стоят сборщику мусора то 1,2 мс, то почти секунду разметки на каждую сборку
всё упирается в то, как данные разложены в куче.
но размер кучи цену почти не предсказывает - важнее, сколько внутри объектов и указателей.
— введение в домен
LRU-кэш - кэш с лимитом: когда он полон, выкидывается запись, которую дольше всех не трогали.
обычно это map + двусвязный список, то есть на каждую запись несколько объектов и указателей между ними.
сборщик ищет живые объекты так: идёт от стеков горутин и глобальных переменных по указателям и помечает всё, до чего дошёл (mark).
объект без указателей в типе (noscan) он помечает, но внутрь не заглядывает, сколько бы мегабайт там ни лежало.
— в 2020 discord переписали сервис Read States с Go на Rust
у них раз в две минуты был спайк CPU и задержки.
сервис держал LRU-кэш на миллионы записей и почти не аллоцировал, так что сборки запускал сам рантайм по времени.
если больше двух минут без сборки, то значит запускается принудительная и каждой такой сборке, по их словам, приходилось сканировать весь кэш.
это правило (forcegcperiod), кстати, живёт до сих пор, в Go 1.27.1 (те же две минуты)
— что я проверил на Go 1.27.1
10 млн записей
как был устроен кэш у discord, они не публиковали, поэтому первая строка - моя модель LRU, как его обычно пишут
mark - разметка одной сборки по времени, медиана трёх прогонов, кэш синтетический, без запросов и вытеснения
[i7-6700, Linux, GOMAXPROCS=8]
с Go 1.26 по умолчанию включён Green Tea GC, он сканирует мелкие объекты пачками по страницам памяти,
так что это ни разу не воспроизведение discord
я проверял, жив ли эффект на современном рантайме
спойлер, жив: Green Tea помогает (и с выключенным тот же LRU размечался за 2,7 секунд)
— сравни вторую и последнюю строку
441 MB и 426 MB - памяти почти поровну, а разметка 515 мс против 1,2 мс.
во второй 10 млн отдельных объектов, и сборщик бегает за каждым по указателю.
в последней указателей ноль, значения лежат прямо в map, и вся эта память noscan
третья строка - ловушка:
— почти секунда при этом не секунда простоя
STW-паузы меньше 0,1 мс, разметка идёт в фоне на ~2 CPU из 8, но под нагрузкой эти CPU делились бы с запросами,
а аллоцирующие горутины рантайм заставлял бы помогать разметке (mark assist) - вот и задержки
— подробно всё на странице замера
• почему у каждой строки столько объектов и что там с третьей;
• что с этим делать: значение вместо указателя, ключ числом, связи через индексы;
• как затестить у себя через
• методика, рост с размером кэша, графики, код, логи и словарик всех терминов;
тык
одни и те же 10 млн записей в Go стоят сборщику мусора то 1,2 мс, то почти секунду разметки на каждую сборку
всё упирается в то, как данные разложены в куче.
но размер кучи цену почти не предсказывает - важнее, сколько внутри объектов и указателей.
— введение в домен
LRU-кэш - кэш с лимитом: когда он полон, выкидывается запись, которую дольше всех не трогали.
обычно это map + двусвязный список, то есть на каждую запись несколько объектов и указателей между ними.
сборщик ищет живые объекты так: идёт от стеков горутин и глобальных переменных по указателям и помечает всё, до чего дошёл (mark).
объект без указателей в типе (noscan) он помечает, но внутрь не заглядывает, сколько бы мегабайт там ни лежало.
— в 2020 discord переписали сервис Read States с Go на Rust
у них раз в две минуты был спайк CPU и задержки.
сервис держал LRU-кэш на миллионы записей и почти не аллоцировал, так что сборки запускал сам рантайм по времени.
если больше двух минут без сборки, то значит запускается принудительная и каждой такой сборке, по их словам, приходилось сканировать весь кэш.
это правило (forcegcperiod), кстати, живёт до сих пор, в Go 1.27.1 (те же две минуты)
— что я проверил на Go 1.27.1
10 млн записей
ReadState (два числа, 16 байт) в четырёх раскладках, каждая следующая убирает один источник указателей.как был устроен кэш у discord, они не публиковали, поэтому первая строка - моя модель LRU, как его обычно пишут
объекты хип mark
LRU на указателях 25 млн 1,1 GB 974 мс
map[uint64]*ReadState 10 млн 441 MB 515 мс
map[string]ReadState 5 млн 716 MB 364 мс
map[uint64]ReadState 33 тыс. 426 MB 1,2 мс
mark - разметка одной сборки по времени, медиана трёх прогонов, кэш синтетический, без запросов и вытеснения
[i7-6700, Linux, GOMAXPROCS=8]
с Go 1.26 по умолчанию включён Green Tea GC, он сканирует мелкие объекты пачками по страницам памяти,
так что это ни разу не воспроизведение discord
я проверял, жив ли эффект на современном рантайме
спойлер, жив: Green Tea помогает (и с выключенным тот же LRU размечался за 2,7 секунд)
— сравни вторую и последнюю строку
441 MB и 426 MB - памяти почти поровну, а разметка 515 мс против 1,2 мс.
во второй 10 млн отдельных объектов, и сборщик бегает за каждым по указателю.
в последней указателей ноль, значения лежат прямо в map, и вся эта память noscan
третья строка - ловушка:
* в коде нет, а указатели естьstring внутри это указатель на байты, и такие же прячутся в слайсах, map, any, time.Time— почти секунда при этом не секунда простоя
STW-паузы меньше 0,1 мс, разметка идёт в фоне на ~2 CPU из 8, но под нагрузкой эти CPU делились бы с запросами,
а аллоцирующие горутины рантайм заставлял бы помогать разметке (mark assist) - вот и задержки
— подробно всё на странице замера
• почему у каждой строки столько объектов и что там с третьей;
• что с этим делать: значение вместо указателя, ключ числом, связи через индексы;
• как затестить у себя через
runtime/metrics, pprof и gctrace;• методика, рост с размером кэша, графики, код, логи и словарик всех терминов;
тык
go.faustze.tech
Сколько стоит указатель · замер 001
Кейс discord на Go 1.27.1: сколько времени сборщик мусора тратит на кэш из 10 млн записей с указателями и без, и как хранить такие данные дешевле.