SQL Server I/O 问题的诊断分
一. SQL Server 什么时候和磁盘打交道:
1. SQL 需要访问的数据没有在Buffer pool中,第一次访问时需要将数据所在的页面从数据文件中读取到内存中。(只读)
2. 在insert/update/delete提交之前, 需要将日志记录缓存区写入到磁盘的日志文件中。(写)
3. Checkpoint的时候,需要将Buffer pool中已经发生修改的脏数据页面同步到磁盘的数据文件中。(写)
4. 当Buffer pool空间不足的时候, 会触发Lazy writer, 主动将内存中的一些很久没有使用过的数据页面和执行计划清空。如果这些页面上的修改还没有被检查点写回硬盘, Lazy writer 会将其写回。(写)
5. DBCC checkDB, Reindex, Update Statistics, database backup等操作, 会带来比较大的硬盘读写。(读/写)
二. 哪些SQL 配置会对I/O有影响:
1. ( Recovery Interval, 默认60秒)(Checkpoint pages/sec + Avg. Disk Queue Length + Batch Requests/sec)
2. 数据文件和日志文件的自动增长和自动收缩。对于生成数据库,要避免自动增长和自动收缩。
3. 数据文件中的页面碎片程度 (Clustered index) : dbcc showcontig('table_name') -- avg. Page Density(full) 碎片多,读取/写入的页面多(set statistics io on -- logical reads)
4. 表上的索引结构: 聚集索引的表和堆表的存储管理不同。
5. 数据压缩: 可以减少I/O, 但会消耗CPU和内存资源。
6. 数据文件和日志文件分别放在不同的硬盘上,日志要放在写入速度较快的硬盘上, 如RAID10
7. 数据文件可以有多个分别放到不同硬盘上的文件, SQL server会将新数据按照同一个文件组的每个文件剩余空间的大小, 按比例写入到所有有剩余空间的文件中。 而日志文件则不同, 在一个时间点只会写一个日志文件。 所以在不同的硬盘上建日志文件对性能没有什么帮助。
三. 操作系统I/O问题的诊断:
1. 在判断SQL I/O问题之前,先看看Windows层面I/O是否正常。 如果很忙,再确认是不是SQL造成的。
2. LogicalDisk and PhysicalDisk:
%idle time:
%disk time: = %disk read time + %disk write time
%disk read time
%disk write time
Avg. disk sec/read
Avg. disk sec/write: 很好:<10ms 一般:10-20ms 有点慢:20-50ms 非常慢:> 50ms
Avg. disk bytes/transfer
Avg. disk queue length: 不应该长时间>2 (SAN 盘就不同)
Avg. disk read queue length
Avg. disk write queue length
Disk Bytes/sec: 好:20-40MB 一般:10-20MB
Disk Read Bytes/sec
Disk Write Bytes/sec
Disk Transfers/sec
Disk Reads/sec
Disk Writes/sec
Current Disk queue length
四. SQL Server 内部分析:
1. 检查sys.dm_exec_requests 或者 sys.dm_os_wait_stats:
select wait_type,
waiting_tasks_count,
wait_time_ms
from sys.dm_os_wait_stats
where wait_type like 'PAGEIOLATCH' -- PAGEIOLATCH_EX(写) PAGEIOLATCH_SH(读) 主要反映数据文件上的I/O等待
order by wait_type
2. 找出那个数据库哪个文件总做I/O,是数据文件还是日志文件, 经常读,还是经常写:
select db.name as database_name, f.fileid as file_id, f.filename as file_name,
i.num_of_reads, i.num_of _bytes_read, i.io_stall_read_ms,
i.num_of_writes, i.num_of_bytes_written, i.io_stall_write_ms,
i.io_stall, i.size_on_disk_bytes
from sys.database db inner join sys.sysaltfiles f on db.database_id=f.dbid
inner join sys.dm_io_virtual_file_stats(NULL,NULL) i on i.database_id=f.dbid and i.file_id=f.fileid
select database_id, file_id, io_stall, io_pending_ms_ticks, scheduler_address -- check every pending I/O request
from sys.dm_io_virtual_file_stats(NULL,NULL) t1, sys.dm_io_pending_io_requests as t2
where t1.file_handle=t2.io_handle
-- check which table in buffer pool and how mang size of it
declare @name nvarchar(100)
declare @cmd nvarchar(1000)
declare dbname cursor for
select name from master.dbo.sysdatabases
open dbname
fetch next from dbname into @name
while @@fetch_status = 0
begin
set @cmd= 'select b.databse_id, db=dbname(b.database_id), p.object_id, p.index_id, buffer_count=count(*) from ' + @name + '.sys.allocation_units a, '
+ @name + '.sys.dm_os_buffer_descriptions b, ' + @name+ '.sys.partitions p
where a.allocation_unit_id=b.allocation_unit_id
and a.container_id=p.hobt_id
and b.database_id=db_id(''' + @name+ ''')
group by b.database_id, p.object_id, p.index_id
order by b.database_id, buffer_count desc'
exec(@cmd)
fetch next from dbname into @name
end
close dbname
deallocate dbname
go
五. 和SQL相关的计数器:
1. Buffer manager:
page reads/sec and page writes/sec
Lazy writes/sec
Checkpoint writes/sec
Readahead pages/sec
2. Access Methods:
Freespace scans/sec
Page splits/sec
Page allocations/sec
Workfiles/sec
Worktables/sec
Full scans/sec
Index Searches/sec
3. Database(Log Activity)
Log flushes/sec
Log Bytes flushed/sec
Log flush wait time
Log flush waits/sec
六. 硬盘压力测试:
SQLIO 下载地址:http://www.microsoft.com/en-us/download/details.aspx?id=20163#QuickInfoContainer
SQLIO 已经升级成 DiskSPD。 在上面的链接中下载readme.pdf, 该文件中有下载地址。 Diskspd-v2.0.17.zip 解压之后如下图:
UsingDiskspdforSQLServer.docx里面有详细的使用说明和分析方法。
SQL Server I/O 问题的诊断分的更多相关文章
- 【监控笔记】【2.4】SQL Server中的 Ring Buffer 诊断各种系统资源压力情况
SQL Server 操作系统(SQLOS)负责管理特定于SQL Server的操作系统资源. 其中相关的动态管理试图sys.dm_os_ring_buffers将被标识为仅供参考.不提供支持.不保证 ...
- 搭建SQL server AwaysOn集群
1.环境 系统:windows server 2012 R2 数据库版本:SQL server 2012 三台服务器,IP分别是:10.10.10.111,10.10.10.112,10.10.10. ...
- SQL Server安全(2/11):身份验证(Authentication)
在保密你的服务器和数据,防备当前复杂的攻击,SQL Server有你需要的一切.但在你能有效使用这些安全功能前,你需要理解你面对的威胁和一些基本的安全概念.这篇文章提供了基础,因此你可以对SQL Se ...
- Oracle与SQL Server事务处理的比较
事务处理是所有大型数据库产品的一个关键问题,各数据库厂商都在这个方面花费了很大精力,不同的事务处理方式会导致数据库性能和功能上的巨大差异.事务处理也是数据库管理员与数据库应用程序开发人员必须深刻理解的 ...
- SQL Server Log文件对磁盘的写操作大小是多少
原文:SQL Server Log文件对磁盘的写操作大小是多少 SQL Server 数据库有三种文件类型,分别是数据文件.次要数据文件和日志文件,其中日志文件包含着用于恢复数据库的所有日志信息,SQ ...
- SQL Server 2012中快速插入批量数据的示例及疑惑
SQL Server 2008中SQL应用系列--目录索引 今天在做一个案例演示时,在SQL Server 2012中使用Insert语句插入1万条数据,结果遇到了一个奇怪的现象,现将过程分享出来,以 ...
- 《Troubleshooting SQL Server》读书笔记-内存管理
自调整的数据库引擎(Self-tuning Database Engine) 长期以来,微软都致力于自调整(Self-Tuning)的SQL Server数据库引擎,用以降低产品的总拥有成本.从SQL ...
- SQL Server 2012内部原理及故障排除(专栏)
PROFESSIONAL SQL SERVER® 2012 INTERNALS AND TROUBLESHOOTING一书(可从这里下载).认为内容非常不错.自己也想对SQL Server 2012有 ...
- Sql Server 内存相关计数器以及内存压力诊断
在数据库服务器中,内存是数据库对外提供服务最重要的资源之一, 不仅仅是Sql Server,包括其他数据库,比如Oracle,MySQL等,都是一类非常喜欢内存的应用. 在Sql Server服务器中 ...
随机推荐
- MAC虚拟机NAT方式共享上网设置
有部分FY需要,我写一下我的方法吧,当初安装完MAC后,无法上网,网络搜索用的是HOST-only方法,试了几次都没有成功,后来尝试NAT方法,发现很简单. 我的主机系统:win7 64位,自动获取I ...
- sys.argv[]基本用法
#python 3.4.2 #windows系统下可以在CMD下执行 python test.py 第一参数 第2个参数 #空格分隔每个参数,sys.argv[]是用来获取命令行参数的 #引用必要的包 ...
- ASP.NET_验证控件(class0620)
为什么使用验证控件 当需要让用户输入数据时,用户有可能输入不符合我们程序逻辑要求的信息,所以我们要对输入进行验证. 客户端验证(用户体验,减少服务器端压力) 服务器端验证(防止恶意攻击,客户端js很容 ...
- 问题:关于贴友一个用js传递value默认值的简单实现
需求和代码如下: “这是我的代码:” 1: <input type="text" id="price2" value="333"/&g ...
- leetcode Pow(doubule x,int n)
今天第一天开通博客,心情还是小激动的 上代码: 方法一:常规递归,x的n次方={xn/2*xn/2 //n为偶 xn/2*xn/2 *x //n为奇数 } ...
- IntelliJ远程调试教程
概述 对于分布式系统的调试不知道大家有什么好的方法.对于我来说,在知道远程调试这个方法之前就是在代码中打各种log,然后重新部署,上线,调试,这样比较费时.今天咱们来了解了解Java远程调试这个牛逼的 ...
- 用UGN3503霍尔器件制作的数字指南针_电路图
本文介绍了用两个UGN3503型霍尔器件设计制作的数字指南针的设计目的.系统结构和工作原理,以及各主要器件的使用方法.本系统包括UGN3503型霍尔器件.TLC0832 A/D转换器.单片机控制.液晶 ...
- _int、NSInteger、NSUInteger、NSNumber的区别和联系
1.首先先了解下NSNumber类型: 苹果官方文档地址:https://developer.apple.com/library/ios/documentation/Cocoa/Reference/F ...
- JAVA的设计模式之单例设计模式
1.确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例. 1)理论 Java Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在. 使用Singl ...
- SQL Server里一些未公开的扩展存储过程
SQL Server里一些未公开的扩展存储过程 [转帖] 博客天地 www.inbaidu.com SQL Server里一些未公开的扩展存储过程 扩展存储过程(xp)是直接运行在SQL Server ...