Данным постом, я выполняю давно обещанное, но не выполненное. За что приношу свои извинения.
Этот пост написал и просил меня разместить у себя в блоге Дмитрий Бондарев.
Контакты Дмитрия: электронная почта: bdmalex@mail.ru, skype: bdmalex.
Стиль и пунктуация - автора.
Существовал в нашей организации SAP ECC 6.0 на HP-UX платформе. И написали по какому-то ТЗ ABAP программисты отчёт дивный, который при запуске колбасил сервер и только после порядка 14 часов работы выдавал результат.
Ушёл ABAP-программист с чувством выполненного долга в отпуск, и естественно начальство начало задавать вопросы базису: "Почему это работает так долго?".
Начальственный заход для решения проблемы был простой: добавили в сервер ещё пяток ядер и немного ОЗУ. Запустили отчёт заново – и прослезились, никаких изменений.
Запускаем отчёт с трассировкой и получаем следующие унылые результаты:
Первый резерв вспомнился навскидку – это класс задания:
Выбираем класс "A" – и задание отрабатывает за 12 часов.
Всего на 7% меньше – но уже приятно!
Дальше, переходим на сервер приложений и запускаем любимую команду top.
Выясняется, что существенный % времени занимает переключение задания между ядрами процессора. А что будет, если жёстко привязать задание к одному процессорному ядру и заставить его работать только там. Зачем тратить драгоценное время на скачки с одного ядра на другое?
Заходим сразу после запуска задания в SM66 (или SM50, ну в общем это дело вкуса) и выясняем необходимый нам PID (идентификатор процесса). Далее на HP-UX под нашим любимым пользователем <sid>adm запускаем команду:
Для других *nix-платформ команды привязки следующие:
Ну, а почему бы не повысить приоритет нашему процессу. Запускаем:
Вот таким, совсем нехитрым способом, можно ускорить выполнение любого отчёта на многопроцессорной машинке с HP-UX (и не сомневаюсь, что аналогично можно сделать на любой *nix платформе, разве что запускаемые команды будут отличаться названием). В моём случае выигрыш составил порядка 42%, что на мой взгляд – вполне осязаемая и ощутимая величина.
Автор: Дмитрий Бондарев (e-mail: bdmalex@mail.ru, skype: bdmalex)
Этот пост написал и просил меня разместить у себя в блоге Дмитрий Бондарев.
Контакты Дмитрия: электронная почта: bdmalex@mail.ru, skype: bdmalex.
Стиль и пунктуация - автора.
История одного долгоиграющего отчёта
... или как сократить срок его выполнения не исправляя ни одной строки ABAP кода
... или как сократить срок его выполнения не исправляя ни одной строки ABAP кода
Существовал в нашей организации SAP ECC 6.0 на HP-UX платформе. И написали по какому-то ТЗ ABAP программисты отчёт дивный, который при запуске колбасил сервер и только после порядка 14 часов работы выдавал результат.
Ушёл ABAP-программист с чувством выполненного долга в отпуск, и естественно начальство начало задавать вопросы базису: "Почему это работает так долго?".
Начальственный заход для решения проблемы был простой: добавили в сервер ещё пяток ядер и немного ОЗУ. Запустили отчёт заново – и прослезились, никаких изменений.
Запускаем отчёт с трассировкой и получаем следующие унылые результаты:
- 98% времени уходит на работу на Сentral Instance (CI),
- 2% времени уходит на работу и взаимодействие с базой данных (DB).
Первый резерв вспомнился навскидку – это класс задания:
Выбираем класс "A" – и задание отрабатывает за 12 часов.
Всего на 7% меньше – но уже приятно!
Дальше, переходим на сервер приложений и запускаем любимую команду top.
Выясняется, что существенный % времени занимает переключение задания между ядрами процессора. А что будет, если жёстко привязать задание к одному процессорному ядру и заставить его работать только там. Зачем тратить драгоценное время на скачки с одного ядра на другое?
Заходим сразу после запуска задания в SM66 (или SM50, ну в общем это дело вкуса) и выясняем необходимый нам PID (идентификатор процесса). Далее на HP-UX под нашим любимым пользователем <sid>adm запускаем команду:
> mpsched –c номер_процессорного ядра –p PIDСмотрим результат: отчёт отработал за 10 часов.
Для других *nix-платформ команды привязки следующие:
- bindprocessor для AIX
- psrset для Solaris
- taskset (+ chrt) для Linux
В принципе, на этом можно было бы успокоиться, но ведь аппетит всегда приходит во время еды? Что ещё можно сделать, чтобы ускориться?
Ну, а почему бы не повысить приоритет нашему процессу. Запускаем:
> renice –n +20 –p PIDСмотрим результат: отчёт отрабатывает за 8 часов.
Вот таким, совсем нехитрым способом, можно ускорить выполнение любого отчёта на многопроцессорной машинке с HP-UX (и не сомневаюсь, что аналогично можно сделать на любой *nix платформе, разве что запускаемые команды будут отличаться названием). В моём случае выигрыш составил порядка 42%, что на мой взгляд – вполне осязаемая и ощутимая величина.
Автор: Дмитрий Бондарев (e-mail: bdmalex@mail.ru, skype: bdmalex)
Интересно следующее:
ОтветитьУдалить1. Как стало на сервере с CPU после смены приоритетов и затронуло ли это другие запросы.
2. Нашли ли в результате корень проблемы, ибо на таких костылях далеко не ускакать...
1)на сервере никаких других систем не было, поэтому никаких проблем с другими процессами замечено не было...
Удалить2) Переписывать отчёт нет стали. ЖилиЖи таким лайф-хаком какоето время...а потом сменили платформу. А на новом железе отчёт показывал уже приемлемое время.
Боюсь, что это не решение проблемы, а workarround. :( Хотя в любом случае - огромное спасибо, всякое может пригодиться!
ОтветитьУдалитьТ.к. у вас CI и DB два разных сервера, большую роль могут играть сетевые задержки. Попробуйте поставить DI на сервер где работает DB и запустить отчет там.
ОтветитьУдалитьТак же можете сравните утилитой Niping (из SAP kernel) время roundtrip time от CI до DB, и от DB до DB.
На target_host:
niping -s
На source_host:
niping -c -H target_host -B 20 -L 10000
или
niping -c -H target_host -B 1 -L 10000
Результат:
av2 - покажет приблизительное время туда-обратно
Например:
av2 0.030 ms (такое время у меня от DB до DB)
av2 0.084 ms (такое время у меня от DI до DB)
Поэтому, если в Z отчете множеством select single * да еще в цикле, то время выполнения такого отчета может отличаться в разы на сервере DB, чем за его пределами.
И вообще, производительности сети нужно уделять большое внимание, особенно когда устанавливается распределенная SAP система. Всегда под SAP запрашивайте у своего вендора самые высокопроизводительные сетевые карты 10 Gigabit и "камухакеры". Обязательно перед установкой SAP необходимо свести задержки roundtrip time к минимуму (по средствам "плясок с бубном" и чтением гайдов).
Notes:
1100926 - FAQ: Network performance
1612283 - Hardware Configuration Standards and Guidance
И на эту тему IBM есть небольшое но очень интересное исследование:
https://www-03.ibm.com/support/techdocs/atsmastr.nsf/WebIndex/WP102370
Спасибо за длинный и подробный комментарий. С сетью между хостами всё было отлично, т.к фактически это были два хоста на одном массиве. Нагрузка на сеть в пике работы отчёта не превышала 1мбит/с, да и время отклика там было меньше ваших значений.
УдалитьЯ наверное не точно указал распределение: сетевые задержки, передача на DB, обработка и отклик на CI -> это всё составляло 2% затрачиваемого времени.
Поэтому занимался только оптимизацией работы на СI, т.к улучшать загрузку 17 минут(2% от 14часов) менее эффективно..