Производительность в Caché Как находить «бутылочные горлышки», как решать проблемы производительности, как достигать максимальной производительности Сергей Кудинов Основные факторы и метрики Системные факторы, влияющие на производительность I/O CPU (доставка данных от/к CPU) Системные факторы, влияющие на производительность I/O CPU Память - Диск - Сеть Системные метрики I/O CPU Загрузка CPU Память Доступная память - Диск -Сеть iowait/Очередь диска Системные метрики • Системные утилиты – Perfmon.exe, Task Manager, Activity Monitor, top, vmstat – Смотрим на загрузку CPU, процессы ОС наиболее загружающие CPU, Очередь диска/iowait Метрики Caché I/O не в БД файлы, сеть CPU Memory I/O БД RoutineCommands Cache Efficiency Полное время выполнения CACHE.DAT, WIJ, Журналы GloRefs Ключевые метрики Caché • GloRef GloRef Routine Commands – Единичная операция доступа к глобалам (get, set, kill) Время – Влияет на загрузку I/O (Файлы БД и Память ) выполнения • Routine Commands – Единичное выражение COS – Влияет на загрузку CPU • Время выполнения – Общая оценка производительности – Зависит от всех факторов Связь процессов OC и Caché • PID процесса OC = PID Caché ($Job) – Постарайтесь найти процессы ОС с помощью SMP Caché ^GLOSTAT • Утилита для анализа основных метрик Caché Сбор данных за период времени • Важно получить значения метрик за значимый период времени • Уровень ОС – logman (Windows) – sar, vmstat, iostat (*nix) • Уровень Caché – ^pButtons,^mgstat • Внешние средства – SNMP, WMI – BMC Patrol Основные метрики - Выводы • Загрузка CPU и I/O - 2 главных фактора, влияющих на производительность • GloRefs, RoutineCommands и Время Выполнения – наиболее важные метрики, со стороны Caché • Уменьшение этих метрик для отдельных задач может значительно повысить производительность системы в целом Определение «узких» мест Инструменты для сбора метрик • pButtons – самый простой сбор всей информации о системе – рекомендуется при работе с WRC • GLOSTAT – система в целом – Начальный анализ состояния системы в целом • PERFMON – определение наиболее загруженных программ и глобалов – Начальное определение узких мест • %SYS.MONLBL – построчный анализ кода – Анализ наиболее «затратных» строк кода • %SYS.PTools – анализ SQL – запросов GloRef Routine Commands Время выполнения Метрики – сбор в коде GloRef • Собирайте для любого теста • Время выполнения - $zh • Global References, Routine Commands - %SYS.ProcessQuery - $system.Process (с 2015.1, БЫСТРЕЕ!!!) - %Monitor.Process для других метрик • В Ensemble уже есть данные для • Ens.MessageHeader • Для SQL-Only запросов • %SYS.Ptools собираете данные • Анализируйте собранные данные DeepSee!!! Routine Commands Время выполнения Пример – Партнер X – Для каждого вызова Web-сервиса записывается: • Имя метода • Время старта • Время окончания • Пользователь • Exception DeepSee – Активность за день DeepSee – Наиболее медленные методы Пример – Партнер X • Сейчас – Для каждого вызова Web-сервиса записывается: • Method Name • $ZHorolog (время с максимальной точностью) • Global References, Routine Commands – UnitTests – запуск после каждой сборки • Сравнение результатов с предыдущей сборкой • Значительное ухудшение метрик è пересмотр кода, чтобы не допустить проблем с производительностью у клиента Полезные инструменты • DeepSee + ваши log table • $ZHorolog • %SYS.ProcessQuery (GloRef, RtnComands) • $system.Process (c 2015.1,БЫСТРЕЕ!!!) • %Monitor.Process • %SYS.PTools • Index Analyzer (2013.1) ^PERFMON • Утилита, собирающая информацию, упорядоченную по глобалам и программам • Может ответит на следующие вопросы: – – – – Какая программа выполнила больше всего кода? Работа с какими глобалами была наиболее интенсивной? Кол-во записей блоков программами… и т.д. Пример сессии ^PERFMON %SYS>do ^PERFMON <1> Start Monitor <10> Processes (число процессов) <300> Routines (число программ) <300> Globals (число глобалов) <10> (Databases (число БД) <5> (default) Network Nodes (число узлов сети) Monitor is Started Пример сессии ^PERFMON <3> Pause Monitor <7> Report Statistics <C> Custom Category <*> Report All Metrics <R> Sort by Routine <D> Delimited format <Имя Файла> Пример сессии ^PERFMON Загрузите файл в Excel ( используя разделитель ‘,’) Отсортируйте по нужной метрике Анализ отчета ^PERFMON • Наиболее важные метрики – Global References/Routine Lines – общая активность • Важные метрики – – – – Data Block Read/Write – какой именно тип нагрузки у диска Journal Entries – изменение журналируемых БД Block Allocation – добавление новых данных Lock/Lock Fail – статистика по блокировкам, проблемам с блокировками ^%SYS.MONLBL • Собирает метрики как и PERFMON, но для выполнения конкретных строк кода Time – Время, затраченное на выполнение строки Total Time – Время, затраченное на выполнение строки с учетом вызова метод, процедур… Мониторинг – другие средства • %Monitor.Process – класс с API для сбора метрик для текущего процесса – Собирает те же метрики, что и PERFMON/MONLBL – Не влияет на производительность (безопасно для анализа production серверов) – Данные доступны только внутри процесса (необходимо использовать API) • ^PROFILE – “Гибрид” of PERFMON и %SYS.MONLBL – Удобна для начала анализа ситуации ^PROFILE Мониторинг SQL - %SYS.PTools • Средство для мониторинга выполнения SQL запросов – Работает с кэшируемыми запросама (предварительно необходимо удаление кэшированных запросов) – Работает с запросами классов и встроенным SQL (требуется перекомпиляция) – Собирает метрики о выполнении запросов (время, GloRefs и т.д.) – SQL доступ к полученным результатам (пакет %SYS_PTools) Мониторинг SQL - %SYS.PTools • Запуск сбора статистики при выполнении SQL запросов Do $SYSTEM.SQL.SetSQLStats(2) • Удалить кэшированные запросы • Запустить SQL-запросы • Остановить сбор статистики Do $SYSTEM.SQL.SetSQLStats(0) • Анализ данных в %SYS_PTools.SQLStatsView Мониторинг SQL - %SYS.PTools SELECT RoutineName, QueryText, COUNT(*) as CountTotal, SUM(TotalTime) as TimeTotal FROM %SYS_PTools.SQLStatsView WHERE namespace=‘SAMPLES' GROUP BY RoutineName ORDER BY CountTotal Средства Caché и ОС Windows Unix Активность Perfmon.exe vmstat, iostat, системы logman sar Самые“тяжелые” Task Manager top процессы Анализ конкретного процесса Другие средства Process Explorer truss, strace SysInternals Misc. tools Caché GLOSTAT, mgstat PERFMON PROFILE %SYS.PTools %SYS.MONLBL, %Monitor.Process cstat Определение «узких» мест - Итоги • Средства для определения «узких» мест: – – – – PERFMON %SYS.MONLBL PROFILE %SYS.PTools Рекомендации по увеличению производительности Увеличьие в 2 раза тестовую БД • Не обязательно нужен реальный объем – Увеличения 100 è 200 записей может быть достаточно для понимания общей картины • Значения Glorefs, Routine Commands в тестах – Линейное (2x) увеличение метрик (Full Table Scan/отсутствующий индекс) – Экспоненциальное увеличение –требуется пересмотр алгоритма Эмуляция очень большого размера БД • Тестовая БД может эмулировать работу с реальной БД • Уменьшите размер Global Buffers в пропорции Тестовая БД / Реальная БД (50MB/5GB) • Оценивайте относительные изменения показателей производительности с разными размерами кэша – Значительное уменьшение производительности – операции чтения с диска. Подобное поведение будет и на реальной БД Сброс кэша Global buffers • Иногда необходимо сбросить кэш для корректного вычисления временных метрик • Отмонтирование/Примонтирование БД очищает все буферы для БД – Класс SYS.Database, методы Mount()/Dismount() Работа с тестовой БД • Требуемый сценарий: – Запустить тест – Откорректировать код – Запустить тест на тех же данных • Подход: – Разделите в области БД кода и данных – Отмонитируйте БД • Класс SYS.Database, метод Dismount() – Скопируйте файл БД данных из бэкапа • Класс %File, метод CopyFile – Примонтируйте БД • Класс SYS.Database, метод Mount() SQL Index Analyzer SQL – TuneTable • Наиболее важный фактор в оптимизации SQL запросов • Первый вопрос, который вам задатут в WRC: – “Have You Tried Running TuneTable?” • Проблемы: – Необходимо реалистичное поведение SQL оптимизатора на сгенерированной БД – Новая инсталляция , тестовая БД не отражают картины • Решение: – Перенос статистики TuneTable с реальной БД • Запуск TuneTable на реальной БД • $system.SQL.ExportTuneStats() • $system.SQL.ImportTuneStats() Upgrade!!! • Недавние значительные увеличения производительности – – – – – – – Скорость компиляции Новые быстрые!!! локальные массивы Работа с XML Работа с JSON Async I/O Параллелизация SQL Значительное увеличение производительности на многоядерных (>32 ) серверах Упражнения