东西吃所有的内存(我怀疑有些应用程序的内存泄漏)。 如何检测什么?

我有运行liquidsoap + icecast捆绑和简单的网站(httpd + mysqld)的服务器。 没什么特别的。 每天约2000+的访问者,大约50人在线同时在线。

服务器有8GB RAM。 随着时间的推移,空闲内存的数量不断减less,虽然在服务器上没有新的东西开始,也没有新的用户。 在某个时候,它开始交换,服务器负载上升,它变得没有响应。 通常我所做的只是重新启动服务器…

可以做什么来检测到什么内存泄漏? 我使用top来监视资源的使用情况,但据我所知,它没有任何帮助:

在这里输入图像描述

有什么方法可以找出使用那么多内存的东西吗? 或者开始大量交换到磁盘? 任何方式来释放内存,而无需重新启动服务器?

在批处理模式下运行以定期报告内存大小可用于查看当南下时谁正在使用内存。 在批处理模式下运行sar应该对内存使用和相关的I / O提供一些很好的诊断。 运行munin来监视系统应该给你一个关于正在使用的内存的详细信息。 这可能会有很大帮助。

您可以使用limits.conf来限制程序的最大核心大小。 正确设置,这应该杀死任何正在泄漏内存的程序。 这适用于pam_limits模块。 限制也可以使用ulimits命令设置。

您正在运行一些可能会使用大量内存的程序。 有些东西你可以看看包括。

  • 运行在apache2下的编程不当的应用程序可能会泄漏内存。 发生这种情况时应该会看到内存大小的增加。 您可以通过将MaxRequestsPerChild设置为100左右来调整apache2,以在一定的使用次数后回收子项。 如果这解决了问题,那么你需要解决泄漏。 我会先看。
  • MySQL可能会尝试将数据加载到内存中。 如果你的内存中有大量的数据,这可能会导致一些颠簸,但不应该像你所看到的那么戏剧化。
  • 如果安装了一个大的tmpfs文件系统,那么如果文件在使用时未被删除,则可能会泄漏内存。 大的长寿文件也可能是一个问题。
  • 如果问题发生在大致同一天的同一时间,则可能有一个正在泄漏内存的预定程序。
  • 如果您有一个分配共享内存的程序,但在退出之前不会释放它,则会产生相对不可见的内存泄漏。 如果共享内存被locking在内存中,则可能会强制交换。 可用共享内存的数量通常相对有限。
  • liquidsoap + icecast bundle可能会遇到使用内存的缓冲问题。 我没有使用这个组合,所以我不知道这将如何显示。

正常的内存使用情况:可用内存不是你想要的东西。 如果你的系统已经很长时间了,并且有很多空闲的内存,那么有些东西是错误的。 每次读取或写入文件时,块都将进入缓冲区caching。 这会减less你的可用内存,是一件好事。 系统将保留足够的可用空间来启动一些程序而不需要在别处寻找内存。 由于许多程序运行速度很快,当它们停止运行时,它们的内存将返回到空闲池。

读取缓冲区caching中的文件时,不需要磁盘访问,并且从缓冲区caching中parsing读取。 写入使用类似的机制。 如果您的系统需要内存,缓冲区caching是使用的第一个地方之一。 大多数缓冲区可以立即释放。

如果你有内存泄漏,你会看到空闲的内存和缓冲区都开始收缩。 这仍然不是一个严重的问题,因为泄漏的内存应该最终移动到交换空间。 在填充交换空间之前,您的系统仍然可以正常运行,并且将剩余的空闲空间拖拽到点,程序无法启动。 通常可以使用less量的交换空间。

您可以使用此命令查看有关RAM使用情况的前10个应用程序:

 ps -A --sort -rss -o comm,pmem | head -n 11 

有时这个命令可以帮助你,如果有许多subprocess已经生成:

 ps auxf 

这样你可以看到哪些进程属于一起。

在应用程序方面没有什么是真的使用这种内存。

您需要扣除表示页面caching的“caching”值,以更好地了解您的实际内存使用情况。

基本上这是很好的内存pipe理,这是理想的你想要的。

点击这里查看链接了解更多信息: http : //www.linuxatemyram.com/