Решение задачи повышения производительности приложений на базе Caché и Ensemble Сергей Кудинов План Что влияет на производительность Увеличение производительности в приложении Мониторинг производительности План Что влияет на производительность Увеличение производительности в приложении Мониторинг производительности Что влияет на производительность • Компоненты Cache’ – Взаимодействие между ОС, диском, сетью, памятью, файловой системой • Дисковая система • Файловая система • Эффективное выделение буферов • Процессоры • Код приложения Компоненты Cache’ • Как выполняется запись в БД – Достаточно ли быстро выполняется запись – если нет почему? – Unix или VMS? Новый параметр ‘wdstrategy’ • Роль журналирования – Не стоит журналировать все БД – Роль журналирования в ECP • Управление буфером – Как использовать флаг ‘batch’ • Сеть – Задержка и производительность сети Дисковая система • Вы уже слышали, что это важно… – Это все еще очень важно, потому что… • Что означают различные уровни RAID массива – RAID 10/5 хорошо или плохо? • LUN и диск • Использование OS striping в RAID массивах Файловая система • Какие есть опции монтирования в Cache’ – Что поддерживается и рекомендуется ? • LVM и дополнительные логические разделы на диске – Striping (распределение по дискам) – Зеркалирование – Управление размером блока ZFS “The Solaris ZFS offers a dramatic advance in data management with an innovative approach to data integrity, tremendous performance improvements, and a welcome integration of file system and volume management capabilities.” http://www.sun.com/software/solaris/zfs_learning_center.jsp • ZFS – файловая система по умолчанию для Open Solaris, и скоро будет для Solaris • ZFS поддерживается Caché начиная с 2009.1 Эффективное выделение буферов • Могут ли слишком большие буферы быть проблемой? – Иногда да…зависит от многих причин • Слишком маленькие буферы – всегда проблема…но что это значит? – Задержки при чтении и записи • Опция блокировки в памяти? – Что это значит и стоит ли ею пользоваться? – Поддержка больших страниц? Процессоры • Почему слишком большое количество процессоров может быть проблемой – Гоночный автомобиль с шинами от велосипеда – Слишком много процессов создают нагрузку на дисковую систем, которая не успевает их обработать План Что влияет на производительность Увеличение производительности в приложении Мониторинг производительности $ORDER/$QUERY 3-й аргумент $ORDER(^GlobalData(ref),1,dataRow) – В переменной dataRow – значение узла, следующего за ^GlobalData(ref) – Позволяет на 1 уменьшить значение Global Reference при чтении данных… – Пример для 500,000 records: • “Обычный подход” ($Order/Set) • 3-q параметр • Почти в 2 раза быстрее! = 1.20 seconds = 0.65 seconds $SORTBEGIN/$SORTEND • $SORTBEGIN переводит в специальный режим сортировки для указанного глобала, при котором данные сначала пишутся во временный буфер. Set x=$sortbegin(^PatientI) Do ##class(Patient).InsertData() Set x=$sortend(^PatientI,1) • $SORTEND завершает решим специальной сортировки. Данные копируются из временного буфера в глобал. Копирование не происходит, если значение аргумента 0. Функции работы со списками • При большом количестве данных функции работы со списками НАМНОГО быстрее $PIECE. • Не возникает проблем с разделителями. • Используйте их. ZZDUMP $LISTBUILD("ABC",12,3.4) 0000: 05 01 41 42 43 03 04 0C 04 06 FF 22 Функции работы с коллекциями • Использование метода Count() Set obj=##class(Package.Class).%OpenId(n) Set count=obj.Names.Count() For I=1:1:count { set name=obj.Names.GetAt(I) } • Использование метода GetNext() - ==> 20% быстрее Set obj=##class(Package.Class).%OpenId(n) Set key=“” Do { set name=obj.Names.GetNext(.key) …….. } while key’=“” Использование PrimaryKey • Уменьшает # of Global Reference. – Добавьте PrimaryKey в описание уникального индекса. – В БД с 1,000,000 записей время для поиска и открытия 50,000 случайных записей 3.79 секунды без использования PrimaryKey, с использованием 1.28 секунды. – Может быть необязательным при использовании IndexOpen методов. Методы IndexNameOpen() • Метод IndexNameOpen() генерируются для каждого Unique и IDKEY индекса класса. – Index StoryIDIndex on StoryID [ Unique ] – Для открытия объекта StoryID=1003 Set story=##class(User.Story).StoryIndexOpen(1003) Методы PropertyNameSetObjectId Set invoice=##class(MyApp.Invoice).%New() Set invoice.CustomerName="Test" Do invoice.%Save() Set id=invoice.%Id() Kill invoice For index = 1:1:10000 { Set Item = ##class(MyApp.LineItem).%New() Set Item.Product = "Item"_index Set Item.Quantity = index*index Do Item.TheInvoiceSetObjectId(id) Do Item.%Save() Kill Item } Динамические SQL запросы • Старый класс – %Library.ResultSet. • Новый класс – %ResultSet.SQL • %ResultSet.SQL значительно быстрее %Library.ResultSet, сравнимо со встроенным SQL. • %ResultSet.SQL постоянно совершенствуется. Private Global • Что это? – Глобальная переменная, которая доступна только процессу создавшему ее. Видна изо всех областей. Удаляется при завершении процесса. • Преимущества: – Не нужно очищать. Особенно при возникновении ошибок. – Не нужен узел $Job. – Некоторое преимущество по производительности. • Недостаток: – Сложнее отлаживать. Блокировки • >LOCK +^data(id)#"s" – Несколько процессов могут выполнить разделяемую блокировку. – Разделяемая блокировка не дает выполнить эксклюзивную блокировку. – Разделяемые эксклюзивные блокировки считаются независимо друг от друга • LOCK +var1:0 – Результат попытки в $Test Операции со строками • $ZSTRIP – Удаляет типы символов/отдельные символы из строки • $ZCONVERT (string,mode,trantable,handle) – mode = (U,L,T,W,S, I,O) – translation table = (Raw, Same, HTML, JS, URL, UTF8, XML) – Handle – переменная в которую попадает не преобразованное значение План Что влияет на производительность Увеличение производительности в приложении Мониторинг производительности Где узкое место? • Вы знаете, где «узкое» место? • Вы действительно знаете, где «узкое» место? • Какими утилитами пользоваться? Какие метрики? • Какими утилитами пользоваться? Встроенные утилиты • ^GLOSTAT, SMP (только интерактивные) • ^Buttons,^pButtons • cstat, планы запросов • ^PERFMON, ^%SYS.MONLBL, ^PROFILE • ^mgstat, ^mpmon • %MONITOR, %SYS.STATS • другие ^Buttons ^Buttons • Содержит – – – – Информацию cconsole.log Системные показатели Простой способ для получения статистики Не содержит приватной информации • В 2009.1 ^Buttons создает CACHE.DAT • Уменьшен размер HTML отчета GLOSTAT / cstat -> mgstat • ^GLOSTAT – показывает параметры работы с глобалами всей системы в целом • cstat – системные показатели • ^mgstat – сочетает параметры ^GLOSTAT и cstat – Взаимодействие между ОС, диском, сетью, памятью, файловой системой – Статистика ECP – csv формат ^mgstat и Excel ^PERFMON -> ^mpmon • ^PERFMON – Статистика работы с глобалами и программами по процессам – Набор предопределенных показателей • ^mpmon – Утилита WRC performance team собирающая набор показателей – Вывод в csv %SYS.MONLBL • Выберите программу(ы) для мониторинга • Отчет в виде времени выполнения INT кода ^PROFILE • Новая утилита в 2009.1 • Сочетание ^PERFMON & ^%SYS.MONLBL • Интерактивная %SYS.PTools.SQLStats • Специально для анализа SQL, появилась начиная с 2008.1 • DO SetSQLStats^%apiSQL(flag) • Опция времени компиляции – Необходимо удалить кэшированные запросы и перекомпилировать при включенной статистике – Статистика удаляется при компиляции • Статистика собирается на уровне запросов и модулей • Измеряются параметры выполнения кода, обращений к глобалам, времени выполнения… SQL оптимизатор • Цель – минимизировать операции I/O, загрузка процессора вторична • TuneTable собирает статистику по данным таблиц, которая используется оптимизатором для порядка обработки условий запроса • Используйте TOP и ORDER BY для скорейшего получения первых записей результата • Используйте %INORDER и %IGNOREINDICES • План запроса позволяет определить логику обработки запроса, недостающие индексы… Сторонние утилиты • BMC Patrol • SNMP • WMI Patrol • BMCSoftware’s Performance Manager • Нет необходимости использовать BMC • Сбор параметров в текстовом файле “patrol.dat” в mgr каталоге • Значения могут быть ‘итоговые’, ‘разница’ or ‘% отношение’ • Можно выделить максимально нагруженные процессы. SNMP & WMI • Простые в настройке инструменты сбора показателей • Требуется включение %Service_Monitor • Существующие показатели – – – – – – – Использование буферов Блокировки БД Размер БД Загрузка WD ECP Использование лицензий … Утилиты OC • Windows Perfmon • nmon, svmon, filemon, mpstat, topas • glance, ps, sar, vmstat, iostat • tusc, truss, strace • T4, monitor • evaperf, vevamon, (+other san utilities) • netstat, wireshark • (log-файлы) WRC • Performance – один из типов WRC-проблем • Существует InterSystems WRC Performance Team • Обращайтесь!!! Спасибо за внимание! Вопросы? Сергей Кудинов (sergey.kudinov@intersystems.com) +7 (495) 967-0088