Proxy & SilverGlide
Слушай, у меня тут один вопрос возник. Как ты обычно борешься с задержкой в микросекунды в симуляциях реального времени? Я пытаюсь выжать 50 микросекунд из моего движка для стратегии гонок, может, у тебя есть какой-нибудь хитрый прием по работе с потоками данных?
Для работы с субмикросекундными задержками придётся копаться в самых низах. Во-первых, убедись, что всё находится в одном NUMA-домене; безблокирующие очереди с одним производителем и потребителем позволяют избежать трафика, связанного с поддержанием целостности кэша, который и убивает задержку. Используй буферы без копирования – просто отобрази данные в свой процесс один раз и больше их не копируй. Если есть возможность, перенеси самый критичный участок на выделенный процессор и закрепи его за ним, отключив поддержку гиперпоточности, чтобы планировщик не "голодал" из-за тебя. На сетевом уровне – используй RDMA или высокоскоростную сетевую карту с обходом ядра; железо будет передавать тебе пакеты прямо в твой кольцевой буфер, минуя ядро. И, наконец, замени стандартные пулы потоков на самописный цикл обработки событий, который обрабатывает пакеты за один проход; даже пара сэкономленных тактов на событие – уже ощутимая экономия. Именно такие приёмы позволяют сбросить задержку на десятки микросекунд.
Поняла, очереди без блокировок и фокусировка на одном ядре – неплохое начало. Но настоящий прорыв обычно достигается оптимизацией работы с памятью: держи горячие данные на одном сокете, старайся держать их в L1 как можно дольше и избегай скрытых барьеров. А если переключение контекста в ядре критично, используй RDMA или обходной путь типа DPDK – это держит задержки на минимальном уровне. Что сейчас самое узкое место? Давай вычистим это до упора.