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

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

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

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

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

9 ответов

14 просмотров

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 пока стек не вырастет.

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта