AMD's EPYC 9355P: Inside a 32 Core Zen 5 Server Chip
AMD представила серверный процессор EPYC 9355P на архитектуре Zen 5 с 32 ядрами, который фокусируется не на максимальном количестве ядер, а на повышении производительности каждого из них. Чип работает на частоте до 4,4 ГГц, что выше, чем у моделей с 128 или 192 ядрами (3,7–4,1 ГГц). Для размещения ядер используются восемь кристаллов (CCD), в каждом из которых активировано только четыре из восьми физических ядер, но доступен полный объём кэша L3 — 32 МБ на CCD. Это обеспечивает высокое соотношение кэш-памяти к количеству ядер. Кроме того, каждый CCD подключён к IO-чипу через два канала GMI-Wide, что даёт 64 байта/цикл пропускной способности в каждом направлении и полностью использует возможности IO-чипа.
Система Dell PowerEdge R6715 с этим процессором и 768 ГБ DDR5-5200 демонстрирует теоретическую пропускную способность памяти около 500 ГБ/с. В режиме NPS1 запросы к памяти распределяются по всем 12 контроллерам, обеспечивая единое адресное пространство, но с несколько повышенной задержкой по сравнению с десктопными решениями, например Ryzen 9 9900X. Задержка DRAM в этом режиме немного лучше, чем у Intel Xeon 6 в конфигурации SNC3. Архитектура серверных чипов AMD, с необходимостью связывать множество компонентов через Infinity Fabric, закономерно приводит к более высокой латентности, но кэш-производительность Zen 5 в серверном и десктопном вариантах схожа, отличаясь в основном из-за разницы в тактовых частотах.
Комментарии (31)
- Обсуждаются технические характеристики серверных процессоров AMD EPYC: 768 ГБ оперативной памяти DDR5-5200, 12 контроллеров памяти и высокая пропускная способность.
- Участники делятся опытом использования больших объемов RAM в качестве диска (RAM disk) для ускорения сборки проектов и запуска моделей ИИ.
- Ведутся споры о влиянии архитектуры NUMA на производительность и о том, стоит ли оптимизировать код под нее в рамках одного сокета.
- Обсуждаются возможные опечатки в спецификациях и корректность работы программы счетчика (program counter) в архитектуре EPYC.
- Сравнивается заявленная пропускная способность памяти с другими системами (например, Apple M1 Ultra) и обсуждаются перспективы её роста.
Optimizing ClickHouse for Intel's 280 core processors
Оптимизация ClickHouse для процессоров Intel с ультра-высоким числом ядер
Авторы: Цзебин Сань, Чжиго Чжоу, Ваньян Го, Тьянью Ли
Гостевой пост от инженеров по оптимизации производительности из Intel Shanghai.
Современные процессоры Intel достигают беспрецедентного числа ядер: до 128 P-ядер на сокет в Granite Rapids и 288 E-ядер в Sierra Forest. Многосокетные системы могут иметь более 400 ядер. Тенденция «больше ядер, а не выше тактовая частота» обусловлена физическими ограничениями и проблемами энергопотребления.
Для аналитических баз данных, таких как ClickHouse, большое количество ядер представляет как возможность, так и сложную задачу. Хотя теоретически больше ядер означают больше параллельной мощности, большинство СУБД не могут полностью использовать аппаратные ресурсы. Проблемы параллельной обработки, такие как конфликты блокировок, когерентность кэша, неоднородный доступ к памяти (NUMA), пропускная способность памяти и накладные расходы на координацию, усугубляются с ростом числа ядер.
Оптимизация для ультра-высокого числа ядер
За последние три года мы анализировали и оптимизировали масштабируемость ClickHouse на процессорах Intel Xeon с большим числом ядер. С помощью инструментов профилирования (perf, emon, Intel VTune) мы исследовали все 43 запроса ClickBench на серверах с ультра-высоким числом ядер, выявляли узкие места и оптимизировали ClickHouse.
Результаты впечатляют: отдельные оптимизации ускоряют выполнение запросов в несколько раз, в некоторых случаях до 10x. Среднее геометрическое время выполнения всех запросов стабильно улучшалось на 2–10% для каждой оптимизации. Это демонстрирует, что ClickHouse можно эффективно масштабировать на системах с ультра-высоким числом ядер.
Ключевые проблемы масштабирования
Помимо производительности одного ядра, необходимо решить несколько ключевых задач:
- Накладные расходы когерентности кэша: Перемещение строк кэша между ядрами требует циклов CPU.
- Конфликты блокировок: Даже небольшие последовательные участки кода (1%) сильно ограничивают параллелизм по закону Амдала.
- Пропускная способность памяти: Эффективное использование памяти критично для систем с интенсивной работой с данными.
- Координация потоков: Стоимость синхронизации потоков растет сверхлинейно с их количеством.
- Эффекты NUMA: Задержки и пропускная способность памяти различаются для локальной и удаленной памяти в многосокетных системах.
В этом посте summarized наши оптимизации ClickHouse для серверов с ультра-высоким числом ядер.
Комментарии (46)
- Исправление опечатки в заголовке: речь идёт о 288-ядерных серверных процессорах Intel Sierra Forest, а не о "Intel 280".
- Оптимизация ClickHouse под высокоядорные системы: улучшение аллокаторов памяти, борьба с конкуренцией, использование SIMD-фильтрации (ускорение запросов до 35%).
- Обсуждение технических деталей процессоров: отсутствие AVX-512 на E-ядрах Sierra Forest, наличие AVX2 VNNI, сравнение с AMD Zen 4c.
- Проблемы масштабирования: сложности NUMA, contention points на уровне аллокаторов, разделение полосы пропускания памяти.
- Практический опыт использования ClickHouse: высокая эффективность сжатия и скорость агрегации больших данных (миллиарды снэпшотов).
- Критика и предложения: переход с jemalloc на современные аллокаторы (TCMalloc, mimalloc), использование оптимистичного контроля параллелизма.
- Исторический и футуристический контекст: сравнение с устаревшими системами, шутки о запуске 1000 виртуальных машин и размещении целого стойка в одном процессоре.
Комментарии (59)
- CXL — это стандарт расширения памяти по PCIe: позволяет добавлять сотни гигабайт/терабайт ОЗУ вне материнки, сохраняя когерентность кэшей.
- Задержка ~200 нс, в ~100 раз выше обычной ОЗУ, но в ~100 раз ниже NVMe; пропускная способность PCIe 5.0 всё ещё высока.
- Первые «доступные» карты (Gigabyte 512 ГБ) уже продаются, но цена и совместимость пока неясны; требуются CPU и материнка с CXL-поддержкой.
- Linux/Windows видит память без специальных драйверов, но для эффективного использования нужно перепроектировать алгоритмы (NUMA, tiering).
- Основные плюсы: дешёвое расширение старой DDR4, shared-memory кластеры, быстрый обмен GPU↔CXL без копирования в основную ОЗУ.
Io_uring, kTLS and Rust for zero syscall HTTPS server 🔥 Горячее
- История: от pre-fork до
epoll— каждый шаг уменьшал сисколлы, но они всё ещё оставались узким местом. - io_uring — кольцевые очереди в памяти: сервер пишет команды, ядро асинхронно их выполняет и кладёт результат обратно. При высокой нагрузке
straceне покажет ни одного сисколла. - 1 поток = 1 ядро без разделяемых структур; память берётся только из локального NUMA-узла.
- Память: заранее выделяем фиксированный буфер на соединение — без
brk/mmap, без фрагментации. - kTLS — после рукопожатия шифрование переходит в ядро. Плюсы:
- Работает
sendfile, данные не копируются в userspace. - Возможно аппаратное ускорение NIC.
- Работает
Комментарии (137)
- io_uring даёт «zero-syscall» при высокой нагрузке, но требует ручного управления памятью: безопасность не обеспечивается ни borrow checker, ни runtime.
- На большинстве облачных платформ io_uring выключен по умолчанию, поэтому остаётся нишевым.
- Автор статьи сначала чистит код, а потом будет мерить производительность — что вызвало одобрение читателей.
- Обсуждаются альтернативы: epoll, kTLS, DPDK, eBPF, а также споры «один поток на ядро» vs oversubscription.
- Некоторые считают, что сложность io_uring и async Rust — цена за неспособность ОС ускорить syscalls без нарушения обратной совместимости.
Without the futex, it's futile 🔥 Горячее
Без futex всё тленно
Книга The Art of Multiprocessor Programming (2-е изд., 2021) считается канонической, но она обходит стороной futex — ключевой примитив современной многопоточности. Это упущение делает пособие бесполезным для практиков.
Futex ≠ mutex
Название происходит от «fast userspace mutex», но futex — это не мьютекс, а основа для всех высокоэффективных примитивов синхронизации. До него всё строилось на громоздких System V IPC, которые не масштабировались: при 1000 потоков futex в 2002-м оказался в 20–120 раз быстрее sysv-блокировок. Windows и macOS добавили аналоги только в 2012 и 2016 гг.
Суть futex
Он разделяет блокировку и ожидание/пробуждение:
- В user-space проверяем состояние; если свободно — захватываем без системного вызова.
- При конфликте вызываем
futex_wait(addr, expected), засыпаем в ядре на конкретном адресе. - Пробуждение —
futex_wake(addr, n), гдеnобычно 1 или «все».
Передаваемое в wait значение защищает от «просыпания» после уже случившегося события: если память изменилась, системный вызов мгновенно возвращает ошибку.
Такой подход убирает лишние системные вызовы и позволяет строить быстрые мьютексы, rw-lock’и, семафоры и пр. без поллинга и экспоненциальных бэкоффов.
Итог
Любая современная библиотека (pthreads, C++ std::mutex, Rust std::sync) опирается на futex. Учебник, игнорирующий этот примитив, не готовит к реальной разработке.
Комментарии (138)
- Futex — это быстрый примитив синхронизации, который экономит системные вызовы при отсутствии конфликтов и не требует выделения ядром объектов.
- В отличие от Benaphore и старых SysV-механизмов, futex не требует предварительной инициализации в ядре и исчезает, когда нет ожидающих.
- Обсуждение подчёркивает, что современные учебники по многопроцессорному программированию обязаны упоминать futex, но «The Art of Multiprocessor Programming» этому не уделяет внимания.
- Улучшения futex2 (Linux ≥5.16) добавили NUMA-поддержку и аналог Windows WaitForMultipleObjects, а io_uring теперь умеет работать с futex.
- Для надёжности при падении потока существуют robust-locks и списки futex, которые ядро автоматически разблокирует.
Non-Uniform Memory Access (NUMA) is reshaping microservice placement
Codemia
Подготовка к систем-дизайн-интервью через практику:
Начать | Блог | Системный дизайн
Юридика
Условия | Конфиденциальность | Контакт
Комментарии (24)
- Обсуждение подтверждает: для HPC, высоконагруженных и чувствительных к задержкам систем NUMA-распределение критично, и ручное pinning процессов/потоков к нужным узлам остаётся основным способом добиться стабильной производительности.
- В публичных облаках (AWS, GCP) NUMA-топология скрыта, VM часто выглядят как однонодовые UMA; полезны
lscpu,lstopo,cpu-latency, но настроек управления NUMA почти нет. - Сообщество делится инструментами:
mpibind,sched_ext, DAMON, fake NUMA, идеями эмуляции NUMA даже на Raspberry Pi 5. - Kubernetes уже умеет NUMA-affinity, но вручную выбирать 64-ядерный инстанс вместо 96-ядерного (чтобы не пересекать сокеты) всё равно приходится самим.
- Крайняя альтернатива — односокетные серверы с NPS=1: «равномерно медленно», но без головной боли.