我在使用 Kernel 2.6 的 Squeeze 上遇到一些奇怪的内存管理行为。我正在尝试用 nmon 来弄清楚这个问题的真相。
有时这会使系统冻结 30 秒到 5 分钟。
服务器有 4GB RAM。
nmon 的数据是:
- +1.6GB 内存空闲。
- 缓存下降约 350MB
- swapcached 减少了约 80MB
- 交换空间增加了~200M
- 活动内存减少约 1.3GB
发生这种情况时,服务器不会接近任何限制。发生这种情况后不久,活动内存就会慢慢回升,同时缓存...以及自然的 memfree 也会下降。
这似乎不是一个失控的过程。操作系统似乎突然重新分配了一堆内存,然后慢慢地重新分配回来。交换性不应该成为一个因素,因为交换几乎从未被触及。
有什么办法可以跟踪正在发生的事情吗?为什么这个空闲内存会在几秒内突然出现,却在30分钟内又归还给缓存?
答案1
系统日志说什么?是否有任何迹象表明内核因 OOM 而终止进程?
互换有多大?您是否调整了vm.
命名空间中的任何内核?
“一堆”多少钱?
这30分钟里会发生什么?它vmstat -SM 3
看起来像什么?
也许最重要的是:您正在运行哪些应用程序,它们(如何)受到此影响?
答案2
结果发现这是 DoS。大约 60 个 php5-cgi 进程在 30 秒内出现并死亡,吸回 1.6GB RAM,然后被杀死。
它没有出现在我的日志中,因为它不是一个占用 1.6GB 的进程,而是 60 个进程。 oom 杀手并没有杀死它,Apache 中的某些东西正在杀死它。
当我调整进程日志记录以获取进程的广度并编写一些 awk 脚本来添加它们的内存时,我终于找到了它。现在看来很明显了。