我们正在运行一个 amazon ec2 小型实例,在过去的几天里,我们注意到内存正在不断下降。
在小型实例上,我们运行 apache 和 tomcat6 Tomcat 使用以下 JVM 参数启动 -Xms32m -Xmx128m -XX:PermSize=128m -XX:MaxPermSize=256m
我们使用 nagios 来监控更新、可用磁盘空间和内存等内容。其他一切都按预期运行,但我们的内存一直在下降。我们的应用程序每天的点击量约为 50 万次
当我关闭 apache 和 tomcat 并运行 free -m 时,1.7gb 内存中只有 594mb 可用。小型实例上没有运行太多其他程序,运行 top 命令时我看不到内存去了哪里。
我们在 tomcat 上运行的应用程序是 grails webapp。我们的应用程序中可能存在内存泄漏吗?
我在网上看到有人说小型 amazon 实例非常适合运行 apach 和 tomcat。我在网上找到了几篇帖子,展示了如何设置 apache 和 tomcat 来限制内存使用量,我已经执行了这些步骤。内存没有很快用完,但随着时间的推移,内存仍在减少。
我们还有其他运行 Grails 应用程序的 Amazon EC2 小型实例,这些节点上的内存相当标准。但它们不会接收那么多流量
补充一下,当我在问题服务器上运行 top 命令时,我看不到所有内存的使用情况
非常感谢您的帮助
在我的服务器上运行 free -m 的输出如下
total used free shared buffers cached
Mem: 1657 1380 277 0 158 773
-/+ buffers/cache: 447 1209
Swap: 895 0 895
您认为这看起来还好吗?操作系统会在哪个阶段归还内存,它会等到内存达到 0% 还是依赖于操作系统?
答案1
请注意,操作系统可能会进行缓存,如果是的话,这不是问题(查看最后一列),用于缓存的内存实际上并不是正在使用的内存,因为进程中它已经填满了数据。实际上是操作系统缓存了经常使用的数据。如果操作系统发现内存不足,它会自动释放用于缓存的内存,如果它发现有空闲内存,它会将其用于缓存(因此您的机器的响应通常更快)。