developing high load systems using c++

Post on 15-Jul-2015

115 Views

Category:

Technology

7 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

Иван Романенко(viva.cpp@gmail.com)

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

• 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 это:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Всё связанно

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

Данные

Замер 1

Замер 2

algo rev 1

algorev 2

Build

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

• DLL

• Copy/Pase сорцов

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

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

–Шаблоны

Хочу, чтобы :

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

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

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

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

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

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

Причины:

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

– лицензия

– платформа

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

• Проблема inline

Код

Метрики

• Thread UserTime

• GetTickCount

• _rdtsc

• GetSystemTime

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

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

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

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

Windows API density

boost.statistics

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

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

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

CPU core usage

CPU core usage

CPU core usage

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

Приоритеты

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

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

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

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

Dev User

Зло

• Аллокации

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

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

ExAllocateFromPagedLookasideList()

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

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

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

ExAllocateFromPagedLookasideList()

Low Fragmentation Heap

LFH

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

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

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

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

ExAllocateFromPagedLookasideList()

Low Fragmentation Heap

allocator from TBB, PPL, boost, …

TLSPer thread list

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

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

• TLS

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

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

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

top related