GROUP BY сделал на 70% больше работы и закончил быстрее, потому что меньше ждал оперативную память

Разбиение агрегации на 99 млн строк на 4 096 разделов по размеру кэша снизило число загрузок из DRAM примерно с 76 млн до 25,7 млн.

Вкратце

На таблице hits из ClickBench наивная хеш-таблица выполнилась за 3,9 с на холодном запуске, а половина слотов процессора простаивала в ожидании памяти. Поразрядное разбиение (radix partitioning) подняло число инструкций с 11,4 млрд до 19,4 млрд, но выполнилось за 3,3 с на холодном запуске.

Один читатель говорит, что это давно известно, а другой, с опытом работы со встраиваемыми системами, считает, что команды должны увидеть цифры бенчмарков, прежде чем поверить в механическую симпатию.

Загруженный процессор, который в основном ждёт

Пост начинается с разрыва в задержках. Ядро выполняет примерно 4–8 инструкций за наносекунду, а обращение к DRAM занимает 50–100 нс, так что один промах кэша стоит около 400–800 инструкций.

На одном закреплённом ядре наивный GROUP BY UserID по 99 млн строкам (примерно 17 млн уникальных пользователей) занял 3,9 с на холодном запуске. Perf показал, что 50,1% слотов простаивают в ожидании памяти, а число загрузок из DRAM составило около 76 млн.

Наивная хеш-таблица 4 096 radix-разделов
Холодный запуск 3,9 с 3,3 с
Тёплый запуск 3,6 с 2,7 с
Слоты, простаивающие на памяти 50,1% 23,5%
Загрузки из DRAM ~76 млн ~25,7 млн

Разбиение по старшим 12 битам хеша добавляет работы: примерно с 11,4 млрд до 19,4 млрд операций. Но слоты, простаивающие на памяти, падают примерно с 8,4 млрд до 3,8 млрд.

Новизна или учебный приём?

«Эм, это же просто агрегация с radix-разбиением? Иерархическая (фиксированная двухуровневая) агрегация старая. Что тут нового?» — quotemstr

Он добавляет, что не понимает, зачем вообще нужен проект автора, если есть DuckDB и ClickHouse. Автор отвечает, что пост — первый в серии о префетчинге, пропускной способности памяти и пробах при соединениях.

Утерянное умение на работе

Один встраиваемый инженер описал две команды на чипах STM32. Одна писала на C++ с глубокими иерархиями классов на ядре с небольшим кэшем. Он сам написал контейнеры с аллокацией на месте и пулы объектов на основе индексов для микроконтроллера с меньше чем мегабайтом ОЗУ и должен был показать цифры бенчмарков, чтобы убедить первую команду, что он не станет узким местом.

Получайте такие разборы каждый день

Главные истории Hacker News — на email, в Telegram или RSS.

Следующая новость · 9 из 11 Читать дальше
🚀Tech

Prospero — кодинг-обвязка на C++, которая не мешает вашему фаззеру

Крис Веллонс считает, что обвязка — это «curl, склеенный с popen()», и написал свою, которая потребляет примерно на два порядка меньше ресурсов, чем конкуренты на веб-стеке.

★ 181 · 💬 119 · nullprogram.com · 2 мин