热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

《TroubleshootingSQLServer》读书笔记

《TroubleshootingSQLServer》读书笔记-磁盘IO配置第二章DiskIOConfiguration。对于SQLServer,磁盘IO的配置主要针对数据库工作负载,考虑和权衡两个点:1.磁盘容量VS磁盘吞吐量一个1TB的库放在一块2TB的磁盘上,容量是够了,但是磁盘吞吐量能

《Troubleshooting SQL Server》读书笔记-磁盘I/O配置 第二章 Disk I/O Configuration。 对于SQL Server,磁盘I/O的配置主要针对数据库工作负载,考虑和权衡两个点: 1. 磁盘容量VS磁盘吞吐量 一个1TB的库放在一块2TB的磁盘上,容量是够了,但是磁盘吞吐量能

《Troubleshooting SQL Server》读书笔记-磁盘I/O配置

第二章 Disk I/O Configuration。

对于SQL Server,磁盘I/O的配置主要针对数据库工作负载,考虑和权衡两个点:

1. 磁盘容量VS磁盘吞吐量

一个1TB的库放在一块2TB的磁盘上,容量是够了,但是磁盘吞吐量能满足工作负载吗?通常会使用RAID,服务器空间,合适的RAID级别也是容量与吞吐量权衡的一种结果。

2. 顺序IO VS. 随机I/O

数据库日志文件操作通常是顺序IO,数据文件通常随机IO会多很多。而磁盘的顺序IO性能要高于随机IO,因为前者需要移动磁头,后者不需要。

以工作负载不同的IO方式在存储上对数据库做隔离就很重要了。

选择正确的RAID级别(Chose the right RAID level)

使用RAID的好处,通常有:1. 增强IO性能 2. 增加IO吞吐量 3. 增加单个逻辑设备的可用容量 4. 数据冗余

而选择何种RAID级别,主要取决于工作负载的类型。像数据库日志文件以顺序写为主,就要考虑RAID的写入性能,数据文件需要在读、写和可用容量间做权衡。

RAID 0:提供数据条带化和高效的IO性能,但是没有数据冗余保护,所以SQL Server一般不采用。

RAID 1: 提供完全的数据冗余保护,较低IO性能,成本较高。可以考虑放置单个的事务日志文件。如果放置多个事务日志文件,香港空间,则每个日志文件的顺序IO操作交织在一起,

就变成了随机IO,性能会下降。

RAID 5(6): 提供数据冗余保护,且容量损失少,高效读性能。但是写性能相对较低。每次某块数据更新时,则要重新计算和更新奇偶效验数据。当某块磁盘失效,整个RAID的性能会急剧下降,

因为读取失效磁盘上的数据,需要经过效验计算得到。RAID6是RAID5的扩展,只是存有两份效验数据在不同的磁盘上,但可用容量只有磁盘总量的一半且至少4块盘。

这样,虚拟主机,还不如用RAID10。可以考虑放置读多于写的数据文件。

RAID10: 先组成RAID1,再用RAID1组成RAID0。容量只有磁盘总容量的一半,提供数据冗余保护,写入性能相对较快。最多允许每组RAID1失效一块磁盘。

比相同数量的磁盘RAID5读性能要慢一些。

RAID01: 先组成RAID0,再用RAID0组成RAID1。最多只允许其中一组RAID0失效。当任意一块磁盘失效,整个RAID01也失效了。数据丢失风险高于RAID10。

除了磁盘本身的硬性性能外,还有一些很重要因素影响其性能:

1. RAID控制器的缓存大小和配置 2. RAID条带大小 3. 分区对齐 4. NTFS格式化的文件簇大小

一定要做基准测试来确定IO子系统的配置正确性,不能迷恋于理论上的数据。推荐的基准测试工具SQLIO和IOmeter,推荐SQL Server压力测试工具SQLIOSim

数据文件、日志文件和tempdb最好物理隔离。

数据文件:读远多于写、只读或者写延迟不影响系统性能的情况下可置于RAID5或者RAID6.相反则可以考虑RAID10.

日志文件:可以考虑RAID1和RAID10。多个写入频繁的日志文件置于同一个物理磁盘上或者磁盘碎片会加剧写入压力。

tempdb: 它的功能决定它是写密集型数据库,最好与用户库物理隔离,置于raid1或者RAID10。当然也可以置于SSD和RAMDisk上。

可以为tempdb创建多个相同配置的数据文件,减少系统页急用问题。

DAS VS. SAN

DAS简单附加即可使用,性能可预估,也不需要额外经验维护,同时也没有SAN的各种高级功能(如支持集群、磁盘阵列镜像和基于阵列的复制)。相对便宜。

SAN适用于企业级存储,相对较贵。但它是用于优化存储使用方式,而不一定是优化存储性能。

对故障诊断需要额外的存储经验或者依赖于外部资源(SAN管理员或者供应商)。

诊断磁盘IO问题

两个比较重要的性能计数器Avg. Disk sec/Read和Avg. Disk sec/Write。

一般它们的值<10ms=好,10~20ms=有点慢,20~50ms=很慢,>50ms=存在性能问题。

IO瓶颈通常还有PAGEIOLATCH_*, ASYNC_IO_COMPLETION, IO_COMPLETION, 或者 WRITELOG等待类型的严重等待。

常见的磁盘I/O问题

诊断磁盘问题前,一定要确认系统不存其它方面的瓶颈。

1. 只考虑容量而非性能

一个1TB的OLTP库放在一块2TB的磁盘上,容量满足,性能通常满足不了。SAN网络和磁盘通常不会是SQL Server独占的,SQL Server也不知道LUN是否是独立的物理磁盘。

很多时候是与其它应用共享的,故障诊断时就要特别关注IO指标是否只是SQL Server造成的。

2. 错误的负载隔离

数据文件、日志文件和tempdb要物理隔离,因为IO方式大相径庭。还要特别注意SAN分配给SQL Server的存储单元是否与其它应用物理隔离。

3. 错误的分区对齐

参照Storage Area Network (SAN) for DBA's

4. 错误的SAN带宽配置

不要迷恋理论值或者供应商提供的数据,一定要经过基准测试,确保SAN的性能满足工作负载,尤其是多路SAN。

总结

对于存储,一定要有清晰的规划,一定要经过测试(基准和压力)。

posted on

推荐阅读
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了如何找到并终止在8080端口上运行的进程的方法,通过使用终端命令lsof -i :8080可以获取在该端口上运行的所有进程的输出,并使用kill命令终止指定进程的运行。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
author-avatar
上海十里红妆婚礼策划红_196
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有