1、问题表现
Mysql 5.7 数据库实例CPU 100%的问题。
2、问题分析
通过perf可以查看当前Mysql进程的函数CPU占用,主要是在JSON数据的写入上。
3、问题原因
1、JSON数据的高并发写入;
2、5.7版本的bug,没有考虑到memcpy的len为0的情况,高并发时导致CPU 100%;
源码相关:
5.7:
bool String::mem_realloc(size_t alloc_length, bool force_on_heap)
.....
memcpy(new_ptr, m_ptr, m_length);
8.0:
bool String::mem_realloc(size_t alloc_length, bool force_on_heap) {
......
if (m_length > 0) memcpy(new_ptr, m_ptr, m_length);
4、相关参考
Mysql 5.7 的JSON实现:kancloud.cn/taobaomysql/monthly/117958
5.7之前使用blob实现json对象的存储,5.7在server层提供了一堆便于操作 JSON 的函数,存储就是简单地将 JSON 编码成 BLOB,然后交由存储引擎层进行处理。
5、解决办法
数据库实例从Mysql 5.7升级到8.0版本,本文内8.0版本具体为8.0.18。