MySQL 服务器 sys CPU usage高问题分析

分析思路
- %sy(sys)
表示CPU 在内核态运行的时间百分比(不包括中断),就是说系统进程消耗CPU 时间,通常内核态 CPU 越低越好,否则表示系统存在某些瓶颈。比如:I/O频繁操作,网络包大量传输,core输出 等情况下。 - mysql对于cpu的影响:
并发太高,连接数满很多线程需要等待,mysql参数控制并发度,大事务 等。
问题分析
指标分析



5.MySQL限制并发: 无限制




发现SYS CPU利用率到达79%时,后台运行_reset_isolation_suitable 突然达到98%
- mov rdi,rax说明:
将rax寄存器的的数据传送到rdi寄存器,但是rax寄存器的数据本身不破坏 - reset_isolation_suitable:
内存碎片管理
原理分析
CPU指中央处理器,中央处理器的功效主要为处理指令、执行操作、控制时间、处理数据。CPU和内存之间的架构分为两种:

物理内存由node,zone,page三级结构来构成。
- ZONE_NORMAL: 正常使用的物理内存区域,大部分申请的内存都使用的是该区域
- ZONE_HIGHMEM:只会出现在32位系统内,这时由于在32位系统中,物理内存最多能够直接映射到内核中896M内存
- ZONE_MOVABLE: 可移动或回收区域,所管理的物理内存来自于ZONE_NORMAL或者ZONE_HIGHMEM,主要是防止内存碎片和支持热插拔功能,内核将ZONE_NORMAL或者ZONE_HIGHMEM中根据配置划分出一片物理内存为ZONE_MOVABLE。
- 可以有效防止内存碎片化。
- 支持内存热插拔,尤其是在虚拟化场景,当不需要那么多物理内存时可以释放处理给系统其他程序使用,当需要申请新的物理内存时重新进程插入。
定位分析
Linux内核提供了 pagetypeinfo,slabinfo,buddyinfo 等方面提供分析
查看buddyinfo分析系统内存碎片
'BEGIN{printf("\nFragmentation Report\nLow is Order 1-4, High is order 5-9, Normal is order 10-11\n%s\t%s\n\n",host,date)} {\
L= ps * ( ($5 * 1) + ($6 * 2) + ($7 * 4) + ($8 * 8) ); \
H= ps * ( ($9 * 16) + ($10 * 32) + ($11 * 64) + ($12 * 128) + ($13 * 256) ); \
N= ps * ( ($14 * 512) + ($15 * 1024) ); \
T=L+H+N; \
printf("%s\tTotal: %8dM\tLow: %02.2f%%\tHigh: %02.2f%%\tNormal: %02.2f%%\n",\
$1" "$2" "$3" "$4,T/1024/1024,(L/T)*100,(H/T)*100,(N/T)*100);}'

- NORMAL: 正常使用的物理内存区域,大部分申请的内存都使用的是该区域
- LOW:低水位,代表内存已经开始吃紧,需要启动回收页内核线性kswapped去回收内存
- HIGH:高水位,代表内存还是足够的。
per-node stats
nr_inactive_anon 448
nr_active_anon 171214
nr_inactive_file 121291
nr_active_file 95855
nr_unevictable 0
nr_slab_reclaimable 13073
。。。
pages free 2166
min 94
low 117
high 140
spanned 4095
present 3998
managed 3840
protection: (0, 1781, 1781, 1781, 1781)
nr_free_pages 2166
。。。
- page_low: 当空闲页面的数量达到page_low所标定的数量的时候,kswapd线程将被唤醒,并开始释放回收页面。这个值默认是page_min的2倍。
- page_min: 当空闲页面的数量达到page_min所标定的数量的时候, 分配页面的动作和kswapd线程同步运行
- page_high: 当空闲页面的数量达到page_high所标定的数量的时候, kswapd线程将重新休眠,通常这个数值是page_min的3倍。
解决方案
内核更改
[root@schouse kevindba]# sysctl -a | grep "vm\."
。。。
vm.drop_caches = 0
vm.extfrag_threshold = 500
vm.min_free_kbytes = 45056
vm.watermark_scale_factor = 10
。。。
- 这个值接近1000, 说明系统在内存碎片的处理倾向于把旧的页换出, 以符合申请的需要;
- 而接近0, 表示系统在内存碎片的处理倾向于做memory compaction.
更改extfrag_threshold内核参数避免内存碎片。
定期整理
升级
总结
对于内存碎片问题,结合实际情况选择合理的方案即可。
THE END