170 похожих чатов

@Antoshkka Антон, привет! Смотрю Pure Virtual Cast, где есть про ваш

userver.
https://www.youtube.com/watch?v=3tKg2fiiaD0

Как вы решаете проблемы stack overflow в stackfull корутинах (aka fibers)? Ведь есть очень мелкие (нужен маленький стек), а есть большие, которым нужен нормальный стек. Можно ли рассчитывать, что даже если корутина аллоцриует большой стек (1МБ скажем), то виртуальная память будет выделять страницы памяти по 4кб и таким образом маленькие корутины физически будут потреблять только 4 кб?

Пишу тут, т.к. может другим тоже будет интересно.

9 ответов

12 просмотров

https://www.boost.org/doc/libs/1_75_0/libs/coroutine2/doc/html/coroutine2/coroutine.html#coroutine2.coroutine.segmented_stack

Dmitry-Khominich Автор вопроса
magras
https://www.boost.org/doc/libs/1_75_0/libs/corouti...

userver не использует segmented stack, судя по диалогу в видео

Guard pages в конце/начале стека (приблизительно то же самое делает и ваша ОС при создании нового стека для потока) + тесты с санитайзерами (то же самое вы делаете, когда тестируете свой обычный код на работоспособность и "невыжирание" всего стека)

Dmitry-Khominich Автор вопроса
🐙 Antony Polukhin
Guard pages в конце/начале стека (приблизительно т...

Спасибо за ответ! Ну а в плане потребления памяти? Если на каждый чих создавать по файберу, то никакой памяти не хватит..

Dmitry Khominich
Спасибо за ответ! Ну а в плане потребления памяти?...

Тут тоже всё как и в обычном коде: разработчики следят, чтобы ресурсы не убежали. Вообще всё не так страшно: допустим у вас 100к RPS, 1 запрос обрабатываете за жуткие 100ms, на корутину допустим по умолчанию тратится 200KB. Итого, единовременно вам нужно 100к*0.1*200k == 2GB . Запросы обрабатываются за 10ms? Тогда вам понадобится 200MB под корутины

Dmitry-Khominich Автор вопроса
🐙 Antony Polukhin
Тут тоже всё как и в обычном коде: разработчики сл...

Последний вопрос. Что с дебагом? Есть ли у вас инструментарий, чтобы проанализировать стек каждой корутины? Например ситуация, корутины задедлочились и все потоки висят на шедулере. Полезно будет найти незаверешнные корутины и распечатать их стек вызовов. folly::fibers вроде как так может: https://github.com/facebook/folly/tree/master/folly/fibers#gdb-integration

Dmitry Khominich
Последний вопрос. Что с дебагом? Есть ли у вас инс...

Да, у нас что-то было для gdb, но мы этим уже давно не пользовались - часть ошибок отлавливают сами примитивы, ну и много высокоуровневых вещей, из-за чего с низкоуровневыми компонентами редко сталкиваешься. Например если нужно кеширование данных из PostgreSQL - пишется запрос, пара настроек, и после этого все данные получаются через deps.pg_cache_.Get(key);

А при чем тут виртуальная память?

Dmitry-Khominich Автор вопроса
Ilya Zviagin
А при чем тут виртуальная память?

То что функция malloc(100500) в linux выделяет только виртуальное адресное пространство, но не маппит вирутальных адрес в физический на плашке RAM. Маппинг происходит при первом обращении к адресу памяти (прерывание page fault, вроде). Поэтому я и предположил что если даже выделять для файбера большой стек, то на самом деле это не приведет к потреблению лишней памяти RAM пока стек не вырастет.

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
3
Карта сайта