Home Forums SQL Server 2012 SQL 2012 - General Mirroring monitor:" "current restore rate" low (100 KB/s) while "unrestored log" enourmous (100's GB) RE: Mirroring monitor:" "current restore rate" low (100 KB/s) while "unrestored log" enourmous (100's GB)

  • Hi Kevin,

    I did'nt add the waitstates because on the mirror there are only 2 (Script at end of message)

    Top 10 Waits @ primary

    WaitTypePercentage

    CXPACKET40.70

    DBMIRROR_WORKER_QUEUE8.58

    LATCH_EX8.40

    HADR_FILESTREAM_IOMGR_IOCOMPLETION8.07

    DIRTY_PAGE_POLL8.07

    SP_SERVER_DIAGNOSTICS_SLEEP8.07

    SOS_SCHEDULER_YIELD1.92

    BACKUPIO1.75

    ASYNC_IO_COMPLETION1.40

    ASYNC_NETWORK_IO1.30

    All Waits @ mirror

    WaitType Percentage

    DBMIRROR_DBM_MUTEX 96.89%

    DBMIRROR_SEND 2.86%

    The mirror is a dedicated fallback, nothing else runs on it except our home grown sql management tooling.

    I think i have IO stalls excluded as a root cause, because the restore rate is equally abysmal on the original harddisk, and on a Fusion IO that has allmost no IO besides this DWH DB.

    So... <sighs deeply>, unless you or Kevin Kline, who has also graciously agreed to "give a look" come up with an other idea, i will throw myself at the mercy of a Microsoft CST engineer. We have 19 calls left on our gold contract....

    But my experience with MS support is that there is a linear relationship between the complexity of the problem, and the number of useless hoops they make you jump through, like adding useless patches. (i have read *all* the available patch notes, and NO patch has any bearing on the mirror issue at hand)

    I will try one more thing today, and that is the move from the deprecated mirroring to full blown HA / AG.

    Theo 🙂

    The exclusion list i use in my script i use is based on some post of Paul Randal, "tell me where it hurts"

    WITH Waits AS

    (SELECT

    wait_type,

    wait_time_ms / 1000.0 AS WaitS,

    (wait_time_ms - signal_wait_time_ms) / 1000.0 AS ResourceS,

    signal_wait_time_ms / 1000.0 AS SignalS,

    waiting_tasks_count AS WaitCount,

    100.0 * wait_time_ms / SUM (wait_time_ms) OVER() AS Percentage,

    ROW_NUMBER() OVER(ORDER BY wait_time_ms DESC) AS RowNum

    FROM sys.dm_os_wait_stats

    WHERE wait_type NOT IN (

    'CLR_SEMAPHORE', 'LAZYWRITER_SLEEP', 'RESOURCE_QUEUE', 'SLEEP_TASK',

    'SLEEP_SYSTEMTASK', 'SQLTRACE_BUFFER_FLUSH', 'WAITFOR', 'LOGMGR_QUEUE',

    'CHECKPOINT_QUEUE', 'REQUEST_FOR_DEADLOCK_SEARCH', 'XE_TIMER_EVENT', 'BROKER_TO_FLUSH',

    'BROKER_TASK_STOP', 'CLR_MANUAL_EVENT', 'CLR_AUTO_EVENT', 'DISPATCHER_QUEUE_SEMAPHORE',

    'FT_IFTS_SCHEDULER_IDLE_WAIT', 'XE_DISPATCHER_WAIT', 'XE_DISPATCHER_JOIN', 'BROKER_EVENTHANDLER',

    'TRACEWRITE', 'FT_IFTSHC_MUTEX', 'SQLTRACE_INCREMENTAL_FLUSH_SLEEP',

    'BROKER_RECEIVE_WAITFOR', 'ONDEMAND_TASK_QUEUE', 'DBMIRROR_EVENTS_QUEUE',

    'DBMIRRORING_CMD', 'BROKER_TRANSMITTER', 'SQLTRACE_WAIT_ENTRIES',

    'SLEEP_BPOOL_FLUSH', 'SQLTRACE_LOCK')

    )

    SELECT

    W1.wait_type AS WaitType,

    CAST (W1.WaitS AS DECIMAL(14, 2)) AS Wait_S,

    CAST (W1.ResourceS AS DECIMAL(14, 2)) AS Resource_S,

    CAST (W1.SignalS AS DECIMAL(14, 2)) AS Signal_S,

    W1.WaitCount AS WaitCount,

    CAST (W1.Percentage AS DECIMAL(4, 2)) AS Percentage,

    CAST ((W1.WaitS / W1.WaitCount) AS DECIMAL (14, 4)) AS AvgWait_S,

    CAST ((W1.ResourceS / W1.WaitCount) AS DECIMAL (14, 4)) AS AvgRes_S,

    CAST ((W1.SignalS / W1.WaitCount) AS DECIMAL (14, 4)) AS AvgSig_S

    FROM Waits AS W1

    INNER JOIN Waits AS W2 ON W2.RowNum <= W1.RowNum

    GROUP BY W1.RowNum, W1.wait_type, W1.WaitS, W1.ResourceS, W1.SignalS, W1.WaitCount, W1.Percentage

    HAVING SUM (W2.Percentage) - W1.Percentage < 98; -- percentage threshold