Трудовые будни инженера производительности

76
© 2015 NetCracker Technology Corporation Confidential Трудовые будни performance engineer Владимир Ситников jokerconf university 2015

Upload: vladimir-sitnikov

Post on 07-Jan-2017

896 views

Category:

Engineering


5 download

TRANSCRIPT

Page 1: Трудовые будни инженера производительности

© 2015 NetCracker Technology Corporation Confidential

Трудовые будни performance engineer

Владимир Ситниковjokerconf university 2015

Page 2: Трудовые будни инженера производительности

2© 2015 NetCracker Technology Corporation Confidential

Кто я

• Владимир Ситников• Инженер-ускорятор в NetCracker• [email protected]• @VladimirSitnikv

Page 3: Трудовые будни инженера производительности

3© 2015 NetCracker Technology Corporation Confidential

Характерные требования в enterprise

• Время отклика‒ 100мс … 1с … 1ч

• Частота выполнений‒ 1/день … 1/с … 100/с

• Объём обрабатываемых данных‒ 10КиБ … 1Миб … 1ГиБ

Page 4: Трудовые будни инженера производительности

4© 2015 NetCracker Technology Corporation Confidential

Основная ошибка при проверке производительности

Проверку требований нужно выполнять на приближенных к боевым условиях

Page 5: Трудовые будни инженера производительности

5© 2015 NetCracker Technology Corporation Confidential

Основная ошибка при проверке производительности

Проверку требований нужно выполнять на приближенных к боевым условиях• Та же версия java, OS, application server

Page 6: Трудовые будни инженера производительности

6© 2015 NetCracker Technology Corporation Confidential

Основная ошибка при проверке производительности

Проверку требований нужно выполнять на приближенных к боевым условиях• Та же версия java, OS, application server• Тот же объём данных

Page 7: Трудовые будни инженера производительности

7© 2015 NetCracker Technology Corporation Confidential

Основная ошибка при проверке производительности

Проверку требований нужно выполнять на приближенных к боевым условиях• Та же версия java, OS, application server• Тот же объём данных• Та же входная нагрузка

Page 8: Трудовые будни инженера производительности

8© 2015 NetCracker Technology Corporation Confidential

Основная ошибка при проверке производительности

Проверку требований нужно выполнять на приближенных к боевым условиях• Та же версия java, OS, application server• Тот же объём данных• Та же входная нагрузка• Тот же процент ошибочных сценариев

Page 9: Трудовые будни инженера производительности

9© 2015 NetCracker Technology Corporation Confidential

Проблемы в Production• Создан работающий код

• Пройдено тестирование

Page 10: Трудовые будни инженера производительности

10© 2015 NetCracker Technology Corporation Confidential

Проблемы в Production• Создан работающий код

• Пройдено тестирование

• Production Проблемы производительности, недоступность приложения, и т.п.

Page 11: Трудовые будни инженера производительности

11© 2015 NetCracker Technology Corporation Confidential

Проблемы в Production• Создан работающий код

• Пройдено тестирование

• Production Проблемы производительности, недоступность приложения, и т.п.

• Customer Support передает проблему в System Performance

Page 12: Трудовые будни инженера производительности

12© 2015 NetCracker Technology Corporation Confidential

Проблемы в Production• Создан работающий код

• Пройдено тестирование

• Production Проблемы производительности, недоступность приложения, и т.п.

• Customer Support передает проблему в System Performance

• SP находит причину, и автор кода о ней не знает

Page 13: Трудовые будни инженера производительности

13© 2015 NetCracker Technology Corporation Confidential

Сложение строк

• StringBuilder vs StringBuffer

• String + String vs SB.append

Page 14: Трудовые будни инженера производительности

14© 2015 NetCracker Technology Corporation Confidential

Сложение строк

• StringBuilder vs StringBuffer• Без разницы

• String + String vs SB.append• В циклах лучше SB

Page 15: Трудовые будни инженера производительности

15© 2015 NetCracker Technology Corporation Confidential

Когда же нужен StringB***er?

String res = ""; String names[] = ...; for(int i=0; i<length; i++) { res += (i==0 ? "" : ", ") + names[i]; }

StringBuilder полезен в циклах/if’ах

Page 16: Трудовые будни инженера производительности

16© 2015 NetCracker Technology Corporation Confidential

Когда же нужен StringB***er?

String res = ""; String names[] = ...; for(int i=0; i<length; i++) { res += new SB() .append(i==0 ? "" : ", ") .append(names[i]).toString(); }

StringBuilder полезен в циклах/if’ах

Page 17: Трудовые будни инженера производительности

17© 2015 NetCracker Technology Corporation Confidential

Когда же нужен StringB***er?

StringBuilder res = new StringBuilder(); String names[] = ...; for(int i=0; i<length; i++) { res .append(i==0 ? "" : ", ") .append(names[i]); }

StringBuilder полезен в циклах/if’ах

Page 18: Трудовые будни инженера производительности

18© 2015 NetCracker Technology Corporation Confidential

Добавляем вишенку

StringBuilder res = new StringBuilder(100500); String names[] = ...; for(int i=0; i<length; i++) { res .append(i==0 ? "" : ", ") .append(names[i]); }

StringBuilder полезен в циклах/if’ах

Page 19: Трудовые будни инженера производительности

19© 2015 NetCracker Technology Corporation Confidential

GC друг или враг?

• Основная масса проблем с java в enterprise – java GC или OS swap

Page 20: Трудовые будни инженера производительности

20© 2015 NetCracker Technology Corporation Confidential

GC друг или враг?

• Основная масса проблем с java в enterprise – java GC или OS swap

• Для анализа всегда сохраняем логи работы GC: -Xloggc

Page 21: Трудовые будни инженера производительности

21© 2015 NetCracker Technology Corporation Confidential

GC друг или враг?

• Основная масса проблем с java в enterprise – java GC или OS swap

• Для анализа всегда сохраняем логи работы GC: -Xloggc

• Открываем программой GCViewer

Page 22: Трудовые будни инженера производительности

22© 2015 NetCracker Technology Corporation Confidential

GC друг или враг?

• Основная масса проблем с java в enterprise – java GC или OS swap

• Для анализа всегда сохраняем логи работы GC: -Xloggc

• Открываем программой GCViewer

• GC наносит ответный удар: лог пишется синхронно• Не стоит размещать gc.log на сетевых дисках (NFS):

http://mail.openjdk.java.net/pipermail/hotspot-gc-use/2014-April/001849.html

Page 23: Трудовые будни инженера производительности

23© 2015 NetCracker Technology Corporation Confidential

GCViewer: пример случая, когда «всё пропало»

• Без GC логов не понять хватило ли памяти

Page 24: Трудовые будни инженера производительности

24© 2015 NetCracker Technology Corporation Confidential

Где может встретиться regexp

• «Маскирование» (~засекречивание) данных: pin коды, номера карт, …

• Обработка XML: логирование, проверка success/fail, …

• Много где ещё

Page 25: Трудовые будни инженера производительности

25© 2015 NetCracker Technology Corporation Confidential

Решили использовать regexp

Стоит избегать .*, .+ и подобных не специфичных конструкцийhttp://www.regular-expressions.info/catastrophic.html

Page 26: Трудовые будни инженера производительности

26© 2015 NetCracker Technology Corporation Confidential

Решили использовать regexp

Стоит избегать .*, .+ и подобных не специфичных конструкцийhttp://www.regular-expressions.info/catastrophic.html

Пример медленного выражения:Pattern.compile(

"<(\\S+:)?processID.*>(\\d+)</(\\S+:)?processID>"

Page 27: Трудовые будни инженера производительности

27© 2015 NetCracker Technology Corporation Confidential

Решили использовать regexp

Стоит избегать .*, .+ и подобных не специфичных конструкцийhttp://www.regular-expressions.info/catastrophic.html

Пример медленного выражения:Pattern.compile(

"<(\\S+:)?processID.*>(\\d+)</(\\S+:)?processID>"

Встречались экземпляры, работающие 30 секунд на 100КиБ строкеВстречались SQL запросы, работающие по 30 минут вместо 30 секунд

Page 28: Трудовые будни инженера производительности

28© 2015 NetCracker Technology Corporation Confidential

/^.*ab$/.match("ab")

|ab.*ab

a|b.*ab

ab|.*ab

ab|.*ab

a|b.*abоткатились

a|b.*abне помогло

|ab.*abоткатились

ab|.*abУра!

.* – жадная конструкция. Ест как не в себя

Page 29: Трудовые будни инженера производительности

29© 2015 NetCracker Technology Corporation Confidential

Чиним

Стоит избегать .*, .+ и подобных неспецифичных конструкцийhttp://www.regular-expressions.info/catastrophic.html

Пример быстрого выражения:Pattern.compile(

"[:<]processID[^>]*>(\\d+)</([^>:]+:)?processID>"

Решение: [^>]* и [^>:]+ остановятся на первом неподходящем символе. За границу xml тэга наш regexp не уйдёт.

Page 30: Трудовые будни инженера производительности

30© 2015 NetCracker Technology Corporation Confidential

Чиним ещё чуть-чуть

Добавляем плюсик для отмены откатов:Pattern.compile(

"[:<]processID[^>]*+>(\\d+)</([^>:]++:)?processID>“

Меньше вариантов на проверку – быстрее работает

Page 31: Трудовые будни инженера производительности

31© 2015 NetCracker Technology Corporation Confidential

График скорости .*, .*?, [^>]

1 КиБ 2 КиБ 3 КиБ 4 КиБ0

50100150200250300350

.*

.*?[^>]*

Быст

рее,

оп/

мс

Page 32: Трудовые будни инженера производительности

32© 2015 NetCracker Technology Corporation Confidential

График скорости .*, .*?, [^>], шаблон не найден

1 КиБ 2 КиБ 3 КиБ 4 КиБ0

10

20

30

40

50

.*

.*?[^>]*

Быст

рее,

оп/

мс

Поиск тормозил, т.к. шаблон не нашёлся

Page 33: Трудовые будни инженера производительности

33© 2015 NetCracker Technology Corporation Confidential

График скорости .*, .*, [^>], шаблон не найден

1 КиБ 2 КиБ 3 КиБ 4 КиБ0

20

40

60

80

100

.*

.*?[^>]*(?>

Быст

рее,

оп/

мс <ROW>(?>.*?<RSACCTNMBR>)(?>[^<]*</RSACCTNMBR>)…

Page 34: Трудовые будни инженера производительности

34© 2015 NetCracker Technology Corporation Confidential

Признаки хорошего регулярного выражения

• Кушает только нужные символы• [^>]* vs .*• .(!=hello)

Page 35: Трудовые будни инженера производительности

35© 2015 NetCracker Technology Corporation Confidential

Признаки хорошего регулярного выражения

• Кушает только нужные символы• [^>]* vs .*• .(!=hello)

• Не содержит лишних конструкций• <MAC\\d{5} vs (<MAC\\d{5}\\s)

Page 36: Трудовые будни инженера производительности

36© 2015 NetCracker Technology Corporation Confidential

Признаки хорошего регулярного выражения

• Кушает только нужные символы• [^>]* vs .*• .(!=hello)

• Не содержит лишних конструкций• <MAC\\d{5} vs (<MAC\\d{5}\\s)

• Не выполняется вообще• Например, если мы маскируем значения, то делать это нужно только если реально

выводим данные• Если XML всё равно парсить, то стоит посмотреть на XPath

Page 37: Трудовые будни инженера производительности

37© 2015 NetCracker Technology Corporation Confidential

А давайте ускорим String?

String.format("...") использует java.util.regex.Pattern для разбора формата

formatSpecifier = "%(\\d+\\$)?([-#+ 0,(\\<]*)?(\\d+)?(\\.\\d+)?([tT])?([a-zA-Z%])";

Page 38: Трудовые будни инженера производительности

38© 2015 NetCracker Technology Corporation Confidential

Откуда взять тестовые данные?

Возьмём шаблон из Java Microbenchmark Harness:

(min, avg, max) = (%s, %s, %s), stdev = %s%n CI (99.9%%): [%s, %s] (assumes normal distribution)

Page 39: Трудовые будни инженера производительности

39© 2015 NetCracker Technology Corporation Confidential

Добавляем плюсов по вкусу

formatSpecifier = "%(\\d+\\$)?([-#+ 0,(\\<]*)?(\\d+)?(\\.\\d+)?([tT])?([a-zA-Z%])";

fastSpecifier = "%(\\d++\\$)?+([-#+ 0,(\\<]+)?+(\\d++)?+(\\.\\d++)?+([tT])?+([a-zA-Z%])";

Page 40: Трудовые будни инженера производительности

40© 2015 NetCracker Technology Corporation Confidential

Бесплатный сыр

Benchmark Cnt Score Error Unitsjdk18u45 60 1,067 ± 0,025 us/opoptimized 60 0,917 ± 0,021 us/op

Page 41: Трудовые будни инженера производительности

41© 2015 NetCracker Technology Corporation Confidential

HashMap$Entry

• HashMap создаёт вспомогательные Entry объекты для хранения связки ключ-значение

Page 42: Трудовые будни инженера производительности

42© 2015 NetCracker Technology Corporation Confidential

HashMap$Entry

• HashMap создаёт вспомогательные Entry объекты для хранения связки ключ-значение

• Если большинство ключей оказываются одинаковыми, то очень хочется не хранить ключи в каждом отдельном объекте Map

Page 43: Трудовые будни инженера производительности

43© 2015 NetCracker Technology Corporation Confidential

HashMap

HashMap Entry[]

Entryid

41

Entryname

qwe

Page 44: Трудовые будни инженера производительности

44© 2015 NetCracker Technology Corporation Confidential

HashMap: entry лишние

HashMap Entry[]

Entryid

41

Entryname

qwe

Page 45: Трудовые будни инженера производительности

45© 2015 NetCracker Technology Corporation Confidential

HashMap

HashMap Entry[]

Entryid

41

Entryname

qwe

Page 46: Трудовые будни инженера производительности

46© 2015 NetCracker Technology Corporation Confidential

CompactMap

CMap1 Object[]41

qwe

CMap2

keyposid=0

name=1

Object[]42

rty

Page 47: Трудовые будни инженера производительности

47© 2015 NetCracker Technology Corporation Confidential

CompactHashMap: границы применимости

• Работает, если форма (состав ключей) у многих объектов одинаковая• Например, у всех объектов есть запись “width”=“100%”

• https://github.com/vlsi/compactmap• См. v8/design.html#prop_access

Page 48: Трудовые будни инженера производительности

48© 2015 NetCracker Technology Corporation Confidential

CompactHashMap: первые тесты

HashMap -> CompactHashMap в реальном проекте:

• 500МиБ –> 290МиБ• 3.0 сек / 1M обращений -> 150 сек / 1M обращений

Page 49: Трудовые будни инженера производительности

49© 2015 NetCracker Technology Corporation Confidential

CompactHashMap

HashMap -> CompactHashMap в реальном проекте:

• 500МиБ –> 290МиБ• 3.0 сек / 1M обращений -> 150 сек / 1M обращений

Page 50: Трудовые будни инженера производительности

50© 2015 NetCracker Technology Corporation Confidential

ReservedCodeCacheSize

• Если у JIT компилятора заканчивается память, то он перестаёт компилировать

Page 51: Трудовые будни инженера производительности

51© 2015 NetCracker Technology Corporation Confidential

ReservedCodeCacheSize

• Если у JIT компилятора заканчивается память, то он перестаёт компилировать

• В приложении с большим количеством кода стандартных 64M мало

Page 52: Трудовые будни инженера производительности

52© 2015 NetCracker Technology Corporation Confidential

ReservedCodeCacheSize

• Если у JIT компилятора заканчивается память, то он перестаёт компилировать

• В приложении с большим количеством кода стандартных 64M мало

• -XX:+ReservedCodeCacheSize=128m/192m

Page 53: Трудовые будни инженера производительности

53© 2015 NetCracker Technology Corporation Confidential

CompactHashMap

HashMap -> CompactHashMap, -XX:+ReservedCodeCacheSize=128m:

• 500МиБ –> 290МиБ• 3.0 сек / 1M обращений -> 3.5 сек / 1M обращений

Page 54: Трудовые будни инженера производительности

54© 2014 NetCracker Technology Corporation Confidential

SQL

Page 55: Трудовые будни инженера производительности

55© 2015 NetCracker Technology Corporation Confidential

Типичные проблемы в SQL

• Выборка лишних данных• max(order_number)+1, count(*)>0, большая иерархия

• Нет ясного порядка выполнения запроса• Лишние таблицы в части FROM• Неверное использование связанных переменных

Page 56: Трудовые будни инженера производительности

56© 2015 NetCracker Technology Corporation Confidential

Типичные проблемы в SQL

• Выборка лишних данных• max(order_number)+1, count(*)>0, большая иерархия

• Нет ясного порядка выполнения запроса• Лишние таблицы в части FROM• Неверное использование связанных переменных

Page 57: Трудовые будни инженера производительности

57© 2015 NetCracker Technology Corporation Confidential

Один запрос – один правильный план выполнения

1. В “Folder for Orders” найти Order, ссылающийся на нужный Instance

Как бы решал человек:

2. По ссылкам находим ордера, и проверяем Folder

Page 58: Трудовые будни инженера производительности

58© 2015 NetCracker Technology Corporation Confidential

Один запрос – один правильный план выполнения

2. В “Service Order’е” найти компоненту, ссылающуюся на нужный Template

Как бы решал человек:

3. Находим дочерние компоненты и проверяем Template

10

101

Page 59: Трудовые будни инженера производительности

59© 2015 NetCracker Technology Corporation Confidential

Один запрос – один правильный план выполненияЗадачи:

1. В “Folder for Service Orders” найти Service Order, ссылающийся на нужный Service Instance

2. В “Service Order’е” найти компоненту, ссылающуюся на нужный Template

В обоих случаях может получиться одинаковый запрос (например, EAV):select o.object_id from objects o, references ref where o.parent_id = :1 and o.object_id = ref.object_id and ref.reference = :2 and ref.property = :3

Page 60: Трудовые будни инженера производительности

60© 2015 NetCracker Technology Corporation Confidential

Один запрос – один правильный план выполнения

• Разработчик должен хотя бы задумываться о плане выполнения• Без explain plan никуда

Page 61: Трудовые будни инженера производительности

61© 2015 NetCracker Technology Corporation Confidential

Один запрос – один правильный план выполнения

• Разработчик должен хотя бы задумываться о плане выполнения• Без explain plan никуда

• Если в запросе несколько условий, то хинты обязательны

Page 62: Трудовые будни инженера производительности

62© 2015 NetCracker Technology Corporation Confidential

Один запрос – один правильный план выполнения

• Разработчик должен хотя бы задумываться о плане выполнения• Без explain plan никуда

• Если в запросе несколько условий, то хинты обязательны

• Основные хинты:• leading(a b c) – указываем с каких таблиц начинать

выполнение запроса• index(o index_name) – указываем какой индекс нужно

использовать• no_merge – запрещаем раскрывать подзапросы• use_nl/use_hash – основные способы объединения таблиц

Page 63: Трудовые будни инженера производительности

63© 2015 NetCracker Technology Corporation Confidential

А нужны ли хинты?

• База умная,сама ускорит запросы

Page 64: Трудовые будни инженера производительности

64© 2015 NetCracker Technology Corporation Confidential

А нужны ли хинты?

• База умная, статистику собрали,сама ускорит запросы

Page 65: Трудовые будни инженера производительности

65© 2015 NetCracker Technology Corporation Confidential

А нужны ли хинты?

• База умная, статистику собрали, собираем статистику регулярно,запросы сами будут хорошие

Page 66: Трудовые будни инженера производительности

66© 2015 NetCracker Technology Corporation Confidential

А нужны ли хинты?

• База умная, статистику собрали, собираем статистику регулярно,запросы сами будут хорошиебаза не понимает бизнес-смысл

• Без хинтов не взлетит

Page 67: Трудовые будни инженера производительности

67© 2015 NetCracker Technology Corporation Confidential

А нужна ли тогда статистика?

• Если всё равно хинты, то зачем статистика?

Page 68: Трудовые будни инженера производительности

68© 2015 NetCracker Technology Corporation Confidential

А нужна ли тогда статистика?

• Если всё равно хинты, то зачем статистика?

Page 69: Трудовые будни инженера производительности

69© 2015 NetCracker Technology Corporation Confidential

А нужна ли тогда статистика?

• Если всё равно хинты, то зачем статистика?• Повторяемость production и dev/test

окружений

Page 70: Трудовые будни инженера производительности

70© 2015 NetCracker Technology Corporation Confidential

А нужна ли тогда статистика?

• Если всё равно хинты, то зачем статистика?• Повторяемость production и dev/test

окружений• Отсутствие out-of-thin air проблем

Page 71: Трудовые будни инженера производительности

71© 2015 NetCracker Technology Corporation Confidential

А как же любимые cost/rows?

• База оценивает количество строк на основе собранной статистики

Page 72: Трудовые будни инженера производительности

72© 2015 NetCracker Technology Corporation Confidential

А как же любимые cost/rows?

• База оценивает количество строк на основе собранной статистики

• В статистику входят• Общее количество строк• Количество уникальных записей в колонке• Количество null записей в колонке

Page 73: Трудовые будни инженера производительности

73© 2015 NetCracker Technology Corporation Confidential

А как же любимые cost/rows?

• База оценивает количество строк на основе собранной статистики

• В статистику входят• Общее количество строк• Количество уникальных записей в колонке• Количество null записей в колонке

• Rows – оценка базы о том, сколько строк вернёт запрос

• Cost – оценка базы о том, сколько дисковых операций потребуется для выполнения запроса

Page 74: Трудовые будни инженера производительности

74© 2015 NetCracker Technology Corporation Confidential

А как же любимые cost/rows?

• База оценивает количество строк на основе собранной статистики

• В статистику входят• Общее количество строк• Количество уникальных записей в колонке• Количество null записей в колонке• Бизнес-смысл данных в статистику не входит!

• Rows – оценка базы о том, сколько строк вернёт запрос

• Cost – оценка базы о том, сколько дисковых операций потребуется для выполнения запроса

Page 75: Трудовые будни инженера производительности

75© 2015 NetCracker Technology Corporation Confidential

Кто я

• Владимир Ситников• Инженер-ускорятор в NetCracker• [email protected]• @VladimirSitnikv

Page 76: Трудовые будни инженера производительности

Спасибо

76© 2014 NetCracker Technology Corporation Confidential