距离5000公里以外的光纤专用广域网连接的SQL服务器的性能performance合理吗? 运营商告诉我们,这个networking是“最好的”可能的,并且会引入小于50ms的延迟保证。
我们的数据库目前通过千兆以太网连接到同一数据中心内的其他机器。 在两个DC之间进行一个5000公里的LAN扩展对我们来说是吸引人的。 但是当我们通过互联网和VPN连接时,我们发现在大量的小型交易中性能很慢。 我们没有任何广域网的经验,所以不知道大多数公司在这些情况下做什么。 我们可以模拟5000kms的“延迟”吗?
在光速5000Kms将是〜17ms的延迟。 下光纤,更像25ms。 这是一个最好的服务器到服务器光纤,没有媒体转换,交换,路由,服务器响应等延迟。
最小值为25ms,保证最大值为50ms
是的,有工具来模拟慢速链接,例如
http://jagt.github.io/clumsy/ – 用于改变networkingstream量的Windows程序
http://wanem.sourceforge.net/ – 用于WAN仿真的Linux LiveCD
比较sys.dm_os_wait_stats轮询模拟的高networking延迟时间和相同的正常networking延迟时间(对于相同的客户端负载和相同的数据库统计数据)之间的轮询。 例如,以下脚本可用于比较“ASYNC_NETWORK_IO”[wait_type]的[wait_rate(ms / Sec)]。 在X中测量的差异低至XX%可能在背景噪声的影响下(即它们没有意义)。 以XXX%衡量的差异可能是相关的。 为了让你对wait_rates的相对重要性有一个定性的理解,你将会看到:如果你的SQL Server有500个活动的工作线程,并且如果这500个线程全部等待一个wait_type(对于给定的时间段) ,那么这个[wait_type]的[wait_rate(ms / Sec)]就是500,000 ms / sec。 我通常忽略小于1000毫秒/秒的[wait_rate(ms /秒)] s。
下面的脚本是为了收集20秒钟的数据而编写的。 这可以调整(根据您的testing需求)。 该脚本不会将wait_types聚合到类别中(例如,此脚本不会将所有PAGEIO%等待在一起)。
DECLARE @hhmmssDelay CHAR(8) = '00:00:20' SET NOCOUNT ON CREATE TABLE #ignored ( wait_type NVARCHAR(60) PRIMARY KEY ) INSERT #ignored SELECT 'BAD_PAGE_PROCESS' UNION SELECT 'BROKER_EVENTHANDLER' UNION SELECT 'BROKER_RECEIVE_WAITFOR' UNION SELECT 'BROKER_TASK_STOP' UNION SELECT 'BROKER_TO_FLUSH' UNION SELECT 'BROKER_TRANSMITTER' UNION SELECT 'CHECKPOINT_QUEUE' UNION SELECT 'CLR_AUTO_EVENT' UNION SELECT 'CLR_MANUAL_EVENT' UNION SELECT 'DBMIRROR_EVENTS_QUEUE' UNION SELECT 'DISPATCHER_QUEUE_SEMAPHORE' UNION SELECT 'FT_IFTS_SCHEDULER_IDLE_WAIT' UNION SELECT 'FT_IFTSHC_MUTEX' UNION SELECT 'KSOURCE_WAKEUP' UNION SELECT 'LAZYWRITER_SLEEP' UNION SELECT 'LOGMGR_QUEUE' UNION SELECT 'ONDEMAND_TASK_QUEUE' UNION SELECT 'PREEMPTIVE_OS_AUTHENTICATIONOPS' UNION SELECT 'PREEMPTIVE_OS_GETPROCADDRESS' UNION SELECT 'REQUEST_FOR_DEADLOCK_SEARCH' UNION SELECT 'RESOURCE_QUEUE' UNION SELECT 'SLEEP_BPOOL_FLUSH' UNION SELECT 'SLEEP_SYSTEMTASK' UNION SELECT 'SLEEP_TASK' UNION SELECT 'SQLTRACE_BUFFER_FLUSH' UNION SELECT 'WAITFOR' UNION SELECT 'XE_DISPATCHER_JOIN' UNION SELECT 'XE_DISPATCHER_WAIT' UNION SELECT 'XE_TIMER_EVENT' UNION SELECT 'SQLTRACE_INCREMENTAL_FLUSH_SLEEP' UNION SELECT 'DIRTY_PAGE_POLL' UNION SELECT 'HADR_FILESTREAM_IOMGR_IOCOMPLETION' -- May be useful for AlwaysON (AKA Hadron) SELECT GETDATE() 'Poll' , ows.* INTO #os_wait_stats FROM sys.dm_os_wait_stats ows LEFT JOIN #ignored i ON i.wait_type = ows.wait_type WHERE i.wait_type IS NULL WAITFOR DELAY @hhmmssDelay INSERT #os_wait_stats SELECT GETDATE() 'Poll', ows.* FROM sys.dm_os_wait_stats ows LEFT JOIN #ignored i ON i.wait_type = ows.wait_type WHERE i.wait_type IS NULL DECLARE @SecondsBetweenPolls INT SELECT @SecondsBetweenPolls=DATEDIFF(SECOND,MIN(Poll),MAX(Poll)) FROM #os_wait_stats DECLARE @SecondsSinceSQLServerStarted BIGINT DECLARE @LastPoll DATETIME SELECT @LastPoll=MAX(Poll) FROM #os_wait_stats SELECT @SecondsSinceSQLServerStarted =DATEDIFF(SECOND, sqlserver_start_time, @LastPoll) FROM sys.dm_os_sys_info SELECT CONVERT(NUMERIC(38,0),(Later.wait_time_ms-Earlier.wait_time_ms))/CONVERT(NUMERIC(38,0),@SecondsBetweenPolls) 'wait_rate (ms/Sec)' ,Later.wait_type ,Later.waiting_tasks_count-Earlier.waiting_tasks_count 'waiting_tasks_count' ,Later.signal_wait_time_ms-Earlier.signal_wait_time_ms 'signal_wait_time_ms' ,Later.wait_time_ms-Earlier.wait_time_ms 'wait_time_ms' ,CONVERT(NUMERIC(38,0),(Later.wait_time_ms))/CONVERT(NUMERIC(38,0),@SecondsSinceSQLServerStarted)'cumulative_wait_rate (ms/Sec)' ,Later.wait_time_ms 'cumulative_wait_time_ms' ,Earlier.Poll 'earlier_poll' ,Later.Poll 'later_poll' ,Earlier.max_wait_time_ms 'earlier_max_wait_time_ms' ,Later.max_wait_time_ms 'later_max_wait_time_ms' FROM #os_wait_stats Later JOIN ( SELECT wait_type ,wait_time_ms ,waiting_tasks_count ,signal_wait_time_ms ,max_wait_time_ms ,Poll FROM #os_wait_stats WHERE Poll = ( SELECT MIN(Poll) FROM #os_wait_stats ) ) as Earlier ON Earlier.wait_type = Later.wait_type WHERE Later.wait_time_ms-Earlier.wait_time_ms > 0 ORDER BY CONVERT(NUMERIC(38,0),(Later.wait_time_ms-Earlier.wait_time_ms))/CONVERT(NUMERIC(38,0),@SecondsBetweenPolls) -- 'wait_rate (ms/Sec)' DESC GO DROP TABLE #os_wait_stats GO DROP TABLE #ignored