Developing high load systems using C++

36
Разработка high-load систем на C++ Иван Романенко([email protected] )

Transcript of Developing high load systems using C++

Page 1: Developing high load systems using C++

Разработка high-load систем на C++

Иван Романенко([email protected])

Page 2: Developing high load systems using C++

Что значат эти числа ?

• 0,1 милисекунда (1 ∗ 10−4)

• 4KB * 10 000 = 40 MB/sec = 320 Mb/sec

• 40 MB/sec * 5 tick/byte = 0,2 GHz (tick/sec)

• 0,2 GHz = 10% CPU Time

10 000 req/sec это:

Page 3: Developing high load systems using C++

Что значат эти числа ?

• 2GHz / 5 tick/byte = 400 MB/s = 3,2 Gb/s

• 400MB/s / 10 000 req/s = 40 KB/req

10 000 req/sec предел:

Page 4: Developing high load systems using C++

Обычный процесс

1. Поиск хот-спотов на текущем билде

2. Исправление в коде

3. Проверка улучшения на новом билде

rev 1Данные Замер 1

Данные Замер 2rev 2

Page 5: Developing high load systems using C++

Что делать, когданевозможно имитировать окружение

• Состояние ОС:

– большой объём временных данных

– много вызовов OS API

• Состяние продукта:

– большая система

– много 3rd party либ

Page 6: Developing high load systems using C++

Нельзя войти в одну и ту же реку дважды

Page 7: Developing high load systems using C++

Всё связанно

Page 8: Developing high load systems using C++

Запуск с одинаковыми данными

Данные

Замер 1

Замер 2

algo rev 1

algorev 2

Build

Page 9: Developing high load systems using C++

Варианты решения

• DLL

• Copy/Pase сорцов

• Архитектурно:

–Наследование

–Шаблоны

Page 10: Developing high load systems using C++

Хочу, чтобы :

• Минимальная связность

• Без виртуальных таблиц

• Конвейер как основа

• Лёгкая сборка набора алгоритмов

Page 11: Developing high load systems using C++
Page 12: Developing high load systems using C++

Пример использования

Page 13: Developing high load systems using C++

Инструментация

Page 14: Developing high load systems using C++

Причины:

• Профайлер недоступен:

– лицензия

– платформа

– баги профайлера

• Проблема inline

Page 15: Developing high load systems using C++

Код

Page 16: Developing high load systems using C++

Метрики

• Thread UserTime

• GetTickCount

• _rdtsc

• GetSystemTime

Гранулярность

Пересечение с чужимипотоками и процессами

Виртуализация

Page 17: Developing high load systems using C++

Анализ окружения

Page 18: Developing high load systems using C++

Windows API density

Page 19: Developing high load systems using C++

boost.statistics

Page 20: Developing high load systems using C++

Анализ своего кода

Page 21: Developing high load systems using C++

Недоверие средним

Page 22: Developing high load systems using C++

Поиск своих метрикпроизводительности

Page 23: Developing high load systems using C++

CPU core usage

Page 24: Developing high load systems using C++

CPU core usage

Page 25: Developing high load systems using C++

CPU core usage

Page 26: Developing high load systems using C++

Тактов на байт

Page 27: Developing high load systems using C++

Приоритеты

• Потребление CPU

• Потребление памяти

• Время отклика

• Время работы от батареи

Dev User

Page 28: Developing high load systems using C++
Page 29: Developing high load systems using C++

Зло

• Аллокации

• Синхронизация

• Копирование памяти

Page 30: Developing high load systems using C++

ExAllocateFromPagedLookasideList()

Page 31: Developing high load systems using C++

Фиксированный размер блока

Динамический размер блока

Борьба с потерями на аллокациях

ExAllocateFromPagedLookasideList()

Low Fragmentation Heap

Page 32: Developing high load systems using C++

LFH

(c) David B. Probert, Ph.D. Windows Kernel Development Microsoft Corporation

Page 33: Developing high load systems using C++

Фиксированный размер блока

Динамический размер блока

Борьба с потерями на аллокациях

ExAllocateFromPagedLookasideList()

Low Fragmentation Heap

allocator from TBB, PPL, boost, …

TLSPer thread list

Page 34: Developing high load systems using C++

Борьба с потерями при синхронизации

• Лучшая синхронизация – её отсутсвие

• TLS

• Больше локов

• Докажи! / Перепроверяй

Page 35: Developing high load systems using C++
Page 36: Developing high load systems using C++

Спасибо за внимание