Geek & StackBlitzed
Привет, глянул тут на новый асинхронный рантайм для Rust, который обещают на 10% снизить накладные расходы event loop’а. Ты случайно не видел его исходники? Там одна сплошная микрооптимизация, автоматы состояний, без всякой магии – прямо код, шестнадцатеричные числа и немного атомарных операций. Интересно, действительно он быстрее async-std или просто компилятор обманывает. Как считаешь?
Я пробежался по нему ночью, когда уже третий час. Машина состояний хороша, но атомарные операции все еще душат производительность. async‑std неплохо это маскирует, поэтому я не уверен, что этот прирост в 10% оправдывает себя в реальных сценариях. Зато работа с шестнадцатеричными данными – просто класс, если тебе это по душе. Ты тестировал под нагрузкой или просто делал микро-бенчмарки?
Привет,
Я быстро проверил нагрузкой на VM с четырьмя ядрами и TCP-прокси, который выдает скачки нагрузки. Микро-тесты выглядели отлично, но при постоянной нагрузке в 5 тысяч запросов в секунду начали проявляться блокировки, и победа сократилась процентов до 4, а в некоторых случаях даже уступала async-std. Но код на низком уровне чистый – никаких скрытых коллбэков, просто самописный автомат состояний, читать который одно удовольствие, как старый добрый туториал по ассемблеру. Отлично для экспериментов, но для продакшена я бы все равно рекомендовал использовать более высокоуровневые рантаймы, если ты не готов сам разбираться с lock-free структурами данных.
Звучит логично – эти атомарные блоки попадают в ту зону, где магия заканчивается. Я за чистый, ручной state machine, но если ты не готов всю ночь писать lock-free очередь, лучше придерживайся проверенных runtime-ов. Код – приличная песочница, но реальный трафик любит грызть одни и те же шаблоны. Посмотрел уже какие-нибудь другие low-latency фреймворки?
Да, глянул я на Folly’s F14 или порт LMAX Disruptor на C++. Всё там завязано на минимизацию блокировок, но осваивать сложно, и всё равно приходится плясать с атомарными операциями. Пока что буду держаться проверенного и надежного, но тестовый код держит интерес — как головоломка, от которой не оторваться. А у тебя что для ультра-низкой задержки самое любимое?
Обычно я собираю небольшой кольцевой буфер на C, использую 64-битные атомарные операции для указателей головы и хвоста, и подаю это в однопоточный цикл обработки событий, использующий epoll или io_uring. Никаких навороченных фреймворков, просто плотный автомат состояний и куча ассемблера для критических участков кода. Если тебе нужна дополнительная страховка, могу добавить потокобезопасную очередь из LMAX, но только после того, как внимательно изучу её исходники и убежусь, что барьеры памяти находятся там, где я ожидаю. Так задержка минимальная, а мозг работает. А ты io_uring с конвейером без копирования уже пробовал?