Process Explorer的潜在内存泄漏
贝壳最近碰到一个郁闷到死的问题。机器经常出现硬盘狂转,系统响应延迟。系统弹出一个错误,然后死机。贝壳开始猜测是硬盘驱动问题,升级驱动N次,无效。然后再猜测是ext2fs的问题(贝壳用这个驱动挂载linux下面的盘的),看来看去,不是。最后,贝壳确定了,这是内存泄漏了~~~
问题是,这时候可没人跳出来推荐喝什么口服液的。贝壳系统中永远挂着一个procexp,看内存状态的。这东西是sysinternals的产品,后来被微软收购了。功能强大,很多系统调试,杀马都需要用到。于是贝壳就用这个工具看哪个程序的内存泄漏,可是看来看去看不到。准确说,是没等贝壳看到,系统就先死透了。最后贝壳多次尝试,发现了一个死机的规律。当mysql开启的时候,procexp就会随时发生异常死机。这是一个重要的提示,要么mysql内存泄漏了,要么procexp内存泄漏了。究竟是哪个呢?贝壳用了同属于sysinternals开发的pstools系列工具,仔细检查了异常发生时候的内存状态,确定,Process
Explorer存在内存泄漏的风险!
看来sysinternals被微软收购后,旗下的工具也出现了微软的一贯特色。以下是一次内存泄漏后,终止mysql服务后抓下来的内存状态输出。如果不终止mysql,不等我抓系统就挂了。
Process memory detail for HOME-B2326348D0:
Name Pid VM WS Priv Priv Pk Faults NonP
Page
Idle 0 0 28 0 0 0
0 0
System 4 800 52 0 0 10120
0 0
smss 772 3748 48 172 1648 223
0 5
csrss 828 68132 1464 2304 3768 13748 6
144
winlogon 856 61528 580 8536 8684 5143
39 96
services 900 37724 804 2256 2404 2740
7 65
lsass 912 44848 352 2684 2860 7332
7 80
svchost 1060 36904 200 1500 1544 1028
3 68
svchost 1136 39256 456 1984 2004 1437
13 72
svchost 1216 118756 2564 19236 28112 24221 93
197
svchost 1292 31728 192 1472 1512 1123
4 55
aswUpdSv 1536 18748 52 652 652 557
2 31
ashServ 1592 120428 6704 16628 41168 1076043 8
128
explorer 1884 119644 1908 19128 20552 4364782 16
177
spoolsv 288 50072 224 3564 3828 1502
5 85
TSVNCache 544 48008 700 6968 7068 21580
4 67
mobmeter 620 41116 588 4940 5044 14266
3 63
procexp 628 605756 15532 549068 549068 4776417 8
109
ashDisp 636 54468 928 6992 7016 28399
5 80
ctfmon 664 39064 380 4816 4840 15588
4 66
googletalk 720 76420 2852 8540 9036 428030 13
108
mdm 832 30008 440 1088 1100 860
3 49
svchost 1244 40704 208 2640 2708 1896
3 73
svnserve 1264 16612 124 904 920 652
3 29
svchost 232 37936 536 1592 1636 1330
4 70
alg 600 35664 200 1312 1352 1018
5 69
TTPlayer 3208 65672 3688 10920 13924 169533
8 86
thunderbird 3240 109016 2272 28832 31344 64167 14
112
conime 3284 42564 404 5184 5184 17612
3 68
firefox 1944 270920 11108 118720 132648 1233696 14
135
flashget 2836 108756 11248 19472 29636 117115 30
146
pyintau 2080 45004 172 4720 4788 1848
3 62
wuauclt 1068 67012 396 6580 6600 2167 7
115
cmd 3540 32764 920 3308 3372 15075
2 60
pslist 3048 32124 3108 2440 2956 10890
2 49
我们可以看到,procexp这个进程的虚拟内存空间只有60M,工作集更只有15M,可私有内存高达549M!贝壳的机器只有768M内存,不死机还等啥?
贝壳试验了mysql5.0.45,mysql5.0.51a,mysql5.1.22,procexp11.01,procexp11.04。确定在贝壳的本本上全都会造成上述问题。但是同样的环境在家里的2G内存机器上模拟的时候,全都不出现上述问题。从测试角度讲,这个属于和环境相关的隐性危险,严重级别是重。