21 августа 2015 г.

История одного долгоиграющего отчёта

Данным постом, я выполняю давно обещанное, но не выполненное. За что приношу свои извинения.

Этот пост написал и просил меня разместить у себя в блоге Дмитрий Бондарев.
Контакты Дмитрия: электронная почта: bdmalex@mail.ru, skype: bdmalex.
Стиль и пунктуация - автора.

История одного долгоиграющего отчёта
... или как сократить срок его выполнения не исправляя ни одной строки ABAP кода


   Существовал в нашей организации SAP ECC 6.0 на HP-UX платформе. И написали по какому-то ТЗ ABAP программисты отчёт дивный, который при запуске колбасил сервер и только после порядка 14 часов работы выдавал результат.

   Ушёл ABAP-программист с чувством выполненного долга в отпуск, и естественно начальство начало задавать вопросы базису: "Почему это работает так долго?".

   Начальственный заход для решения проблемы был простой: добавили в сервер ещё пяток ядер и немного ОЗУ. Запустили отчёт заново – и прослезились, никаких изменений.

   Запускаем отчёт с трассировкой и получаем следующие унылые результаты:
  • 98% времени уходит на работу на Сentral Instance (CI),
  • 2% времени уходит на работу и взаимодействие с базой данных (DB).
   Так как у нас CI и DB – это 2 разных сервера, я даже слегка расстроился. Мне сначала думалось, что проблема связана с большим временем работы на БД. А стало ясно, что игры с оптимизацией запросов никаких существенных профитов не принесут и оптимизировать надо именно то,что крутится на СI.

   Первый резерв вспомнился навскидку – это класс задания:



Выбираем класс "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)


5 комментариев:

  1. Интересно следующее:
    1. Как стало на сервере с CPU после смены приоритетов и затронуло ли это другие запросы.
    2. Нашли ли в результате корень проблемы, ибо на таких костылях далеко не ускакать...

    ОтветитьУдалить
    Ответы
    1. 1)на сервере никаких других систем не было, поэтому никаких проблем с другими процессами замечено не было...
      2) Переписывать отчёт нет стали. ЖилиЖи таким лайф-хаком какоето время...а потом сменили платформу. А на новом железе отчёт показывал уже приемлемое время.

      Удалить
  2. Боюсь, что это не решение проблемы, а workarround. :( Хотя в любом случае - огромное спасибо, всякое может пригодиться!

    ОтветитьУдалить
  3. Т.к. у вас 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. Спасибо за длинный и подробный комментарий. С сетью между хостами всё было отлично, т.к фактически это были два хоста на одном массиве. Нагрузка на сеть в пике работы отчёта не превышала 1мбит/с, да и время отклика там было меньше ваших значений.
      Я наверное не точно указал распределение: сетевые задержки, передача на DB, обработка и отклик на CI -> это всё составляло 2% затрачиваемого времени.
      Поэтому занимался только оптимизацией работы на СI, т.к улучшать загрузку 17 минут(2% от 14часов) менее эффективно..

      Удалить