linux系统idle很高,但是负载也很高是什么情况

linux系统idle很高,但是负载也很高是什么情况,第1张

使用SSH 命令 *** 作也没感觉 很慢就是访问

top - 16:10:43 up 50 min, 2 users, load average: 472, 458, 435

Tasks: 114 total, 1 running, 113 sleeping, 0 stopped, 0 zombie

%Cpu(s): 187 us, 30 sy, 00 ni, 375 id, 406 wa, 02 hi, 00 si, 00 st

KiB Mem: 7693560 total, 1957232 used, 5736328 free, 47460 buffers

KiB Swap: 0 total, 0 used, 0 free 1291540 cached Me

诊断思路

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使用率对比

以上就是关于linux系统idle很高,但是负载也很高是什么情况全部的内容,包括:linux系统idle很高,但是负载也很高是什么情况、如何优化因 MYSQL 读写频繁,负载过高导致的CPU高占用率、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存