для каждой таски tokio, верно? Дефолтный размер стека в linux x64 – 8 мегабайт. То есть, если у меня 8-ядерный процессор, дефолтная многопоточная среда исполнения tokio выделит мне 8*8*1024*1024 = 67108864 байта стека суммарно.
Допустим, я пишу асинхронный игровой сервер, который должен одновременно обрабатывать тысячи соединений, и для каждого соединения создаю буфер чтения таким образом:
let buf = [0u8; 65536]; (я так понимаю, локальная память таким образом размещается на стеке)
Значит ли это, что 1024 соединения (67108864 / 65536 = 1024) автоматически крашнут мой сервер со stack overflow?
Как от этого лучше защититься? Выделять память на куче? Всё рассчитать и увеличить размер стэка? Читать данные буферами меньших размеров? Какой подход лучше?
Так память под стек заранее выделяется же
У каждой таски заспавненной есть свой стек, если я правильно помню. А если ты футуры собираешь в какой-нибудь FuturesUnordered, то в стек не влезет, угу
Где можно уточнить, что у каждой таски свой стек? Звучит странно. 🤔
Ну я почему-то посчитал, что футура после tokio::spawn утаскивается в свой стек
Обсуждают сегодня