如何判断是否存在内存泄露,io瓶颈以及cpu的瓶颈

如何判断是否存在内存泄露,io瓶颈以及cpu的瓶颈,第1张

您好,很高兴能帮助您
百度百科 内存泄露:
一般我们常说的内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须显式释放的内存。应用程序一般使用malloc,calloc,realloc,new等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或delete释放该内存块,否则,这块内存就不能被再次使用,我们就说这块内存泄漏了。
内存泄漏是常见的问题。当以前分配的一片内存不再需要使用或无法访问时,但是却并没有释放它,那么对于该进程来说,会因此导致总可用内存的减少,这时就出现了内存泄漏。尽管优秀的编程实践可以确保最少的泄漏,但是根据经验,当使用大量的函数对相同的内存块进行处理时,很可能会出现内存泄漏。尤其是在碰到错误路径的情况下更是如此。
你的采纳是我前进的动力,
记得好评和采纳,答题不易,互相帮助,

当数据页经常从缓冲池中移进移出的时候,I/O子系统就会成为SQLServer性能问题的关键因素之一。事务日志和tempdb同样也会产生重大
的I/O压力。因此,你必须确保你的I/O子系统能按照预期运行。否则你将会成为响应时间增长和频繁超时的受害者。在这篇文章中,将描述如何使用内置工具
识别I/O相关瓶颈,并提供一些磁盘配置的方法:
性能计数器(Performance Monitor):
可以使用性能计数器来检查I/O子系统的负荷。下面的计数器可用于检查磁盘性能:
PhysicalDisk Object:AvgDiskQueue Length:计算从物理磁盘中的平均
读和写的请求队列。过高的值代表磁盘 *** 作处于等待状态。当这个值在SQLServer峰值时长期超过2,证明需要注意了。如果有多个硬盘,就需要把这些数
值除以2。比如,有4个硬盘,且队列为10,那么平均值就是10/4=25,虽然也证明需要关注,但不能使用10这个值。
AvgDisk Sec/Read和AvgDisk Sec/Write:显示从磁盘读或者写入磁盘的平均时间。10ms内是很好的表现,20以下还算能接受。高于此值证明存在问题。
Physical Disk:%Disk Time:在磁盘忙于读或者写请求的时候持续时间的比率。根据拇指定律,此值应该小于50%。
Disk Reads/Sec和Disk Writes/Sec计数器显示出在磁盘中读写 *** 作的速率。这两个值应该小于磁盘能力的85%。当超过此值,磁盘的访问时间将以指数方式增长。
可以通过以下方式来计算逐渐增长的负载的能力。一种方法是使用SQLIO。你应该找到吞吐量比较稳定,但缓慢增长。
可以使用以下公式来计算RAID配置:
Raid 0: I/O per disk = (reads + writes) / number ofdisks
Raid 1: I/O per disk = [reads + (writes2)] / 2
Raid 5: I/O per disk = [reads + (writes4)] / number of disks
Raid 10: I/O per disk = [reads + (writes2)] / number of disks
比如:对于RAID 1,如果得到下面的计数器:
Disk Reads/sec = 90
Disk Writes/sec =75
根据公式:[reads + (writes2)] / 2 or [90 + (752)] / 2 = 120I/Os每个磁盘。
动态管理视图(DMVs):
有很多游泳的DMVs可以用于检查I/O瓶颈:
当一个页面被用于读或者写访问且页面在缓冲池中不存在或不可用时,会引发一个I/O闩锁等待(I/O
latch),它会在PAGEIOLATCH_EX/PAGEIOLATCH_SH(具体根据请求类型而定)。这些等待表明一个I/O瓶颈。可以使用
sysdm_os_wait_stats找到闩锁等待的信息。如果你保存了SQLServer正常运行下的waiting_task_counts和
wait_time_ms值,并且于此次的值做对比,可以识别出I/O问题:
select
from sysdm_os_wait_stats
where wait_type like 'PAGEIOLATCH%'
order by wait_type asc
挂起的I/O请求可以在下面查询中查到,并且用于识别那个磁盘负责的这个瓶颈:
select database_id,
file_id,
io_stall,
io_pending_ms_ticks,
scheduler_address
from sysdm_io_virtual_file_stats(NULL, NULL) iovfs,
sysdm_io_pending_io_requests as iopior
where iovfsfile_handle = iopiorio_handle
磁盘碎片(Disk Fragmentation):
建议你检查磁盘碎片和配置用于SQLServer实例的磁盘。在NTFS文件系统中的碎片会产生严重的性能影响。磁盘需要经常整理碎片并且指定整理碎片计划。研究表明,一些情况下SAN在整理碎片后性能更差。因此,SAN必须根据实际情况对待。
NTFS上的索引碎片同样能引起高I/O好用。但是这和在SANs中的效果是不一样的。
磁盘配置/最佳实践:
常规情况,你应该把日志文件和数据文件分开存放以获得更好的性能。对于重负载的数据文件(包括tempdb)的I/O特性是随机读取。对于日志文件,是顺序访问的,除非事务需要回滚。
对于内置磁盘仅仅可以用于数据库日志文件,因为它们对顺序I/O有很好的性能,但是对随机I/O性能低下。
数据库的数据和日志文件应该放在对应专用的磁盘中。确保良好的性能。建议日志文件放在两个内置磁盘,并配置为RAID 1。数据文件驻留在仅用于给SQLServer访问的SAN系统中,并只被查询和报表控制。特殊访问应该被禁止。
写缓冲在可能的情况下应该被允许,并保证断电也能使用。
为了尽可能保证对于OLTP系统的I/O瓶颈影响最小化,不应该把OLAP和OLTP环境混合。并且保证你的代码优化及有合适的索引来避免不必要的I/O。

自从使用阿里云以来,我们遇到了三次故障(一、二、三),这三次故障都与磁盘IO高有关。第一次故障发生在跑zzkcnblogscom索引服务的云 服务器上,当时的AvgDisk Read Queue Length高达200多;第二次故障发生在跑imagescnblogscom静态文件的云服务器上,当时的AvgDisk Read Queue Length在2左右(后来分析,对于站点这样的直接读文件进行响应的应用,Disk Read Queue Length达到这个值会明显影响响应速度);第三次故障发生在跑数据库服务的云服务器上,当时的Avg Disk Write Queue Length达到4~5,造成很多的数据库写入 *** 作超时。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/10389110.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-08
下一篇 2023-05-08

发表评论

登录后才能评论

评论列表(0条)

保存