Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Выборка показателей как в Active Monitor  [new]
temoxa
Member

Откуда:
Сообщений: 405
Всем привет! Поиск в гугле не увенчался успехом((( Обращаюсь у гуру сиквела) Кто нить задавался вопросом как Activity Monitor рассчитывает такие вот показатели как Waiting Tasks и Database I/O MB/sec? Если у кого нить есть наработки, поделитесь плыз))
27 май 16, 17:14    [19229217]     Ответить | Цитировать Сообщить модератору
 Re: Выборка показателей как в Active Monitor  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Загрузка CPU (2008+)

SELECT
    cpu_total =
        CASE WHEN cpu_sql > cpu_total AND cpu_sql <= 99.
            THEN cpu_sql
            ELSE cpu_total
        END,
    cpu_sql
FROM (
    SELECT cpu_total = 100 - x.value('(./Record/SchedulerMonitorEvent/SystemHealth/SystemIdle/text())[1]', 'TINYINT')
    FROM (
        SELECT TOP(1) [timestamp], x = CONVERT(XML, record)
        FROM sys.dm_os_ring_buffers
        WHERE ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR'
            AND record LIKE '%<SystemHealth>%'
    ) t
) x
CROSS JOIN (
    SELECT
        cpu_sql = (
                MAX(CASE WHEN counter_name = 'CPU usage %' THEN t.cntr_value * 1. END) /
                MAX(CASE WHEN counter_name = 'CPU usage % base' THEN t.cntr_value END)
            ) * 100
    FROM (
        SELECT TOP(2) cntr_value, counter_name
        FROM sys.dm_os_performance_counters
        WHERE counter_name IN ('CPU usage %', 'CPU usage % base')
            AND instance_name = 'default'
    ) t
) t


Дисковая активность (2008+)

IF OBJECT_ID('tempdb.dbo.#tt', 'U') IS NULL
    CREATE TABLE #tt (
        tm DATETIME PRIMARY KEY,
        total_read NUMERIC(28, 2),
        total_written NUMERIC(28, 2),
        total_io_count BIGINT,
        total_io_wait BIGINT
    )

DECLARE @current_collection_time DATETIME = GETDATE()

INSERT INTO #tt
SELECT
    @current_collection_time,
    SUM(num_of_bytes_read / 1024.0 / 1024.0 ),
    SUM(num_of_bytes_written / 1024.0 / 1024.0 ),
    SUM(num_of_reads + num_of_writes),
    SUM(io_stall)
FROM sys.dm_io_virtual_file_stats(DEFAULT, DEFAULT)

DECLARE @previous_collection_time DATETIME
SELECT @previous_collection_time = tm
FROM #tt
WHERE tm < @current_collection_time

DECLARE @interval_ms INT = DATEDIFF(MILLISECOND, @previous_collection_time, @current_collection_time);

SELECT
    read_mb_sec = (c.total_read - p.total_read) * 1000 / @interval_ms,
    write_mp_sec = (c.total_written - p.total_written) * 1000 / @interval_ms,
    response_time_ms =
        CASE
            WHEN (c.total_io_count - p.total_io_count) = 0
                THEN 0
            ELSE (c.total_io_wait - p.total_io_wait) / (c.total_io_count - p.total_io_count)
        END
FROM #tt c
CROSS JOIN #tt p
WHERE c.tm = @current_collection_time
    AND p.tm = @previous_collection_time

DELETE FROM #tt
WHERE tm < @current_collection_time;

Все остальное можно вытянуть через sys.dm_os_performance_counters.
27 май 16, 17:19    [19229236]     Ответить | Цитировать Сообщить модератору
 Re: Выборка показателей как в Active Monitor  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Загрузка памяти (с этим запросом можно еще поспорить - не сильно точный подход)

DECLARE @sql_memory_mb INT
SELECT @sql_memory_mb = physical_memory_in_use_kb / 1024
FROM sys.dm_os_process_memory

SELECT
    total_memory_mb = total_physical_memory_kb / 1024,
    memory_in_use_mb = (total_physical_memory_kb - available_physical_memory_kb) / 1024,
    sql_memory_mb = @sql_memory_mb
FROM sys.dm_os_sys_memory
27 май 16, 17:23    [19229253]     Ответить | Цитировать Сообщить модератору
 Re: Выборка показателей как в Active Monitor  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Задерки (2005+)

SELECT TOP(20)
      wait_type
    , wait_time = wait_time_ms / 1000.
    , wait_resource = (wait_time_ms - signal_wait_time_ms) / 1000.
    , wait_signal = signal_wait_time_ms / 1000.
    , waiting_tasks_count
    , percentage = 100.0 * wait_time_ms / SUM(wait_time_ms) OVER ()
    , avg_wait = wait_time_ms / 1000. / waiting_tasks_count
    , avg_wait_resource = (wait_time_ms - signal_wait_time_ms) / 1000. / [waiting_tasks_count]
    , avg_wait_signal = signal_wait_time_ms / 1000.0 / waiting_tasks_count
FROM sys.dm_os_wait_stats
WHERE [waiting_tasks_count] > 0
    AND [wait_type] NOT IN (
        N'BROKER_EVENTHANDLER', N'BROKER_RECEIVE_WAITFOR',
        N'BROKER_TASK_STOP', N'BROKER_TO_FLUSH',
        N'BROKER_TRANSMITTER', N'CHECKPOINT_QUEUE',
        N'CHKPT', N'CLR_AUTO_EVENT',
        N'CLR_MANUAL_EVENT', N'CLR_SEMAPHORE',
        N'DBMIRROR_DBM_EVENT', N'DBMIRROR_EVENTS_QUEUE',
        N'DBMIRROR_WORKER_QUEUE', N'DBMIRRORING_CMD',
        N'DIRTY_PAGE_POLL', N'DISPATCHER_QUEUE_SEMAPHORE',
        N'EXECSYNC', N'FSAGENT',
        N'FT_IFTS_SCHEDULER_IDLE_WAIT', N'FT_IFTSHC_MUTEX',
        N'HADR_CLUSAPI_CALL', N'HADR_FILESTREAM_IOMGR_IOCOMPLETION',
        N'HADR_LOGCAPTURE_WAIT', N'HADR_NOTIFICATION_DEQUEUE',
        N'HADR_TIMER_TASK', N'HADR_WORK_QUEUE',
        N'KSOURCE_WAKEUP', N'LAZYWRITER_SLEEP',
        N'LOGMGR_QUEUE', N'ONDEMAND_TASK_QUEUE',
        N'PWAIT_ALL_COMPONENTS_INITIALIZED',
        N'QDS_PERSIST_TASK_MAIN_LOOP_SLEEP',
        N'QDS_CLEANUP_STALE_QUERIES_TASK_MAIN_LOOP_SLEEP',
        N'REQUEST_FOR_DEADLOCK_SEARCH', N'RESOURCE_QUEUE',
        N'SERVER_IDLE_CHECK', N'SLEEP_BPOOL_FLUSH',
        N'SLEEP_DBSTARTUP', N'SLEEP_DCOMSTARTUP',
        N'SLEEP_MASTERDBREADY', N'SLEEP_MASTERMDREADY',
        N'SLEEP_MASTERUPGRADED', N'SLEEP_MSDBSTARTUP',
        N'SLEEP_SYSTEMTASK', N'SLEEP_TASK',
        N'SLEEP_TEMPDBSTARTUP', N'SNI_HTTP_ACCEPT',
        N'SP_SERVER_DIAGNOSTICS_SLEEP', N'SQLTRACE_BUFFER_FLUSH',
        N'SQLTRACE_INCREMENTAL_FLUSH_SLEEP',
        N'SQLTRACE_WAIT_ENTRIES', N'WAIT_FOR_RESULTS',
        N'WAITFOR', N'WAITFOR_TASKSHUTDOWN',
        N'WAIT_XTP_HOST_WAIT', N'WAIT_XTP_OFFLINE_CKPT_NEW_LOG',
        N'WAIT_XTP_CKPT_CLOSE', N'XE_DISPATCHER_JOIN',
        N'XE_DISPATCHER_WAIT', N'XE_TIMER_EVENT'
    )
ORDER BY [wait_time_ms] DESC
27 май 16, 17:26    [19229264]     Ответить | Цитировать Сообщить модератору
 Re: Выборка показателей как в Active Monitor  [new]
temoxa
Member

Откуда:
Сообщений: 405
AlanDenton, по wait tasks тоже как то не то показывает, к примеру Activity Monitor показывает 3 таска , а запрос возвращает кучу всего...
27 май 16, 17:30    [19229285]     Ответить | Цитировать Сообщить модератору
 Re: Выборка показателей как в Active Monitor  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
temoxa, он делает группировку по своим собственным группам. ИМХО это мешает понимать суть той или иной задержки, когда все это дело схлопывается.

Реально запросов там много. Именно аналоги Вы можете легко профайлером вытянуть. Писали к слову индусы... Если нужно что-то специфичное то надо разбираться самому (либо на форуме вопросы задавать) и своими руками писать запросы.

То что я привел. Это куски из будущего продукта, который сейчас педалю в свободное время. Так что скузи за формат запросов - я тих под себя пишу.
27 май 16, 17:36    [19229313]     Ответить | Цитировать Сообщить модератору
 Re: Выборка показателей как в Active Monitor  [new]
temoxa
Member

Откуда:
Сообщений: 405
AlanDenton, спасибо! Profiler очень помог)
27 май 16, 18:31    [19229483]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить