mssql数据库占用CPU过高

mssql数据库占用CPU过高,第1张

CPU占用过高诊断思路

mpstat -P ALL 1,查看cpu使用情况,主要消耗在sys即os系统调用上

perf top,cpu主要消耗在_spin_lock

生成perf report查看详细情况

CPU主要消耗在mutex争用上,说明有锁热点

采用pt-pmp跟踪mysqld执行情况,热点主要集中在mem_heap_alloc和mem_heap_free上。

Pstack提供更详细的API调用栈

Innodb在读取数据记录时的API路径为

row_search_for_mysql --》row_vers_build_for_consistent_read --》mem_heap_create_block_func --》mem_area_alloc --》malloc --》  _L_unlock_10151 --》__lll_unlock_wait_private

row_vers_build_for_consistent_read会陷入一个死循环,跳出条件是该条记录不需要快照读或者已经从undo中找出对应的快照版本,每次循环都会调用mem_heap_alloc/free。

而该表的记录更改很频繁,导致其undo history list比较长,搜索快照版本的代价更大,就会频繁的申请和释放堆内存。

Linux原生的内存库函数为ptmalloc,malloc/free调用过多时很容易产生锁热点。

当多条 SQL 并发执行时,会最终触发os层面的spinlock,导致上述情形。

解决方案

将mysqld的内存库函数替换成tcmalloc,相比ptmalloc,tcmalloc可以更好的支持高并发调用。

修改mycnf,添加如下参数并重启

[mysqld_safe]malloc-lib=tcmalloc

上周五早上7点执行的 *** 作,到现在超过72小时,期间该实例没有再出现cpu长期飙高的情形。

以下是修改前后cpu使用率对比

没啥办法,SQL Server 自带的那些性能分析工具绝大部分都是从 2003 以后的版本才开始提供的。

但绝大部分 CPU 飙升都是因为错误的索引或者没有索引导致的查询效率降低。

网上一搜一堆的脚本。使用sysdatabases和sysdm_exec_sessions,sysdm_exec_connections三个DMV进行关联就可以。语句你自己去网上找吧,希望你能靠自己学会解决问题。

简单地说,由于SQL2000太老了,2000年那时候还没有那么多CPU,所以最多只能认到16个。建议还是上SQL Server 2005或2008企业版。具体SQL Server支持的最大CPU,内存等信息在SQL Server帮助文件的安装需求里面都有。例如下面的链接是SQL Server 2008R2支持的最大CPU和内存等数量。可以看到,即使是SQL Server 2008R2这样最新的数据库软件,企业版最多支持的CPU也只是8个。你可以装一个SQL Server 2008 试试看,如果还是不能全部认出,就需要数据中心版的SQL Server了。

>

以上就是关于mssql数据库占用CPU过高全部的内容,包括:mssql数据库占用CPU过高、SQL Server2000中如何查询CPU占用高的SQL语句、SQLServer一个实例有很多数据库,如何查询该实例所有数据库的消耗CPU占Top50的SQL脚本等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/sjk/9733888.html

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

发表评论

登录后才能评论

评论列表(0条)

保存