SlideShare a Scribd company logo
1 of 89
Download to read offline
«Железные» счётчики
на страже производительности
Sergey Kuksenko
sergey.kuksenko@oracle.com, @kuksenk0
The following is intended to outline our general product direction. It
is intended for information purposes only, and may not be
incorporated into any contract. It is not a commitment to deliver any
material, code, or functionality, and should not be relied upon in
making purchasing decisions. The development, release, and timing
of any features or functionality described for Oracle’s products
remains at the sole discretion of Oracle.
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 2/65
Глава первая
Очень краткое введение в
Методологию Оптимизации
Производительности,
«Что-Где-Как» и «Сверху-Вниз»,
а также о роли «железных» счетчиков
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 3/65
3 магических вопроса
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 4/65
3 магических вопроса
Что?
∙ Что мешает работать быстрее? (monitoring)
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 4/65
3 магических вопроса
Что? ⇒ Где?
∙ Что мешает работать быстрее? (monitoring)
∙ Где это находится? (profiling)
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 4/65
3 магических вопроса
Что? ⇒ Где? ⇒ Как?
∙ Что мешает работать быстрее? (monitoring)
∙ Где это находится? (profiling)
∙ Как это исправить? (tuning/optimizing)
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 4/65
Сверху-Вниз
∙ Системный уровень
– OS, сеть, диск, процессор/память
∙ Уровень JVM
– GC/Heap, JIT, classloading
∙ Уровень приложения
– алгоритм, многопоточность, синхронизация, API
∙ Микроархитектурный уровень
– caches, code/data alignment, pipeline stalls
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 5/65
Mindmap
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 6/65
Mindmap
http://j.mp/PerfMindMap
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 7/65
Сверху-Вниз
Мониторим (e.g. mpstat)
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 8/65
Сверху-Вниз
Мониторим (e.g. mpstat)
∙ Много %sys ⇒ . . .
⇓
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 8/65
Сверху-Вниз
Мониторим (e.g. mpstat)
∙ Много %sys ⇒ . . .
⇓
∙ Много %irq, %soft ⇒ . . .
⇓
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 8/65
Сверху-Вниз
Мониторим (e.g. mpstat)
∙ Много %sys ⇒ . . .
⇓
∙ Много %irq, %soft ⇒ . . .
⇓
∙ Много %iowait ⇒ . . .
⇓
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 8/65
Сверху-Вниз
Мониторим (e.g. mpstat)
∙ Много %sys ⇒ . . .
⇓
∙ Много %irq, %soft ⇒ . . .
⇓
∙ Много %iowait ⇒ . . .
⇓
∙ Много %idle ⇒ . . .
⇓
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 8/65
Сверху-Вниз
Мониторим (e.g. mpstat)
∙ Много %sys ⇒ . . .
⇓
∙ Много %irq, %soft ⇒ . . .
⇓
∙ Много %iowait ⇒ . . .
⇓
∙ Много %idle ⇒ . . .
⇓
∙ Много %user
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 8/65
Глава вторая
О высоком.
О высокой загрузке процессора,
а также
главный вопрос жизни и всего остального
«Кто виноват?»
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 9/65
CPU Utilization
∙ О чём говорит ∼100% CPU Utilization?
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 10/65
CPU Utilization
∙ О чём говорит ∼100% CPU Utilization?
– Как часто OS ставит процессы на исполнение.
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 10/65
CPU Utilization
∙ О чём говорит ∼100% CPU Utilization?
– Как часто OS ставит процессы на исполнение.
Профилирование?
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 10/65
CPU Utilization
∙ О чём говорит ∼100% CPU Utilization?
– Как часто OS ставит процессы на исполнение.
Профилирование?
Профилирование покажет
«ГДЕ» программа проводит время,
без ответа на вопрос «ПОЧЕМУ».
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 10/65
Кто виноват?
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 11/65
Кто виноват?
Сложная микроархитектура современных CPU:
e.g.
Sergey Kuksenko
«Quantum Performance Effects»
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 11/65
Кто виноват?
Сложная микроархитектура современных CPU:
∙ Плохой алгоритм ⇒ 100% CPU
∙ Ждем данные из памяти ⇒ 100% CPU
∙ Откат из-за непредсказанного перехода ⇒ 100% CPU
∙ Сложные и дорогие операции ⇒ 100% CPU
∙ Не хватает ILP ⇒ 100% CPU
∙ и т.д. ⇒ 100% CPU
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 12/65
Глава третья
«Железные» счетчики
HWC, PMU - WTF?
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 13/65
PMU: Performance Monitoring Unit
Performance Monitoring Unit - это встроенный хардверный
профайлер внутри процессора.
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 14/65
PMU: Performance Monitoring Unit
Performance Monitoring Unit - это встроенный хардверный
профайлер внутри процессора.
Устройство PMU (за 21 день) :
«Железные» счетчики (Hardware counters, HWC) считают
происходящие события (Performance monitoring events)
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 14/65
События
Читаем документацию от производителя! (e.g. 2 страницы из 32)
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 15/65
События
Проблемы:
∙ Тысяча их!
∙ Требуют знания микроархитектуры
∙ Платформозависимые
– сильно различаются у разных производителей CPU
– могут сильно меняться у одного производителя при смене
микроархитектуры
∙ Как с ними вообще работать?
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 16/65
HWC
HWC имеют два режима работы:
∙ Counting mode
– if (случилось событие) ++counter;
– общая диагностика (ответ на вопрос «ЧТО»)
∙ Sampling mode
– if (случилось событие)
if (++counter < threshold ) INTERRUPT;
– позволяет профилировать (ответ на вопрос «ГДЕ»)
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 17/65
HWC: Проблемы
Событий много, счетчиков мало
(e.g. Nehalem: 3 fixed HWC, 4 programmable)
∙ «multiple-running» (с разными событиями)
– повторяемость приложения
∙ multiplexing (если тулы позволяют)
– стабильность приложения (steady state)
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 18/65
HWC: Проблемы (cont.)
Sampling mode:
∙ «instruction skid»
(невозможность точного связывания события и инструкции)
∙ Uncore events
(e.g. у нас общий L3 cache на несколько ядер)
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 19/65
HWC: использование
∙ валидация железа
∙ анализ производительности
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 20/65
HWC: использование
∙ валидация железа
∙ анализ производительности
∙ run-time tuning (e.g. JRockit, etc.)
∙ security attacks и защита от них
∙ test code coverage
∙ etc.
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 20/65
HWC: tools
∙ Oracle Solaris Studio Performance Analyzer
∙ perf (perf_events) (http://perf.wiki.kernel.org)
∙ JMH
– perf mode
– perfnorm mode (perf нормализованный на количество операций)
– perfasm mode (perf + -XX:+PrintAssembly)
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 21/65
HWC: tools(cont.)
∙ AMD CodeXL
∙ Intel Vtune Amplifier XE
∙ etc...
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 22/65
События perf_events (e.g.)
∙ cycles
∙ instructions
∙ cache-references
∙ cache-misses
∙ branches
∙ branch-misses
∙ bus-cycles
∙ ref-cycles
∙ dTLB-loads
∙ dTLB-load-misses
∙ L1-dcache-loads
∙ L1-dcache-load-misses
∙ L1-dcache-stores
∙ L1-dcache-store-misses
∙ LLC-loads
∙ LLC-load-misses
∙ etc...
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 23/65
События Oracle Studio (e.g.)
∙ cycles
∙ insts
∙ branch-instruction-retired
∙ branch-misses-retired
∙ dtlbm
∙ l1h
∙ l1m
∙ l2h
∙ l2m
∙ l3h
∙ l3m
∙ etc...
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 24/65
Глава четвертая
Я собрал данные HWC, и?
или
Введение в микроархитектурный
анализ производительности
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 25/65
Время работы
𝑡𝑖𝑚𝑒 = 𝑐𝑦𝑐𝑙𝑒𝑠
𝑓 𝑟𝑒𝑞𝑢𝑒𝑛𝑐𝑦
Оптимизация это
уменьшение количества тактов (cycles)!
⋆
⋆
все остальное - overclocking
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 26/65
ГУМ
Главное Уравнение Микроархитектуры:
𝑐𝑦𝑐𝑙𝑒𝑠 = 𝑃 𝑎𝑡ℎ𝐿𝑒𝑛𝑔𝑡ℎ * 𝐶𝑃 𝐼 = 𝑃 𝑎𝑡ℎ𝐿𝑒𝑛𝑔𝑡ℎ * 1
𝐼𝑃 𝐶
∙ PathLength - количество инструкций
∙ CPI - cycles per instruction
∙ IPC - instructions per cycle
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 27/65
𝑃 𝑎𝑡ℎ𝐿𝑒𝑛𝑔𝑡ℎ * 𝐶𝑃 𝐼
∙ PathLength - мера эффективности алгоритма
(чем меньше, тем лучше)
∙ CPI - мера эффективности работы CPU
(чем меньше, тем лучше)
– 𝐶𝑃 𝐼 = 4 – плохо!
– 𝐶𝑃 𝐼 = 1
∙ Nehalem – сойдет!
∙ SandyBridge и позже – плоховатенько!
– 𝐶𝑃 𝐼 = 0.4 – хорошо!
– 𝐶𝑃 𝐼 = 0.2 – идеально!
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 28/65
Что делать?
∙ низкий CPI
– уменьшаем PathLength – «улучшаем эффективность алгоритма»
∙ большой CPI ⇒ stalls
– memory stalls – «улучшаем эффективность структур данных»
– branch stalls – «улучшаем логику передачи управления»
– instruction dependency – «разрываем зависимости по данным»
– long latency ops – «заменяем на полегче»
– и т.д.
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 29/65
Проблемы с CPI?
Нам нужна классификация проблем!
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 30/65
Memory bound
∙ dTLB misses
∙ L1,L2,L3,...,LN misses
∙ NUMA (чужая память)
∙ memory bandwidth
∙ sharing (false/true)
∙ cache line split (не бывает в Java, почти)
∙ store forwarding
(маловероятно, да и все равно не исправить на Java уровне)
∙ 4k aliasing (попробуй поймать)
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 31/65
Core bound
∙ long latency operations (DIV, SQRT)
∙ FP assist (floating points denormal, NaN, inf)
∙ bad speculation (вызывается непредсказанным переходом)
∙ port saturation (нам не нужно)
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 32/65
Front-End bound
∙ iTLB miss
∙ iCache miss
∙ branch mispredict
∙ LSD (loop stream decoder)
Можно решить, только если залезть в исходники HotSpot
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 33/65
Примеры
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 34/65
Пример первый
Некий «большой» индустриальный
Java бенчмарк
Который до сих пор снится по ночам многим
Java Performance инженерам
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 35/65
Пример 1: perf stat -d
880851.993237 task -clock (msec)
39,318 context -switches
437 cpu -migrations
7,931 page -faults
2 ,275 ,263 ,113 ,376 cycles
1 ,226 ,299 ,634 ,877 instructions # 0.54 insns per cycle
229 ,500 ,265 ,931 branches # 260.544 M/sec
4 ,620 ,666 ,169 branch -misses # 2.01% of all branches
338 ,169 ,489 ,902 L1-dcache -loads # 383.912 M/sec
37 ,937 ,596 ,505 L1-dcache -load -misses # 11.22% of all L1-dcache hits
25 ,232 ,434 ,666 LLC -loads # 28.645 M/sec
7 ,307 ,884 ,874 L1-icache -load -misses # 0.00% of all L1 -icache hits
337 ,230 ,278 ,697 dTLB -loads # 382.846 M/sec
6 ,094 ,356 ,801 dTLB -load -misses # 1.81% of all dTLB cache hits
12 ,210 ,841 ,909 iTLB -loads # 13.863 M/sec
431 ,803 ,270 iTLB -load -misses # 3.54% of all iTLB cache hits
301.557213044 seconds time elapsed
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 36/65
Пример 1: обработанный руками perf stat -d
IPC 0.54
cycles ×1012
2.28
instructions ×1012
1.23
L1-dcache-loads ×109
338
L1-dcache-load-misses ×109
38
LLC-loads ×109
25
dTLB-loads ×109
337
dTLB-load-misses ×109
6
iTLB-loads ×109
12
iTLB-loads-misses ×106
432
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 37/65
Пример 1: обработанный руками perf stat -d
IPC 0.54
cycles ×1012
2.28
instructions ×1012
1.23
L1-dcache-loads ×109
338
L1-dcache-load-misses ×109
38
LLC-loads ×109
25
dTLB-loads ×109
337
dTLB-load-misses ×109
6
iTLB-loads ×109
12
iTLB-loads-misses ×106
432
Проблемы?
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 37/65
Пример 1: обработанный руками perf stat -d
IPC 0.54
cycles ×1012
2.28
instructions ×1012
1.23
L1-dcache-loads ×109
338
L1-dcache-load-misses ×109
38
LLC-loads ×109
25
dTLB-loads ×109
337
dTLB-load-misses ×109
6
iTLB-loads ×109
12
iTLB-loads-misses ×106
432
Посчитаем:
4 × (338 × 109
)+
12 × ((38 − 25) × 109
)+
36 × (25 × 109
) ≈
2.4 × 1012
cycles ???
Проблемы?
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 37/65
Пример 1: обработанный руками perf stat -d
IPC 0.54
cycles ×1012
2.28
instructions ×1012
1.23
L1-dcache-loads ×109
338
L1-dcache-load-misses ×109
38
LLC-loads ×109
25
dTLB-loads ×109
337
dTLB-load-misses ×109
6
iTLB-loads ×109
12
iTLB-loads-misses ×106
432
Посчитаем:
4 × (338 × 109
)+
12 × ((38 − 25) × 109
)+
36 × (25 × 109
) ≈
2.4 × 1012
cycles ???
Superscalar in Action!
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 37/65
Пример 1: обработанный руками perf stat -d
IPC 0.54
cycles ×1012
2.28
instructions ×1012
1.23
L1-dcache-loads ×109
338
L1-dcache-load-misses ×109
38
LLC-loads ×109
25
dTLB-loads ×109
337
dTLB-load-misses ×109
6
iTLB-loads ×109
12
iTLB-loads-misses ×106
432
Проблемы!
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 37/65
Пример 1: dTLB misses
TLB = Translation Lookaside Buffer
∙ Кэш транслятора виртуальных адресов в физические
∙ Каждое обращение к памяти – обращение к TLB
∙ TLB miss может стоить сотни тактов
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 38/65
Пример 1: dTLB misses
TLB = Translation Lookaside Buffer
∙ Кэш транслятора виртуальных адресов в физические
∙ Каждое обращение к памяти – обращение к TLB
∙ TLB miss может стоить сотни тактов
Как проверить:
∙ dtlb_load_misses_miss_causes_a_walk
∙ dtlb_load_misses_walk_duration
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 38/65
Пример 1: dTLB misses
IPC 0.54
cycles ×1012
2.28
instructions ×1012
1.23
L1-dcache-loads ×109
338
L1-dcache-load-misses ×109
38
LLC-loads ×109
25
dTLB-loads ×109
337
dTLB-load-misses ×109
6
iTLB-loads ×109
12
iTLB-loads-misses ×106
432
dTLB-walks-duration ×109
296
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 39/65
Пример 1: dTLB misses
Что делать:
∙ LargePages (Huge pages)
∙ попытаться уменьшить «Working Set»
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 40/65
Пример 1: -XX:+UseLargePages
baseline raw
IPC 0.54 0.64
cycles ×1012
2.28 2.28
instructions ×1012
1.23 1.46
L1-dcache-loads ×109
338 401
L1-dcache-load-misses ×109
38 38
LLC-loads ×109
25 25
dTLB-loads ×109
337 401
dTLB-load-misses ×109
6 0.24
iTLB-loads-misses ×106
432 27
dTLB-walks-duration ×109
296 2.6
Ускорение – 20%
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 41/65
Пример 1: -XX:+UseLargePages
baseline raw normalized
IPC 0.54 0.64 0.64
cycles ×1012
2.28 2.28 1.9
instructions ×1012
1.23 1.46 1.22
L1-dcache-loads ×109
338 401 334
L1-dcache-load-misses ×109
38 38 32
LLC-loads ×109
25 25 21
dTLB-loads ×109
337 401 334
dTLB-load-misses ×109
6 0.24 0.20
iTLB-loads-misses ×106
432 27 23
dTLB-walks-duration ×109
296 2.6 2.2
Ускорение – 20%
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 41/65
Пример второй
Мы нашли горячий метод
или
О
⋆
применимости алгоритмических оптимизаций
⋆
О-обычное
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 42/65
Пример 2: Very Hot Code
public Matrix multiply(Matrix other) {
int size = data.length;
Matrix result = new Matrix(size);
int [][] R = result.data;
int [][] A = this.data;
int [][] B = other.data;
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
int s = 0;
for (int k = 0; k < size; k++) {
s += A[i][k] * B[k][j];
}
R[i][j] = s;
}
}
return result;
}
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 43/65
Пример 2: Very Hot Code
public Matrix multiply(Matrix other) {
int size = data.length;
Matrix result = new Matrix(size);
int [][] R = result.data;
int [][] A = this.data;
int [][] B = other.data;
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
int s = 0;
for (int k = 0; k < size; k++) {
s += A[i][k] * B[k][j];
}
R[i][j] = s;
}
}
return result;
}
𝑂( 𝑁3)⋆
⋆
O-большое
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 43/65
Пример 2: "Ok Google"
𝑂( 𝑁2.81)
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 44/65
Пример 2: Very Hot Code
N multiply strassen
32 33 𝜇𝑠
64 252 𝜇𝑠
128 3019 𝜇𝑠 2119 𝜇𝑠
256 32 𝑚𝑠 15 𝑚𝑠
512 488 𝑚𝑠 111 𝑚𝑠
1024 3270 𝑚𝑠 785 𝑚𝑠
2048 32 𝑠 6 𝑠
4096 309 𝑠 42 𝑠
8192 2611⋆
𝑠 293 𝑠
time/op
⋆
43 min 31 sec Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 45/65
А если мы пойдем другим путем?
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 46/65
Пример 2: JMH, -prof perfnorm, N=256
per multiplication per iteration
CPI 1.06
cycles 146 × 106
8.7
instructions 137 × 106
8.2
L1-loads 68 × 106
4
L1-load-misses 33 × 106
2
L1-stores 0.56 × 106
L1-store-misses 38357
LLC-loads 26 × 106
1.6
LLC-stores 11595
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 47/65
Пример 2: Very Hot Code
public Matrix multiply(Matrix other) {
int size = data.length;
Matrix result = new Matrix(size);
int [][] R = result.data;
int [][] A = this.data;
int [][] B = other.data;
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
int s = 0;
for (int k = 0; k < size; k++) {
s += A[i][k] * B[k][j] ;
}
R[i][j] = s;
}
}
return result;
}
L1-dcache-load-misses
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 48/65
Пример 2: Very Hot Code
public Matrix multiply(Matrix other) {
int size = data.length;
Matrix result = new Matrix(size);
int [][] R = result.data;
int [][] A = this.data;
int [][] B = other.data;
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
int s = 0;
for (int k = 0; k < size; k++) {
s += A[i][k] * B[k][j] ;
}
R[i][j] = s;
}
}
return result;
}
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 48/65
Пример 2: Very Hot Code
public Matrix multiplyIKJ(Matrix other) {
int size = data.length;
Matrix result = new Matrix(size);
int [][] R = result.data;
int [][] A = this.data;
int [][] B = other.data;
for (int i = 0; i < size; i++) {
for (int k = 0; k < size; k++) {
int aik = A[i][k];
for (int j = 0; j < size; j++) {
R[i][j] += aik * B[k][j];
}
}
}
return result;
}
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 49/65
Пример 2: Very Hot Code
IJK IKJ
N multiply strassen multiply
32 33 𝜇𝑠 13 𝜇𝑠
64 252 𝜇𝑠 80 𝜇𝑠
128 3019 𝜇𝑠 2119 𝜇𝑠 464 𝜇𝑠
256 32 𝑚𝑠 15 𝑚𝑠 4 𝑚𝑠
512 488 𝑚𝑠 111 𝑚𝑠 29 𝑚𝑠
1024 3270 𝑚𝑠 785 𝑚𝑠 369 𝑚𝑠
2048 32 𝑠 6 𝑠 3.4 𝑠
4096 309 𝑠 42 𝑠 25 𝑠
8192 2611 𝑠 293 𝑠 210 𝑠
time/op
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 50/65
Пример 2: Very Hot Code
IJK IKJ
N multiply strassen multiply strassen
32 33 𝜇𝑠 13 𝜇𝑠
64 252 𝜇𝑠 80 𝜇𝑠
128 3019 𝜇𝑠 2119 𝜇𝑠 464 𝜇𝑠
256 32 𝑚𝑠 15 𝑚𝑠 4 𝑚𝑠
512 488 𝑚𝑠 111 𝑚𝑠 29 𝑚𝑠 25 𝑚𝑠
1024 3270 𝑚𝑠 785 𝑚𝑠 369 𝑚𝑠 192 𝑚𝑠
2048 32 𝑠 6 𝑠 3.4 𝑠 1.4 𝑠
4096 309 𝑠 42 𝑠 25 𝑠 10 𝑠
8192 2611 𝑠 293 𝑠 210 𝑠 73 𝑠
time/op
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 50/65
Пример 2: JMH, -prof perfnorm, N=256
IJK IKJ
multiply iteration multiply iteration
CPI 1.06 0.51
cycles 146 × 106
8.7 9.7 × 106
0.6
instructions 137 × 106
8.2 19 × 106
1.1
L1-loads 68 × 106
4 5.4 × 106
0.3
L1-load-misses 33 × 106
2 1.1 × 106
0.1
L1-stores 0.56 × 106
2.7 × 106
0.2
L1-store-misses 38357 8959
LLC-loads 26 × 106
1.6 0.3 × 106
LLC-stores 11595 3532
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 51/65
Пример 2: Дополнительные плюшки!
cycles insts
...
6.42% 5.54% 0x00007ff6591d20c5: vmovdqu %ymm1 ,0x10(%r14 ,%rbx ,4) ;* iastore
9.49% 11.91% 0x00007ff6591d20cc: add $0x8 ,%ebx ;*iinc
0.15% 0.05% 0x00007ff6591d20cf: cmp %r11d ,%ebx
0x00007ff6591d20d2: jl 0x00007ff6591d20b2 ;* if_icmpge
...
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 52/65
Пример 2: Дополнительные плюшки!
cycles insts
...
6.42% 5.54% 0x00007ff6591d20c5: vmovdqu %ymm1 ,0x10(%r14 ,%rbx ,4) ;* iastore
9.49% 11.91% 0x00007ff6591d20cc: add $0x8 ,%ebx ;*iinc
0.15% 0.05% 0x00007ff6591d20cf: cmp %r11d ,%ebx
0x00007ff6591d20d2: jl 0x00007ff6591d20b2 ;* if_icmpge
...
Векторизация (SSE/AVX)!
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 52/65
Пример третий
«++ на оба ваши треда»
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 53/65
Пример 3: False Sharing
@State(Scope.Group)
public static class StateBaseline {
int field0;
int field1;
}
@Benchmark
@Group("baseline")
public int justDoIt(StateBaseline s) {
return s.field0 ++;
}
@Benchmark
@Group("baseline")
public int doItFromOtherThread(StateBaseline s) {
return s.field1 ++;
}
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 54/65
Пример 3: измерим
что общего sharing padded
Same Core (HT) L1 9.5 4.9
Diff Cores (within socket) L3 (LLC) 10.6 2.8
Diff Sockets ничего 18.2 2.8
average time, ns/op
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 55/65
Пример 3: соберем HWC
Данные нормализованы на 103
операций
Same Core Diff Cores Diff Sockets
sharing padded sharing padded sharing padded
CPI 1.3 0.7 1.4 0.4 1.7 0.4
cycles 33130 17536 36012 9163 46484 9608
instructions 26418 25865 26550 25747 26717 25768
L1-loads 12593 9467 9696 8973 9672 9016
L1-load-misses 10 5 12 4 33 3
L1-stores 4317 7838 7433 4069 6935 4074
L1-store-misses 5 2 161 2 55 1
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 56/65
Пример 3: соберем HWC (продолжение)
Данные нормализованы на 103
операций
Same Core Diff Cores Diff Sockets
sharing padded sharing padded sharing padded
LLС-loads 4 3 58 1 32 1
LLC-load-misses 1 1 53 ≈0 35 ≈0
LLC-stores 1 1 183 ≈0 49 ≈0
LLC-store-misses 1 ≈0 182 ≈0 48 ≈0
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 57/65
Пример 3: На честном слове и на одном ядре
для одного ядра нам нужно считать
MACHINE_CLEARS.MEMORY_ORDERING
Same Core Diff Cores Diff Sockets
sharing padded sharing padded sharing padded
CPI 1.3 0.7 1.4 0.4 1.7 0.4
cycles 33130 17536 36012 9163 46484 9608
instructions 26418 25865 26550 25747 26717 25768
CLEARS 238 ≈0 ≈0 ≈0 ≈0 ≈0
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 58/65
Пример 3: разные ядра
L2_STORE_LOCK_RQSTS - L2 RFOs breakdown
Diff Cores Diff Sockets
sharing padded sharing padded
CPI 1.4 0.4 1.7 0.4
LLC-stores 183 ≈0 49 ≈0
LLC-store-misses 182 ≈0 48 ≈0
L2_STORE_LOCK_RQSTS.MISS 134 ≈0 33 ≈0
L2_STORE_LOCK_RQSTS.HIT_E ≈0 ≈0 ≈0 ≈0
L2_STORE_LOCK_RQSTS.HIT_M ≈0 ≈0 ≈0 ≈0
L2_STORE_LOCK_RQSTS.ALL 183 ≈0 49 ≈0
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 59/65
Внимание!
Вопрос в зал!
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 60/65
Пример 3: разные ядра
Diff Cores Diff Sockets
sharing padded sharing padded
CPI 1.4 0.4 1.7 0.4
LLC-stores 183 ≈0 49 ≈0
LLC-store-misses 182 ≈0 48 ≈0
L2_STORE_LOCK_RQSTS.MISS 134 ≈0 33 ≈0
L2_STORE_LOCK_RQSTS.ALL 183 ≈0 49 ≈0
Почему 183 > 49 и 134 > 33,
а все равно работает быстрее?
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 61/65
Пример 3: события считающие длительность
Есть и такое событие:
OFFCORE_REQUESTS_OUTSTANDING.CYCLES_WITH_DEMAND_RFO
Diff Cores Diff Sockets
sharing padded sharing padded
CPI 1.4 0.4 1.7 0.4
cycles 36012 9163 46484 9608
instructions 26550 25747 26717 25768
ORO.SWD_RFO 21723 10 29601 56
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 62/65
Заключение:
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 63/65
Заключение: Учиться, учиться и учиться!
Изучаем микроархитектуру:
∙ “Computer Architecture: A Quantitative Approach”
John L. Hennessy, David A. Patterson
∙ http://www.agner.org/optimize/
∙ http://www.google.com/search?q=Hardware+
performance+counter
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 64/65
Q & A ?
Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 65/65

More Related Content

What's hot

Интеллектуальная система автоматизации тестирования на базе Groovy
Интеллектуальная система автоматизации тестирования на базе GroovyИнтеллектуальная система автоматизации тестирования на базе Groovy
Интеллектуальная система автоматизации тестирования на базе GroovySQALab
 
Полезное покрытие кода
Полезное покрытие кодаПолезное покрытие кода
Полезное покрытие кодаSQALab
 
Сенцов Сергей "Приемы оптимизаций Desktop приложений"
Сенцов Сергей "Приемы оптимизаций Desktop приложений"Сенцов Сергей "Приемы оптимизаций Desktop приложений"
Сенцов Сергей "Приемы оптимизаций Desktop приложений"Yulia Tsisyk
 
Joker 2016 - Bytecode 101
Joker 2016 - Bytecode 101Joker 2016 - Bytecode 101
Joker 2016 - Bytecode 101Anton Arhipov
 
JPoint 2016 - Bytecode
JPoint 2016 - BytecodeJPoint 2016 - Bytecode
JPoint 2016 - BytecodeAnton Arhipov
 
Распространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийРаспространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийMikhail Shcherbakov
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Andrey Karpov
 
Продолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложенийПродолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложенийAndrey Akinshin
 
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...Sigma Software
 
Разработка приложений для Android на С++. Юрий Береза, Shturmann
Разработка приложений для Android на С++. Юрий Береза, ShturmannРазработка приложений для Android на С++. Юрий Береза, Shturmann
Разработка приложений для Android на С++. Юрий Береза, Shturmannyaevents
 
How threads help each other
How threads help each otherHow threads help each other
How threads help each otherAlexey Fyodorov
 

What's hot (13)

Интеллектуальная система автоматизации тестирования на базе Groovy
Интеллектуальная система автоматизации тестирования на базе GroovyИнтеллектуальная система автоматизации тестирования на базе Groovy
Интеллектуальная система автоматизации тестирования на базе Groovy
 
Полезное покрытие кода
Полезное покрытие кодаПолезное покрытие кода
Полезное покрытие кода
 
Сенцов Сергей "Приемы оптимизаций Desktop приложений"
Сенцов Сергей "Приемы оптимизаций Desktop приложений"Сенцов Сергей "Приемы оптимизаций Desktop приложений"
Сенцов Сергей "Приемы оптимизаций Desktop приложений"
 
Joker 2016 - Bytecode 101
Joker 2016 - Bytecode 101Joker 2016 - Bytecode 101
Joker 2016 - Bytecode 101
 
JPoint 2016 - Bytecode
JPoint 2016 - BytecodeJPoint 2016 - Bytecode
JPoint 2016 - Bytecode
 
Распространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийРаспространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложений
 
In the sun.misc.Unsafe bowels
In the sun.misc.Unsafe bowelsIn the sun.misc.Unsafe bowels
In the sun.misc.Unsafe bowels
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?
 
Продолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложенийПродолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложений
 
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...
 
Java 8 puzzlers
Java 8 puzzlersJava 8 puzzlers
Java 8 puzzlers
 
Разработка приложений для Android на С++. Юрий Береза, Shturmann
Разработка приложений для Android на С++. Юрий Береза, ShturmannРазработка приложений для Android на С++. Юрий Береза, Shturmann
Разработка приложений для Android на С++. Юрий Береза, Shturmann
 
How threads help each other
How threads help each otherHow threads help each other
How threads help each other
 

Viewers also liked

Java Performance: Speedup your application with hardware counters
Java Performance: Speedup your application with hardware countersJava Performance: Speedup your application with hardware counters
Java Performance: Speedup your application with hardware countersSergey Kuksenko
 
"Quantum" Performance Effects
"Quantum" Performance Effects"Quantum" Performance Effects
"Quantum" Performance EffectsSergey Kuksenko
 
"Quantum" performance effects
"Quantum" performance effects"Quantum" performance effects
"Quantum" performance effectsSergey Kuksenko
 
JPoint 2016 - Валеев Тагир - Странности Stream API
JPoint 2016 - Валеев Тагир - Странности Stream APIJPoint 2016 - Валеев Тагир - Странности Stream API
JPoint 2016 - Валеев Тагир - Странности Stream APItvaleev
 
Stream API: рекомендации лучших собаководов
Stream API: рекомендации лучших собаководовStream API: рекомендации лучших собаководов
Stream API: рекомендации лучших собаководовtvaleev
 
Java 8 Puzzlers as it was presented at Codemash 2017
Java 8 Puzzlers as it was presented at Codemash 2017Java 8 Puzzlers as it was presented at Codemash 2017
Java 8 Puzzlers as it was presented at Codemash 2017Baruch Sadogursky
 

Viewers also liked (8)

JDK8: Stream style
JDK8: Stream styleJDK8: Stream style
JDK8: Stream style
 
Java Performance: Speedup your application with hardware counters
Java Performance: Speedup your application with hardware countersJava Performance: Speedup your application with hardware counters
Java Performance: Speedup your application with hardware counters
 
"Quantum" Performance Effects
"Quantum" Performance Effects"Quantum" Performance Effects
"Quantum" Performance Effects
 
"Quantum" performance effects
"Quantum" performance effects"Quantum" performance effects
"Quantum" performance effects
 
JPoint 2016 - Валеев Тагир - Странности Stream API
JPoint 2016 - Валеев Тагир - Странности Stream APIJPoint 2016 - Валеев Тагир - Странности Stream API
JPoint 2016 - Валеев Тагир - Странности Stream API
 
Stream API: рекомендации лучших собаководов
Stream API: рекомендации лучших собаководовStream API: рекомендации лучших собаководов
Stream API: рекомендации лучших собаководов
 
Javaland keynote final
Javaland keynote finalJavaland keynote final
Javaland keynote final
 
Java 8 Puzzlers as it was presented at Codemash 2017
Java 8 Puzzlers as it was presented at Codemash 2017Java 8 Puzzlers as it was presented at Codemash 2017
Java 8 Puzzlers as it was presented at Codemash 2017
 

Similar to Железные счётчики на страже производительности

CodeFest 2014. Шипилёв А. — Java Benchmarking: как два таймстампа записать!
CodeFest 2014. Шипилёв А. — Java Benchmarking: как два таймстампа записать!CodeFest 2014. Шипилёв А. — Java Benchmarking: как два таймстампа записать!
CodeFest 2014. Шипилёв А. — Java Benchmarking: как два таймстампа записать!CodeFest
 
Новое поколение серверов SPARC
Новое поколение серверов SPARCНовое поколение серверов SPARC
Новое поколение серверов SPARCAndrey Akulov
 
Методики и инструменты для самостоятельного решения проблем в сети
Методики и инструменты для самостоятельного решения проблем в сетиМетодики и инструменты для самостоятельного решения проблем в сети
Методики и инструменты для самостоятельного решения проблем в сетиCisco Russia
 
Oracle. Моторин Иларион. "Современные и перспективные системы на базе процесс...
Oracle. Моторин Иларион. "Современные и перспективные системы на базе процесс...Oracle. Моторин Иларион. "Современные и перспективные системы на базе процесс...
Oracle. Моторин Иларион. "Современные и перспективные системы на базе процесс...Expolink
 
Занимательные истории из жизни технической поддержки JVM
Занимательные истории из жизни технической поддержки JVMЗанимательные истории из жизни технической поддержки JVM
Занимательные истории из жизни технической поддержки JVMNikita Lipsky
 
владивосток форум производительность_ha
владивосток форум производительность_haвладивосток форум производительность_ha
владивосток форум производительность_haElena Ometova
 
Новости и анонсы конференции Oracle Open World 2013
Новости и анонсы конференции Oracle Open World 2013Новости и анонсы конференции Oracle Open World 2013
Новости и анонсы конференции Oracle Open World 2013Andrey Akulov
 
Критерии предквалификации Интегратора по АСУТП
Критерии предквалификации Интегратора по АСУТПКритерии предквалификации Интегратора по АСУТП
Критерии предквалификации Интегратора по АСУТПAPPAU_Ukraine
 
Построение аналитического хранилища на 100 петабайт
Построение аналитического хранилища на 100 петабайтПостроение аналитического хранилища на 100 петабайт
Построение аналитического хранилища на 100 петабайтAlexander Mazurov
 
Процесс изменения платформы Java
Процесс изменения платформы JavaПроцесс изменения платформы Java
Процесс изменения платформы JavaAlexey Fyodorov
 
Трудовые будни инженера производительности
Трудовые будни инженера производительностиТрудовые будни инженера производительности
Трудовые будни инженера производительностиVladimir Sitnikov
 
Advanced IPv4 BGP troubleshooting глазами TAC
Advanced IPv4 BGP troubleshooting глазами TACAdvanced IPv4 BGP troubleshooting глазами TAC
Advanced IPv4 BGP troubleshooting глазами TACCisco Russia
 
Разбор сложных случаев OutOfMemoryError
Разбор сложных случаев OutOfMemoryErrorРазбор сложных случаев OutOfMemoryError
Разбор сложных случаев OutOfMemoryErrorVladimir Sitnikov
 
13 советов, от которых зависит успешность вашего SOC
13 советов, от которых зависит успешность вашего SOC13 советов, от которых зависит успешность вашего SOC
13 советов, от которых зависит успешность вашего SOCAleksey Lukatskiy
 
еще один недостаток современных клиент серверных приложений
еще один недостаток современных клиент серверных приложенийеще один недостаток современных клиент серверных приложений
еще один недостаток современных клиент серверных приложенийsnowytoxa
 
Организация процесса регулярной обработки больших объемов данных
Организация процесса регулярной обработки больших объемов данныхОрганизация процесса регулярной обработки больших объемов данных
Организация процесса регулярной обработки больших объемов данныхCodeFest
 
Владимир Назаров, HPE: Зачем нужна миграция с UNIX на Linux? Выводы на основ...
Владимир Назаров, HPE:  Зачем нужна миграция с UNIX на Linux? Выводы на основ...Владимир Назаров, HPE:  Зачем нужна миграция с UNIX на Linux? Выводы на основ...
Владимир Назаров, HPE: Зачем нужна миграция с UNIX на Linux? Выводы на основ...Банковское обозрение
 

Similar to Железные счётчики на страже производительности (20)

CodeFest 2014. Шипилёв А. — Java Benchmarking: как два таймстампа записать!
CodeFest 2014. Шипилёв А. — Java Benchmarking: как два таймстампа записать!CodeFest 2014. Шипилёв А. — Java Benchmarking: как два таймстампа записать!
CodeFest 2014. Шипилёв А. — Java Benchmarking: как два таймстампа записать!
 
Новое поколение серверов SPARC
Новое поколение серверов SPARCНовое поколение серверов SPARC
Новое поколение серверов SPARC
 
Методики и инструменты для самостоятельного решения проблем в сети
Методики и инструменты для самостоятельного решения проблем в сетиМетодики и инструменты для самостоятельного решения проблем в сети
Методики и инструменты для самостоятельного решения проблем в сети
 
Oracle. Моторин Иларион. "Современные и перспективные системы на базе процесс...
Oracle. Моторин Иларион. "Современные и перспективные системы на базе процесс...Oracle. Моторин Иларион. "Современные и перспективные системы на базе процесс...
Oracle. Моторин Иларион. "Современные и перспективные системы на базе процесс...
 
Занимательные истории из жизни технической поддержки JVM
Занимательные истории из жизни технической поддержки JVMЗанимательные истории из жизни технической поддержки JVM
Занимательные истории из жизни технической поддержки JVM
 
владивосток форум производительность_ha
владивосток форум производительность_haвладивосток форум производительность_ha
владивосток форум производительность_ha
 
Новости и анонсы конференции Oracle Open World 2013
Новости и анонсы конференции Oracle Open World 2013Новости и анонсы конференции Oracle Open World 2013
Новости и анонсы конференции Oracle Open World 2013
 
Критерии предквалификации Интегратора по АСУТП
Критерии предквалификации Интегратора по АСУТПКритерии предквалификации Интегратора по АСУТП
Критерии предквалификации Интегратора по АСУТП
 
Построение аналитического хранилища на 100 петабайт
Построение аналитического хранилища на 100 петабайтПостроение аналитического хранилища на 100 петабайт
Построение аналитического хранилища на 100 петабайт
 
Процесс изменения платформы Java
Процесс изменения платформы JavaПроцесс изменения платформы Java
Процесс изменения платформы Java
 
Трудовые будни инженера производительности
Трудовые будни инженера производительностиТрудовые будни инженера производительности
Трудовые будни инженера производительности
 
Regular expressions
Regular expressionsRegular expressions
Regular expressions
 
Advanced IPv4 BGP troubleshooting глазами TAC
Advanced IPv4 BGP troubleshooting глазами TACAdvanced IPv4 BGP troubleshooting глазами TAC
Advanced IPv4 BGP troubleshooting глазами TAC
 
Разбор сложных случаев OutOfMemoryError
Разбор сложных случаев OutOfMemoryErrorРазбор сложных случаев OutOfMemoryError
Разбор сложных случаев OutOfMemoryError
 
13 советов, от которых зависит успешность вашего SOC
13 советов, от которых зависит успешность вашего SOC13 советов, от которых зависит успешность вашего SOC
13 советов, от которых зависит успешность вашего SOC
 
MySQL 8.0
MySQL 8.0MySQL 8.0
MySQL 8.0
 
еще один недостаток современных клиент серверных приложений
еще один недостаток современных клиент серверных приложенийеще один недостаток современных клиент серверных приложений
еще один недостаток современных клиент серверных приложений
 
ALG Systems
ALG SystemsALG Systems
ALG Systems
 
Организация процесса регулярной обработки больших объемов данных
Организация процесса регулярной обработки больших объемов данныхОрганизация процесса регулярной обработки больших объемов данных
Организация процесса регулярной обработки больших объемов данных
 
Владимир Назаров, HPE: Зачем нужна миграция с UNIX на Linux? Выводы на основ...
Владимир Назаров, HPE:  Зачем нужна миграция с UNIX на Linux? Выводы на основ...Владимир Назаров, HPE:  Зачем нужна миграция с UNIX на Linux? Выводы на основ...
Владимир Назаров, HPE: Зачем нужна миграция с UNIX на Linux? Выводы на основ...
 

Железные счётчики на страже производительности

  • 1. «Железные» счётчики на страже производительности Sergey Kuksenko sergey.kuksenko@oracle.com, @kuksenk0
  • 2. The following is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions. The development, release, and timing of any features or functionality described for Oracle’s products remains at the sole discretion of Oracle. Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 2/65
  • 3. Глава первая Очень краткое введение в Методологию Оптимизации Производительности, «Что-Где-Как» и «Сверху-Вниз», а также о роли «железных» счетчиков Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 3/65
  • 4. 3 магических вопроса Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 4/65
  • 5. 3 магических вопроса Что? ∙ Что мешает работать быстрее? (monitoring) Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 4/65
  • 6. 3 магических вопроса Что? ⇒ Где? ∙ Что мешает работать быстрее? (monitoring) ∙ Где это находится? (profiling) Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 4/65
  • 7. 3 магических вопроса Что? ⇒ Где? ⇒ Как? ∙ Что мешает работать быстрее? (monitoring) ∙ Где это находится? (profiling) ∙ Как это исправить? (tuning/optimizing) Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 4/65
  • 8. Сверху-Вниз ∙ Системный уровень – OS, сеть, диск, процессор/память ∙ Уровень JVM – GC/Heap, JIT, classloading ∙ Уровень приложения – алгоритм, многопоточность, синхронизация, API ∙ Микроархитектурный уровень – caches, code/data alignment, pipeline stalls Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 5/65
  • 9. Mindmap Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 6/65
  • 10. Mindmap http://j.mp/PerfMindMap Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 7/65
  • 11. Сверху-Вниз Мониторим (e.g. mpstat) Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 8/65
  • 12. Сверху-Вниз Мониторим (e.g. mpstat) ∙ Много %sys ⇒ . . . ⇓ Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 8/65
  • 13. Сверху-Вниз Мониторим (e.g. mpstat) ∙ Много %sys ⇒ . . . ⇓ ∙ Много %irq, %soft ⇒ . . . ⇓ Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 8/65
  • 14. Сверху-Вниз Мониторим (e.g. mpstat) ∙ Много %sys ⇒ . . . ⇓ ∙ Много %irq, %soft ⇒ . . . ⇓ ∙ Много %iowait ⇒ . . . ⇓ Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 8/65
  • 15. Сверху-Вниз Мониторим (e.g. mpstat) ∙ Много %sys ⇒ . . . ⇓ ∙ Много %irq, %soft ⇒ . . . ⇓ ∙ Много %iowait ⇒ . . . ⇓ ∙ Много %idle ⇒ . . . ⇓ Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 8/65
  • 16. Сверху-Вниз Мониторим (e.g. mpstat) ∙ Много %sys ⇒ . . . ⇓ ∙ Много %irq, %soft ⇒ . . . ⇓ ∙ Много %iowait ⇒ . . . ⇓ ∙ Много %idle ⇒ . . . ⇓ ∙ Много %user Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 8/65
  • 17. Глава вторая О высоком. О высокой загрузке процессора, а также главный вопрос жизни и всего остального «Кто виноват?» Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 9/65
  • 18. CPU Utilization ∙ О чём говорит ∼100% CPU Utilization? Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 10/65
  • 19. CPU Utilization ∙ О чём говорит ∼100% CPU Utilization? – Как часто OS ставит процессы на исполнение. Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 10/65
  • 20. CPU Utilization ∙ О чём говорит ∼100% CPU Utilization? – Как часто OS ставит процессы на исполнение. Профилирование? Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 10/65
  • 21. CPU Utilization ∙ О чём говорит ∼100% CPU Utilization? – Как часто OS ставит процессы на исполнение. Профилирование? Профилирование покажет «ГДЕ» программа проводит время, без ответа на вопрос «ПОЧЕМУ». Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 10/65
  • 22. Кто виноват? Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 11/65
  • 23. Кто виноват? Сложная микроархитектура современных CPU: e.g. Sergey Kuksenko «Quantum Performance Effects» Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 11/65
  • 24. Кто виноват? Сложная микроархитектура современных CPU: ∙ Плохой алгоритм ⇒ 100% CPU ∙ Ждем данные из памяти ⇒ 100% CPU ∙ Откат из-за непредсказанного перехода ⇒ 100% CPU ∙ Сложные и дорогие операции ⇒ 100% CPU ∙ Не хватает ILP ⇒ 100% CPU ∙ и т.д. ⇒ 100% CPU Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 12/65
  • 25. Глава третья «Железные» счетчики HWC, PMU - WTF? Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 13/65
  • 26. PMU: Performance Monitoring Unit Performance Monitoring Unit - это встроенный хардверный профайлер внутри процессора. Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 14/65
  • 27. PMU: Performance Monitoring Unit Performance Monitoring Unit - это встроенный хардверный профайлер внутри процессора. Устройство PMU (за 21 день) : «Железные» счетчики (Hardware counters, HWC) считают происходящие события (Performance monitoring events) Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 14/65
  • 28. События Читаем документацию от производителя! (e.g. 2 страницы из 32) Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 15/65
  • 29. События Проблемы: ∙ Тысяча их! ∙ Требуют знания микроархитектуры ∙ Платформозависимые – сильно различаются у разных производителей CPU – могут сильно меняться у одного производителя при смене микроархитектуры ∙ Как с ними вообще работать? Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 16/65
  • 30. HWC HWC имеют два режима работы: ∙ Counting mode – if (случилось событие) ++counter; – общая диагностика (ответ на вопрос «ЧТО») ∙ Sampling mode – if (случилось событие) if (++counter < threshold ) INTERRUPT; – позволяет профилировать (ответ на вопрос «ГДЕ») Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 17/65
  • 31. HWC: Проблемы Событий много, счетчиков мало (e.g. Nehalem: 3 fixed HWC, 4 programmable) ∙ «multiple-running» (с разными событиями) – повторяемость приложения ∙ multiplexing (если тулы позволяют) – стабильность приложения (steady state) Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 18/65
  • 32. HWC: Проблемы (cont.) Sampling mode: ∙ «instruction skid» (невозможность точного связывания события и инструкции) ∙ Uncore events (e.g. у нас общий L3 cache на несколько ядер) Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 19/65
  • 33. HWC: использование ∙ валидация железа ∙ анализ производительности Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 20/65
  • 34. HWC: использование ∙ валидация железа ∙ анализ производительности ∙ run-time tuning (e.g. JRockit, etc.) ∙ security attacks и защита от них ∙ test code coverage ∙ etc. Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 20/65
  • 35. HWC: tools ∙ Oracle Solaris Studio Performance Analyzer ∙ perf (perf_events) (http://perf.wiki.kernel.org) ∙ JMH – perf mode – perfnorm mode (perf нормализованный на количество операций) – perfasm mode (perf + -XX:+PrintAssembly) Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 21/65
  • 36. HWC: tools(cont.) ∙ AMD CodeXL ∙ Intel Vtune Amplifier XE ∙ etc... Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 22/65
  • 37. События perf_events (e.g.) ∙ cycles ∙ instructions ∙ cache-references ∙ cache-misses ∙ branches ∙ branch-misses ∙ bus-cycles ∙ ref-cycles ∙ dTLB-loads ∙ dTLB-load-misses ∙ L1-dcache-loads ∙ L1-dcache-load-misses ∙ L1-dcache-stores ∙ L1-dcache-store-misses ∙ LLC-loads ∙ LLC-load-misses ∙ etc... Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 23/65
  • 38. События Oracle Studio (e.g.) ∙ cycles ∙ insts ∙ branch-instruction-retired ∙ branch-misses-retired ∙ dtlbm ∙ l1h ∙ l1m ∙ l2h ∙ l2m ∙ l3h ∙ l3m ∙ etc... Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 24/65
  • 39. Глава четвертая Я собрал данные HWC, и? или Введение в микроархитектурный анализ производительности Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 25/65
  • 40. Время работы 𝑡𝑖𝑚𝑒 = 𝑐𝑦𝑐𝑙𝑒𝑠 𝑓 𝑟𝑒𝑞𝑢𝑒𝑛𝑐𝑦 Оптимизация это уменьшение количества тактов (cycles)! ⋆ ⋆ все остальное - overclocking Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 26/65
  • 41. ГУМ Главное Уравнение Микроархитектуры: 𝑐𝑦𝑐𝑙𝑒𝑠 = 𝑃 𝑎𝑡ℎ𝐿𝑒𝑛𝑔𝑡ℎ * 𝐶𝑃 𝐼 = 𝑃 𝑎𝑡ℎ𝐿𝑒𝑛𝑔𝑡ℎ * 1 𝐼𝑃 𝐶 ∙ PathLength - количество инструкций ∙ CPI - cycles per instruction ∙ IPC - instructions per cycle Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 27/65
  • 42. 𝑃 𝑎𝑡ℎ𝐿𝑒𝑛𝑔𝑡ℎ * 𝐶𝑃 𝐼 ∙ PathLength - мера эффективности алгоритма (чем меньше, тем лучше) ∙ CPI - мера эффективности работы CPU (чем меньше, тем лучше) – 𝐶𝑃 𝐼 = 4 – плохо! – 𝐶𝑃 𝐼 = 1 ∙ Nehalem – сойдет! ∙ SandyBridge и позже – плоховатенько! – 𝐶𝑃 𝐼 = 0.4 – хорошо! – 𝐶𝑃 𝐼 = 0.2 – идеально! Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 28/65
  • 43. Что делать? ∙ низкий CPI – уменьшаем PathLength – «улучшаем эффективность алгоритма» ∙ большой CPI ⇒ stalls – memory stalls – «улучшаем эффективность структур данных» – branch stalls – «улучшаем логику передачи управления» – instruction dependency – «разрываем зависимости по данным» – long latency ops – «заменяем на полегче» – и т.д. Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 29/65
  • 44. Проблемы с CPI? Нам нужна классификация проблем! Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 30/65
  • 45. Memory bound ∙ dTLB misses ∙ L1,L2,L3,...,LN misses ∙ NUMA (чужая память) ∙ memory bandwidth ∙ sharing (false/true) ∙ cache line split (не бывает в Java, почти) ∙ store forwarding (маловероятно, да и все равно не исправить на Java уровне) ∙ 4k aliasing (попробуй поймать) Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 31/65
  • 46. Core bound ∙ long latency operations (DIV, SQRT) ∙ FP assist (floating points denormal, NaN, inf) ∙ bad speculation (вызывается непредсказанным переходом) ∙ port saturation (нам не нужно) Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 32/65
  • 47. Front-End bound ∙ iTLB miss ∙ iCache miss ∙ branch mispredict ∙ LSD (loop stream decoder) Можно решить, только если залезть в исходники HotSpot Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 33/65
  • 48. Примеры Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 34/65
  • 49. Пример первый Некий «большой» индустриальный Java бенчмарк Который до сих пор снится по ночам многим Java Performance инженерам Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 35/65
  • 50. Пример 1: perf stat -d 880851.993237 task -clock (msec) 39,318 context -switches 437 cpu -migrations 7,931 page -faults 2 ,275 ,263 ,113 ,376 cycles 1 ,226 ,299 ,634 ,877 instructions # 0.54 insns per cycle 229 ,500 ,265 ,931 branches # 260.544 M/sec 4 ,620 ,666 ,169 branch -misses # 2.01% of all branches 338 ,169 ,489 ,902 L1-dcache -loads # 383.912 M/sec 37 ,937 ,596 ,505 L1-dcache -load -misses # 11.22% of all L1-dcache hits 25 ,232 ,434 ,666 LLC -loads # 28.645 M/sec 7 ,307 ,884 ,874 L1-icache -load -misses # 0.00% of all L1 -icache hits 337 ,230 ,278 ,697 dTLB -loads # 382.846 M/sec 6 ,094 ,356 ,801 dTLB -load -misses # 1.81% of all dTLB cache hits 12 ,210 ,841 ,909 iTLB -loads # 13.863 M/sec 431 ,803 ,270 iTLB -load -misses # 3.54% of all iTLB cache hits 301.557213044 seconds time elapsed Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 36/65
  • 51. Пример 1: обработанный руками perf stat -d IPC 0.54 cycles ×1012 2.28 instructions ×1012 1.23 L1-dcache-loads ×109 338 L1-dcache-load-misses ×109 38 LLC-loads ×109 25 dTLB-loads ×109 337 dTLB-load-misses ×109 6 iTLB-loads ×109 12 iTLB-loads-misses ×106 432 Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 37/65
  • 52. Пример 1: обработанный руками perf stat -d IPC 0.54 cycles ×1012 2.28 instructions ×1012 1.23 L1-dcache-loads ×109 338 L1-dcache-load-misses ×109 38 LLC-loads ×109 25 dTLB-loads ×109 337 dTLB-load-misses ×109 6 iTLB-loads ×109 12 iTLB-loads-misses ×106 432 Проблемы? Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 37/65
  • 53. Пример 1: обработанный руками perf stat -d IPC 0.54 cycles ×1012 2.28 instructions ×1012 1.23 L1-dcache-loads ×109 338 L1-dcache-load-misses ×109 38 LLC-loads ×109 25 dTLB-loads ×109 337 dTLB-load-misses ×109 6 iTLB-loads ×109 12 iTLB-loads-misses ×106 432 Посчитаем: 4 × (338 × 109 )+ 12 × ((38 − 25) × 109 )+ 36 × (25 × 109 ) ≈ 2.4 × 1012 cycles ??? Проблемы? Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 37/65
  • 54. Пример 1: обработанный руками perf stat -d IPC 0.54 cycles ×1012 2.28 instructions ×1012 1.23 L1-dcache-loads ×109 338 L1-dcache-load-misses ×109 38 LLC-loads ×109 25 dTLB-loads ×109 337 dTLB-load-misses ×109 6 iTLB-loads ×109 12 iTLB-loads-misses ×106 432 Посчитаем: 4 × (338 × 109 )+ 12 × ((38 − 25) × 109 )+ 36 × (25 × 109 ) ≈ 2.4 × 1012 cycles ??? Superscalar in Action! Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 37/65
  • 55. Пример 1: обработанный руками perf stat -d IPC 0.54 cycles ×1012 2.28 instructions ×1012 1.23 L1-dcache-loads ×109 338 L1-dcache-load-misses ×109 38 LLC-loads ×109 25 dTLB-loads ×109 337 dTLB-load-misses ×109 6 iTLB-loads ×109 12 iTLB-loads-misses ×106 432 Проблемы! Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 37/65
  • 56. Пример 1: dTLB misses TLB = Translation Lookaside Buffer ∙ Кэш транслятора виртуальных адресов в физические ∙ Каждое обращение к памяти – обращение к TLB ∙ TLB miss может стоить сотни тактов Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 38/65
  • 57. Пример 1: dTLB misses TLB = Translation Lookaside Buffer ∙ Кэш транслятора виртуальных адресов в физические ∙ Каждое обращение к памяти – обращение к TLB ∙ TLB miss может стоить сотни тактов Как проверить: ∙ dtlb_load_misses_miss_causes_a_walk ∙ dtlb_load_misses_walk_duration Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 38/65
  • 58. Пример 1: dTLB misses IPC 0.54 cycles ×1012 2.28 instructions ×1012 1.23 L1-dcache-loads ×109 338 L1-dcache-load-misses ×109 38 LLC-loads ×109 25 dTLB-loads ×109 337 dTLB-load-misses ×109 6 iTLB-loads ×109 12 iTLB-loads-misses ×106 432 dTLB-walks-duration ×109 296 Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 39/65
  • 59. Пример 1: dTLB misses Что делать: ∙ LargePages (Huge pages) ∙ попытаться уменьшить «Working Set» Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 40/65
  • 60. Пример 1: -XX:+UseLargePages baseline raw IPC 0.54 0.64 cycles ×1012 2.28 2.28 instructions ×1012 1.23 1.46 L1-dcache-loads ×109 338 401 L1-dcache-load-misses ×109 38 38 LLC-loads ×109 25 25 dTLB-loads ×109 337 401 dTLB-load-misses ×109 6 0.24 iTLB-loads-misses ×106 432 27 dTLB-walks-duration ×109 296 2.6 Ускорение – 20% Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 41/65
  • 61. Пример 1: -XX:+UseLargePages baseline raw normalized IPC 0.54 0.64 0.64 cycles ×1012 2.28 2.28 1.9 instructions ×1012 1.23 1.46 1.22 L1-dcache-loads ×109 338 401 334 L1-dcache-load-misses ×109 38 38 32 LLC-loads ×109 25 25 21 dTLB-loads ×109 337 401 334 dTLB-load-misses ×109 6 0.24 0.20 iTLB-loads-misses ×106 432 27 23 dTLB-walks-duration ×109 296 2.6 2.2 Ускорение – 20% Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 41/65
  • 62. Пример второй Мы нашли горячий метод или О ⋆ применимости алгоритмических оптимизаций ⋆ О-обычное Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 42/65
  • 63. Пример 2: Very Hot Code public Matrix multiply(Matrix other) { int size = data.length; Matrix result = new Matrix(size); int [][] R = result.data; int [][] A = this.data; int [][] B = other.data; for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { int s = 0; for (int k = 0; k < size; k++) { s += A[i][k] * B[k][j]; } R[i][j] = s; } } return result; } Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 43/65
  • 64. Пример 2: Very Hot Code public Matrix multiply(Matrix other) { int size = data.length; Matrix result = new Matrix(size); int [][] R = result.data; int [][] A = this.data; int [][] B = other.data; for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { int s = 0; for (int k = 0; k < size; k++) { s += A[i][k] * B[k][j]; } R[i][j] = s; } } return result; } 𝑂( 𝑁3)⋆ ⋆ O-большое Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 43/65
  • 65. Пример 2: "Ok Google" 𝑂( 𝑁2.81) Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 44/65
  • 66. Пример 2: Very Hot Code N multiply strassen 32 33 𝜇𝑠 64 252 𝜇𝑠 128 3019 𝜇𝑠 2119 𝜇𝑠 256 32 𝑚𝑠 15 𝑚𝑠 512 488 𝑚𝑠 111 𝑚𝑠 1024 3270 𝑚𝑠 785 𝑚𝑠 2048 32 𝑠 6 𝑠 4096 309 𝑠 42 𝑠 8192 2611⋆ 𝑠 293 𝑠 time/op ⋆ 43 min 31 sec Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 45/65
  • 67. А если мы пойдем другим путем? Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 46/65
  • 68. Пример 2: JMH, -prof perfnorm, N=256 per multiplication per iteration CPI 1.06 cycles 146 × 106 8.7 instructions 137 × 106 8.2 L1-loads 68 × 106 4 L1-load-misses 33 × 106 2 L1-stores 0.56 × 106 L1-store-misses 38357 LLC-loads 26 × 106 1.6 LLC-stores 11595 Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 47/65
  • 69. Пример 2: Very Hot Code public Matrix multiply(Matrix other) { int size = data.length; Matrix result = new Matrix(size); int [][] R = result.data; int [][] A = this.data; int [][] B = other.data; for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { int s = 0; for (int k = 0; k < size; k++) { s += A[i][k] * B[k][j] ; } R[i][j] = s; } } return result; } L1-dcache-load-misses Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 48/65
  • 70. Пример 2: Very Hot Code public Matrix multiply(Matrix other) { int size = data.length; Matrix result = new Matrix(size); int [][] R = result.data; int [][] A = this.data; int [][] B = other.data; for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { int s = 0; for (int k = 0; k < size; k++) { s += A[i][k] * B[k][j] ; } R[i][j] = s; } } return result; } Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 48/65
  • 71. Пример 2: Very Hot Code public Matrix multiplyIKJ(Matrix other) { int size = data.length; Matrix result = new Matrix(size); int [][] R = result.data; int [][] A = this.data; int [][] B = other.data; for (int i = 0; i < size; i++) { for (int k = 0; k < size; k++) { int aik = A[i][k]; for (int j = 0; j < size; j++) { R[i][j] += aik * B[k][j]; } } } return result; } Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 49/65
  • 72. Пример 2: Very Hot Code IJK IKJ N multiply strassen multiply 32 33 𝜇𝑠 13 𝜇𝑠 64 252 𝜇𝑠 80 𝜇𝑠 128 3019 𝜇𝑠 2119 𝜇𝑠 464 𝜇𝑠 256 32 𝑚𝑠 15 𝑚𝑠 4 𝑚𝑠 512 488 𝑚𝑠 111 𝑚𝑠 29 𝑚𝑠 1024 3270 𝑚𝑠 785 𝑚𝑠 369 𝑚𝑠 2048 32 𝑠 6 𝑠 3.4 𝑠 4096 309 𝑠 42 𝑠 25 𝑠 8192 2611 𝑠 293 𝑠 210 𝑠 time/op Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 50/65
  • 73. Пример 2: Very Hot Code IJK IKJ N multiply strassen multiply strassen 32 33 𝜇𝑠 13 𝜇𝑠 64 252 𝜇𝑠 80 𝜇𝑠 128 3019 𝜇𝑠 2119 𝜇𝑠 464 𝜇𝑠 256 32 𝑚𝑠 15 𝑚𝑠 4 𝑚𝑠 512 488 𝑚𝑠 111 𝑚𝑠 29 𝑚𝑠 25 𝑚𝑠 1024 3270 𝑚𝑠 785 𝑚𝑠 369 𝑚𝑠 192 𝑚𝑠 2048 32 𝑠 6 𝑠 3.4 𝑠 1.4 𝑠 4096 309 𝑠 42 𝑠 25 𝑠 10 𝑠 8192 2611 𝑠 293 𝑠 210 𝑠 73 𝑠 time/op Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 50/65
  • 74. Пример 2: JMH, -prof perfnorm, N=256 IJK IKJ multiply iteration multiply iteration CPI 1.06 0.51 cycles 146 × 106 8.7 9.7 × 106 0.6 instructions 137 × 106 8.2 19 × 106 1.1 L1-loads 68 × 106 4 5.4 × 106 0.3 L1-load-misses 33 × 106 2 1.1 × 106 0.1 L1-stores 0.56 × 106 2.7 × 106 0.2 L1-store-misses 38357 8959 LLC-loads 26 × 106 1.6 0.3 × 106 LLC-stores 11595 3532 Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 51/65
  • 75. Пример 2: Дополнительные плюшки! cycles insts ... 6.42% 5.54% 0x00007ff6591d20c5: vmovdqu %ymm1 ,0x10(%r14 ,%rbx ,4) ;* iastore 9.49% 11.91% 0x00007ff6591d20cc: add $0x8 ,%ebx ;*iinc 0.15% 0.05% 0x00007ff6591d20cf: cmp %r11d ,%ebx 0x00007ff6591d20d2: jl 0x00007ff6591d20b2 ;* if_icmpge ... Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 52/65
  • 76. Пример 2: Дополнительные плюшки! cycles insts ... 6.42% 5.54% 0x00007ff6591d20c5: vmovdqu %ymm1 ,0x10(%r14 ,%rbx ,4) ;* iastore 9.49% 11.91% 0x00007ff6591d20cc: add $0x8 ,%ebx ;*iinc 0.15% 0.05% 0x00007ff6591d20cf: cmp %r11d ,%ebx 0x00007ff6591d20d2: jl 0x00007ff6591d20b2 ;* if_icmpge ... Векторизация (SSE/AVX)! Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 52/65
  • 77. Пример третий «++ на оба ваши треда» Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 53/65
  • 78. Пример 3: False Sharing @State(Scope.Group) public static class StateBaseline { int field0; int field1; } @Benchmark @Group("baseline") public int justDoIt(StateBaseline s) { return s.field0 ++; } @Benchmark @Group("baseline") public int doItFromOtherThread(StateBaseline s) { return s.field1 ++; } Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 54/65
  • 79. Пример 3: измерим что общего sharing padded Same Core (HT) L1 9.5 4.9 Diff Cores (within socket) L3 (LLC) 10.6 2.8 Diff Sockets ничего 18.2 2.8 average time, ns/op Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 55/65
  • 80. Пример 3: соберем HWC Данные нормализованы на 103 операций Same Core Diff Cores Diff Sockets sharing padded sharing padded sharing padded CPI 1.3 0.7 1.4 0.4 1.7 0.4 cycles 33130 17536 36012 9163 46484 9608 instructions 26418 25865 26550 25747 26717 25768 L1-loads 12593 9467 9696 8973 9672 9016 L1-load-misses 10 5 12 4 33 3 L1-stores 4317 7838 7433 4069 6935 4074 L1-store-misses 5 2 161 2 55 1 Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 56/65
  • 81. Пример 3: соберем HWC (продолжение) Данные нормализованы на 103 операций Same Core Diff Cores Diff Sockets sharing padded sharing padded sharing padded LLС-loads 4 3 58 1 32 1 LLC-load-misses 1 1 53 ≈0 35 ≈0 LLC-stores 1 1 183 ≈0 49 ≈0 LLC-store-misses 1 ≈0 182 ≈0 48 ≈0 Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 57/65
  • 82. Пример 3: На честном слове и на одном ядре для одного ядра нам нужно считать MACHINE_CLEARS.MEMORY_ORDERING Same Core Diff Cores Diff Sockets sharing padded sharing padded sharing padded CPI 1.3 0.7 1.4 0.4 1.7 0.4 cycles 33130 17536 36012 9163 46484 9608 instructions 26418 25865 26550 25747 26717 25768 CLEARS 238 ≈0 ≈0 ≈0 ≈0 ≈0 Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 58/65
  • 83. Пример 3: разные ядра L2_STORE_LOCK_RQSTS - L2 RFOs breakdown Diff Cores Diff Sockets sharing padded sharing padded CPI 1.4 0.4 1.7 0.4 LLC-stores 183 ≈0 49 ≈0 LLC-store-misses 182 ≈0 48 ≈0 L2_STORE_LOCK_RQSTS.MISS 134 ≈0 33 ≈0 L2_STORE_LOCK_RQSTS.HIT_E ≈0 ≈0 ≈0 ≈0 L2_STORE_LOCK_RQSTS.HIT_M ≈0 ≈0 ≈0 ≈0 L2_STORE_LOCK_RQSTS.ALL 183 ≈0 49 ≈0 Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 59/65
  • 84. Внимание! Вопрос в зал! Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 60/65
  • 85. Пример 3: разные ядра Diff Cores Diff Sockets sharing padded sharing padded CPI 1.4 0.4 1.7 0.4 LLC-stores 183 ≈0 49 ≈0 LLC-store-misses 182 ≈0 48 ≈0 L2_STORE_LOCK_RQSTS.MISS 134 ≈0 33 ≈0 L2_STORE_LOCK_RQSTS.ALL 183 ≈0 49 ≈0 Почему 183 > 49 и 134 > 33, а все равно работает быстрее? Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 61/65
  • 86. Пример 3: события считающие длительность Есть и такое событие: OFFCORE_REQUESTS_OUTSTANDING.CYCLES_WITH_DEMAND_RFO Diff Cores Diff Sockets sharing padded sharing padded CPI 1.4 0.4 1.7 0.4 cycles 36012 9163 46484 9608 instructions 26550 25747 26717 25768 ORO.SWD_RFO 21723 10 29601 56 Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 62/65
  • 87. Заключение: Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 63/65
  • 88. Заключение: Учиться, учиться и учиться! Изучаем микроархитектуру: ∙ “Computer Architecture: A Quantitative Approach” John L. Hennessy, David A. Patterson ∙ http://www.agner.org/optimize/ ∙ http://www.google.com/search?q=Hardware+ performance+counter Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 64/65
  • 89. Q & A ? Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 65/65