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

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

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

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

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

9 ответов

6 просмотров

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

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

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

Вопрос по диагностике ошибок (я знаю в чем, в данном конкретном примере, я знаю, как исправить, пример модельный, понятно, что в реальности бывает намного запутаннее). module...
ⰄⰎⰋⰐⰐⰑⰛⰤⰧⰧⰩⰄ ⰊⰑⰁⰓⰡⰛⰦⰕⰫ
10
Тут кста кто-нибудь NeoVim использует?
Simple Sorcerer
13
А чем вам питонисты не угодили?😂
.
79
Есть какой-нибудь для Delphi/FPC T*Compression(Decompression)Stream на базе LZ4/Zstd/любой другой быстрый(и хорошо сжимающий) алгоритм А ещё лучше в pure pascal А ещё лучше од...
notme
52
А дальше что?.. Записать в файл, потом в Код?.. И потом разбирать как-то?..
Хаскель Моисеевич Гопник
14
доброго времени. db, dw и прочие исполняются при трансляции или при выполнении программы?
lutayyy
10
Почему никто не подсказал, что можно объявить свои типы данных, в которых меньше полей, чем в отданном джейсоне, и добавлять их по необходимости?
Strange Rabbit
10
Хтось використовував Vapor на Windows?
Jaroshevskii
15
type TObj = object procedure Init; virtual; end; TObj1 = object(TObj) procedure Init; override; end; procedure TObj1.Init; begin inherited; end; procedur...
Alexander 👋
29
Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
86
Карта сайта