- 论坛徽章:
- 0
|
该问题解决,但还没有定性,引出几个新问题
该问题解决,引出一个新问题,有兴趣的兄弟可以琢磨一下
这个问题确实是由google的tcmalloc引起的,我把这个插件去掉,重启了mysql。观察了约30小时,确认问题已解决
目前的内存使用情况
Mem: 8174224k total, 6755448k used, 1418776k free, 340204k buffers
Swap: 4192956k total, 7008k used, 4185948k free, 1285500k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
15213 mysql 15 0 5873m 4.8g 5652 S 212 61.3 1668:10 mysqld
回楼上的兄弟,你说的那个测试脚本中的那个公式,之前我已测试过,配置文件中配置的内存肯定是不超标的。
内存检测的工具,确实不敢在生产系统上测试。
这个问题可以描述为这样,这是我目前的推测
tcmalloc在为线程分配内存的时候,会比glibc之类的malloc分配的稍微多些,它倾向于稳定,避免大起大落。因为这台服务器非常繁忙(平均每秒约1w次),而我之前配置的thread_cache_size 偏小,查看status之后发现,threads_created 值非常高,也就是说,mysql线程的重用程度非常低。而每创建一个线程,tcmalloc都会多分配一些内存。线程销毁的时候,可能这稍稍多出来的一部分内存没有收回,也就是泄露了。时间长了,在我这台服务器上,大约4天,就能把8G物理内存加4G swap耗光,造成kernel没有新内存可以用,进而kernel溢出,杀掉占用内存最多的mysqld
现在引伸出来三个新问题,有兴趣的朋友可以琢磨一下
1. 如果thread_cache_size 配置非常大,mysql线程重用程度非常高,应该是可以把内存溢出的过程拖的非常长,比如之前是4天,可能现在400天也不会溢出
2.之前看过有人编译nginx的时候也用tcmalloc ,nginx的线程创建和销毁更为频繁,我怀疑会不会它造成溢出的可能性更高? 不过话说回来,一般情况下,一个nginx进程占用的内存很小的,只有4~20M,一般服务器也就开几个这样的进程。所以,貌似它能出问题的机会很小
3.我这次在mysql中用tcmalloc,是用preload的方式。不知道用源码,编译的时候把tcmalloc编译进去,是否还会出现这个问题
上面三个问题还没机会测试,希望有兴趣的朋友一起讨论下 |
评分
-
查看全部评分
|