惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Forbes - Security
Forbes - Security
GbyAI
GbyAI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
S
SegmentFault 最新的问题
Y
Y Combinator Blog
Recorded Future
Recorded Future
博客园 - Franky
I
InfoQ
T
The Blog of Author Tim Ferriss
Recent Announcements
Recent Announcements
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园_首页
阮一峰的网络日志
阮一峰的网络日志
T
Tailwind CSS Blog
Cyberwarzone
Cyberwarzone
The Register - Security
The Register - Security
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
雷峰网
雷峰网
P
Palo Alto Networks Blog
G
GRAHAM CLULEY
Cloudbric
Cloudbric
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
MongoDB | Blog
MongoDB | Blog
F
Full Disclosure
Google DeepMind News
Google DeepMind News
Recent Commits to openclaw:main
Recent Commits to openclaw:main
C
Check Point Blog
爱范儿
爱范儿
The GitHub Blog
The GitHub Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
W
WeLiveSecurity
T
Threat Research - Cisco Blogs
U
Unit 42
N
Netflix TechBlog - Medium
The Cloudflare Blog
Spread Privacy
Spread Privacy
Microsoft Azure Blog
Microsoft Azure Blog
美团技术团队
T
Troy Hunt's Blog
Engineering at Meta
Engineering at Meta
H
Heimdal Security Blog
TaoSecurity Blog
TaoSecurity Blog
C
Cybersecurity and Infrastructure Security Agency CISA
T
Tenable Blog
B
Blog
S
Securelist
H
Hacker News: Front Page
Google Online Security Blog
Google Online Security Blog
G
Google Developers Blog

博客园 - 湖东

土鸡钵 工作中常见的一些英语(三) 工作中常见的一些英语(二) IDEA Community环境搭建笔记 查死锁 Jemeter使用 记录 ASP.NET并发处理 如何管理一个散漫的团队 平板开发常用框架了解 关于团队管理的一些好贴 maven项目对象配置文件 pom.xml 解析(l转载) eclipse + maven +tomcat 开发环境搭建 正则表达式30分钟入门教程(转载) java算法计算一元一次方程 前端进阶知识汇总 速度提高几百倍,记一次数据结构在实际工作中的运用(转) SQL Server应用模式之OLTP系统性能分析(转载网上的文章并结合自已的实例 ,部分脚本有做调整 ) 一次性能优化实战经历 Sqlserver:动态性能视图:sys.dm_os_wait_stats
SQL Server I/O 问题的诊断分析(转载)
湖东 · 2020-12-08 · via 博客园 - 湖东

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 dbname,
       f.fileid as [fileid],
       f.filename as [filename],
       convert(numeric(5,2),i.io_stall_read_ms/(num_of_reads+1.0))   AS 'Avg Read ms/Transfer',
       convert(numeric(5,2),i.io_stall_write_ms/(num_of_writes+1.0)) AS 'Avg Write ms/Transfer',
       i.num_of_reads,
       i.num_of_bytes_read/1024/1024 as num_of_mb_read,
       i.io_stall_read_ms,
       i.num_of_writes,
       i.num_of_bytes_written/1024/1024 as num_of_mb_write,
       i.io_stall_write_ms,
       i.io_stall,
       i.size_on_disk_bytes
  from sys.databases 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
--order by i.num_of_reads desc
--order by i.num_of_writes desc

 check every pending I/O request

select database_id,
       file_id,
       io_stall,
       io_pending_ms_ticks,
       scheduler_address  
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

五. 和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

六. 硬盘压力测试:

  可以使用 DiskSPD