L3 последний из “быстрых” уровней памяти, он способен отдавать данные за 30-60 циклов процессора.
А дальше идет DRAM, где стоимость доступа Local / Remote может составлять до 150–300 cycles!
Потому если перформанс для нас важен, то хорошо когда
L3 Hit Rate большой, а L3 Miss Rate маленький ;)Осознав масштаб трагедии, идём смотреть, как чувствуют себя наши системы.
—
Node exporter любезно предоставляет набор метрик (через perf коллектор) для оценки обращений к L3:
- node_perf_cache_refs_total
- node_perf_cache_misses_total
- node_perf_cache_ll_read_hits_total
- node_perf_cache_ll_read_misses_total
В perf им соответствуют ивенты:
- cache-references
- cache-misses
- LLC-loads
- LLC-load-miss
Там и подсчитаем:
$ perf stat -e cache-references,cache-misses \
-e LLC-loads,LLC-load-misses \
-- sleep 5
166680 cache-references
38376 cache-misses # 23.0% miss rate
65552 LLC-loads
8997 LLC-load-misses # 13.7% miss rate
Разница существенна, какой метрике будем доверять? :)
cache-references / cache-misses
Это самые “шумные” ивенты, включают в себя:
- запросы как на read так и на store;
- prefetch;
- instruction fetch;
- спекулятивные выполнения.
Спекулятивное выполнение это когда процессор исполняет инструкции заранее, предполагая, что выбранный путь выполнения окажется верным.
То есть по этим событиям сложно сделать вывод о реальном положении дел с L3.
LLC-loads / LLC-load-misses
Здесь детализации побольше: отслеживаются только запросы на read (для write есть отдельные
LLC-store* события) + спекулятивные обращения.В целом это уже то, с чем можно работать и делать более менее обоснованные выводы из полученных цифр.
Но может есть что-то более точное?
mem_load_retired.l3_*
Для процессоров Intel доступны события
mem_load_retired.l3_hit и mem_load_retired.l3_miss. Они учитывают только те загрузки, которые были retired (реально выполнены и завершены процессором), то есть действительно повлияли на ход выполнения программы:$ perf stat -e cache-references,cache-misses \
-e LLC-loads,LLC-load-misses \
-e mem_load_retired.l3_hit,mem_load_retired.l3_miss \
-- sleep 5
199082 cache-references
55283 cache-misses # 27.7% miss rate
65554 LLC-loads
8796 LLC-load-misses # 13.4% miss rate
16790 mem_load_retired.l3_hit
3694 mem_load_retired.l3_miss # 22.0% miss rate
А еще они precise (PEBS)! Но и об этом в другой раз:)
Итоги
1. если хочется быстро оценить ситуацию, то пользуйся
LLC-load* (или соответствующие им метрики в Node exporter)2. если хочется точнее разобраться откуда идут промахи, то
mem_load_retired.l3_* в помощь.Гудлак 😊
—
p.s. поддержать плюсом на linkedin тут.