powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Онлайн - мониторинг ЦПУ
4 сообщений из 4, страница 1 из 1
Онлайн - мониторинг ЦПУ
    #39466291
Desert_Nomad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, уважаемые форумчане. Хотелось бы посоветоваться насчет вариантов реализации одной задачи.

Oracle 10G.
Надо ловить моменты, когда загрузка ЦПУ сервера превышает определенный порог. Если после превышения она удерживается в течение указанного тайм-аута, надо получить список сессий, наиболее сильно нагружающих ЦПУ в данный момент времени, затем в каждой такой сессии вычислить самый затратный по ЦПУ запрос.
Результат оформить e-mail-ом и отослать на заданный адрес.

Следить за загрузкой ЦПУ несложно - смотрим в v$sysmetric_history:
Код: plsql
1.
select * from v$sysmetric_history where metric_name= 'Host CPU Utilization (%)';



А вот с сессиями несколько интересней.
Во-первых, можно извлечь инфу из v$sesstat - статистика 'CPU used by this session'. Но в этом случае, если я все правильно понял, я получу статистику по ЦПУ за все время существования сессии, а не на момент фиксации высокого уровня потребления ЦПУ.
Во-вторых, имеется v$active_session_history. Там можно подсчитать, кто торчит в статусе 'On CPU'.
В-третьих, есть v$sessmetric. Там получаем инфу по ЦПУ за последние 15 сек. Бурлесон для решения такой задачи использует именно этот вариант:

Если сопоставлять результат с тем, что дает ASH Viewer, то наиболее похожие результаты дает вариант 3 (хотя исходники ASH Viewer показывают, что они опираются на информацию, извлекаемую из v$active_session_history в свою внутреннюю БД).

Как вы думаете, какой вариант из 3-х предложенных все же будет наиболее точно соответствовать задаче? Или может есть еще другие, которые я выпустил из виду?
...
Рейтинг: 0 / 0
Онлайн - мониторинг ЦПУ
    #39466304
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Desert_NomadНадо ловить моменты, когда загрузка ЦПУ сервера превышает определенный порог. Если после превышения она удерживается в течение указанного тайм-аута, надо получить список сессий, наиболее сильно нагружающих ЦПУ в данный момент времени, затем в каждой такой сессии вычислить самый затратный по ЦПУ запрос.Что подразумевается под "данный момент"?
ASH делает сэмплы раз в секунду, и даже если включать runtime execution statistics, то сэмплы (речь уже не про ash) будут с определенной дискретностью явно более редкой чем такты процессора. :)

Если интересуют локальные пики - то смотреть максимальное число сэмплов в статусе 'On CPU' в ash за интересующий период - по-моему достаточно.

Если интересуют глобально запросы прожорливые к CPU, то можно смотреть v$sql.elapsed_time, v$sql.cpu_time.
C 11-й версии можно анализировать в ASH по конкретному выполнению с помощью sql_exec_id, sql_exec_start. В 10-ке этих колонок еще нет.
...
Рейтинг: 0 / 0
Онлайн - мониторинг ЦПУ
    #39466395
Desert_Nomad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbms_photoshopЧто подразумевается под "данный момент"?

Подразумевается интервал времени от момента обнаружения превышения порога T0 до момента времени T0+некий защитный интервал (например, 30 сек), в течение которого это превышение сохраняется - ведь спамить по каждому броску метрики ЦПУ не есть хорошо.

Поковыряю сейчас вариант с ASH сэмплами, сверю результат с ASH Viewer-ом...
...
Рейтинг: 0 / 0
Онлайн - мониторинг ЦПУ
    #39466736
Desert_Nomad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за идею, получилось вроде недурственно:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
  SELECT ts.sid
        ,ts.serial
        ,ss.osuser
        ,coalesce(ts.machine,ss.terminal) as terminal
        ,coalesce(ts.module,ss.PROGRAM) as module
        ,ss.username
        ,ss.status
        ,ss.state
        ,ss.TYPE        
        ,ts.session_cpu
        ,ts.db_cpu
        ,ROUND(ts.session_cpu / ts.db_cpu * 100, 2) AS prc_cpu
    FROM (  SELECT ash.session_id    AS sid
                  ,ash.session_serial# AS serial
                  ,ash.machine
                  ,ash.module
                  ,COUNT(*)          AS session_cpu
                  ,SUM(COUNT(*)) OVER () AS db_cpu
              FROM v$active_session_history ash
             WHERE ash.sample_time BETWEEN :time_from
                                       AND :time_to
               AND ash.session_state = 'ON CPU'
          GROUP BY ash.session_id, ash.session_serial#, ash.machine, ash.module) ts, v$session ss
    where ss.sid = ts.sid
     AND ss.serial# = ts.serial      
ORDER BY 12 DESC



И с ASH Viewer-ом бьет один-в-один, ЧТД.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Онлайн - мониторинг ЦПУ
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]