当前位置:首页 > 内存 > 正文

mysql数据库内存占用太高(数据库内存占用太高)

  • 内存
  • 2024-06-09 02:39:12
  • 6349

一、MySQLCPU占用过高怎么办

CPU占用率过高的解决方法如下:

1.同时按下键盘上的Ctrl+Alt+Delete,然后单击“激活任务管理器”以检查CPU使用情况。。(这里游戏没有运行,打开的后台程序也不多,所以只有27%。)

2.按Win+R,在“运行”窗口中键入“msconfig”,然后单击“开始”。为了减少CPU使用率,请避免打开太多不必要的程序。


二、mssql数据库占用CPU过高?

CPU使用率过高的诊断思路

mpstat-PALL1,检查主要由sys或os系统调用消耗的CPU使用率。

perftop,CPU主要被_spin_lock消耗

生成perfreport,详细显示

CPU大部分被消耗表明互斥锁争用已开启并且存在锁定热点。

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

Pstack提供了更详细的API调用栈。

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

row_search_for_mysql--》row_vers_build_for_concient_read-。-》mem_heap_create_block_func--》mem_area_alloc--》malloc--》_L_unlock_10151--》__lll_unlock_wait_private


row_vers_build_for_concient_read进入无限循环。退出条件是该记录不需要快照读取,或者从undo中找到对应的快照版本,并且每次循环都会调用mem_heap_alloc/free。

该表中的记录变化非常频繁,因此undohistorylist比较长,查找快照版本的成本较高,堆内存的申请和释放也很频繁。

Linux原生的内存库函数是ptmalloc。过多的malloc/free调用可能会导致锁定热点。

当多个SQL语句同时执行时,最终会触发OS层面的自旋锁,从而导致上述情况。


解决办法

将mysqld的内存库函数替换为tcmalloc。与ptmalloc相比,tcmalloc可以更好地支持大量并发调用。

改,添加以下参数并重启。

[mysqld_safe]malloc-lib=tcmalloc

上周五早上7点的执行操作持续了72个小时以上,期间实例没有长期CPU激增。

以下是更改前后的CPU使用率对比。