我有一台 Ubuntu 9.10 64 位服务器,它似乎用完了所有可用内存。根据我的 munin 图表,几乎所有用完的内存都在交换缓存、缓存和 slab 缓存中。(我认为这是指虚拟内存缓存,我的假设对吗?)
一旦内存使用率接近 100%,部分(但不是全部)系统服务(如 SSH)就会变得迟缓且无响应。重新启动系统后,性能和内存使用率会暂时恢复正常。
一些有趣的趣闻:
- 系统运行 Apache 2、MySQL、Munin 和 sshd。
- 内存使用量峰值每天晚上同一时间发生(晚上 10 点整)。
- 任何用户的 crontab 中似乎都没有任何内容,并且 /etc/cron.d/* 中也没有任何异常,更不用说晚上 10 点会发生的事件了。
我的问题是,我如何找出导致内存耗尽的原因?我尝试了常用的实用程序(例如 ps、top 等),但似乎找不到任何异常。
有什么想法吗?提前致谢!
答案1
你确定它与内存有关吗?缓存不应该占用所有内存;它们是临时的和动态的,并在需要活动内存时重新分配。缓存只是为了加快速度并利用否则会浪费的内存。
我可能会看看是否有其他东西拖慢了系统。使用 Top 时,您是否看到系统负载过高?与“正常”时间相比,这些时间的情况如何?您是否将 top 分为 CPU 使用率和活动内存使用率?
您是否尝试运行 iotop 来查看磁盘 i/o,并查看是否有东西正在损坏驱动器?
所有的 crontab 是什么样子的?
你有没有在白天的时候多次用ps拍快照,然后在晚上10点左右进行对比,看看出现了哪些进程?
从长远来看,netstat 的网络连接情况如何?当时系统进出有什么异常吗?
听起来它可能正在重建或索引系统数据库(如“定位”),但这样做不应该导致系统停止运行。
答案2
内存使用和迟缓是同一问题的症状。此时发生的一些事情导致系统的磁盘缓存崩溃。系统利用每一滴内存来避免过多的磁盘 I/O,但仍然失败。
这种情况最常见的情况是,大量磁盘读取发生在最近未读取的磁盘区域。可能再次使用的最近使用的数据被推出缓存,当需要重新读入时,它必须与现有的读取流竞争。
检查是否有执行大量磁盘 I/O 的进程。例如,updatedb
或某种备份脚本。如果它被证明是一个自制工具,那么将其更改为绕过磁盘缓存可能会有所帮助,这样它就不会强制其他内容离开缓存。这可能会有所帮助,ionice
这样它就不会对时间敏感的读取造成太大的影响。