Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Developing high load systems using C++

605 views

Published on

Ivan Romanenko, a fan of C++ and Boost, specializing on low-level development in such areas: forensics, security abd high-load systems, tells about developing high-load systems using C++.

– Processing more than 10 000 request per second
– Architecture for quick experiments
– Manual instrumentation and boost.statistics
– Search for own performance metrics
– Fight against losses on allocations and synchronization

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Developing high load systems using C++

  1. 1. Разработка high-load систем на C++ Иван Романенко(viva.cpp@gmail.com)
  2. 2. Что значат эти числа ? • 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 это:
  3. 3. Что значат эти числа ? • 2GHz / 5 tick/byte = 400 MB/s = 3,2 Gb/s • 400MB/s / 10 000 req/s = 40 KB/req 10 000 req/sec предел:
  4. 4. Обычный процесс 1. Поиск хот-спотов на текущем билде 2. Исправление в коде 3. Проверка улучшения на новом билде rev 1Данные Замер 1 Данные Замер 2rev 2
  5. 5. Что делать, когда невозможно имитировать окружение • Состояние ОС: – большой объём временных данных – много вызовов OS API • Состяние продукта: – большая система – много 3rd party либ
  6. 6. Нельзя войти в одну и ту же реку дважды
  7. 7. Всё связанно
  8. 8. Запуск с одинаковыми данными Данные Замер 1 Замер 2 algo rev 1 algo rev 2 Build
  9. 9. Варианты решения • DLL • Copy/Pase сорцов • Архитектурно: –Наследование –Шаблоны
  10. 10. Хочу, чтобы : • Минимальная связность • Без виртуальных таблиц • Конвейер как основа • Лёгкая сборка набора алгоритмов
  11. 11. Пример использования
  12. 12. Инструментация
  13. 13. Причины: • Профайлер недоступен: – лицензия – платформа – баги профайлера • Проблема inline
  14. 14. Код
  15. 15. Метрики • Thread UserTime • GetTickCount • _rdtsc • GetSystemTime Гранулярность Пересечение с чужими потоками и процессами Виртуализация
  16. 16. Анализ окружения
  17. 17. Windows API density
  18. 18. boost.statistics
  19. 19. Анализ своего кода
  20. 20. Недоверие средним
  21. 21. Поиск своих метрик производительности
  22. 22. CPU core usage
  23. 23. CPU core usage
  24. 24. CPU core usage
  25. 25. Тактов на байт
  26. 26. Приоритеты • Потребление CPU • Потребление памяти • Время отклика • Время работы от батареи Dev User
  27. 27. Зло • Аллокации • Синхронизация • Копирование памяти
  28. 28. ExAllocateFromPagedLookasideList()
  29. 29. Фиксированный размер блока Динамический размер блока Борьба с потерями на аллокациях ExAllocateFromPaged LookasideList() Low Fragmentation Heap
  30. 30. (c) David B. Probert, Ph.D. Windows Kernel Development Microsoft Corporation
  31. 31. Фиксированный размер блока Динамический размер блока Борьба с потерями на аллокациях ExAllocateFromPaged LookasideList() Low Fragmentation Heap allocator from TBB, PPL, boost, … TLS Per thread list
  32. 32. Борьба с потерями при синхронизации • Лучшая синхронизация – её отсутсвие • TLS • Больше локов • Докажи! / Перепроверяй
  33. 33. Спасибо за внимание

×