服务器有8GB RAM.随着时间的推移,可用内存量不断减少,尽管在服务器上没有启动任何新内容,也没有新用户.在某些时候它开始交换,服务器上的负载上升,它变得没有响应.通常我所做的只是重启服务器……
可以做些什么来检测究竟是什么泄漏内存?我使用top来监控资源的使用情况,但据我所知它没有显示任何帮助:
有没有办法找出使用那么多内存的东西?或什么开始大量交换到磁盘?有没有重新启动服务器释放内存的方法?
解决方法
sar
应该对内存使用和相关I / O提供一些良好的诊断.运行munin来监视系统应该为您提供一个图表,其中详细说明了正在使用的内存.这可能会有很大帮助.
您可以使用limits.conf来限制程序的最大核心大小.正确设置,这应该杀死任何泄漏内存的程序.这适用于pam_limits模块.也可以使用ulimits命令设置限制.
您正在运行一些可能使用大量内存的程序.你可以看到的一些事情包括.
>在apache2下运行的编程不良的应用程序可能会泄漏内存.发生这种情况时,您应该看到内存大小增加.通过将MaxRequestsPerChild设置为100左右,您可以调整apache2以在一定次数的使用后回收子项.如果这样可以解决问题,那么您需要解决泄漏问题.我会先看这个.
> MysqL可能会尝试将数据加载到内存中.如果你在内存中有大量数据,这可能会导致一些颠簸,但不应该像你看到的那样引人注目.
>如果安装了大型tmpfs文件系统,则在使用时不删除文件时可能会泄漏内存.大的长寿命文件也可能是个问题.
>如果问题是在一天大致同一时间发生的,那么您可能有一个泄漏内存的预定程序.
>如果你有一个程序分配共享内存,但在退出之前没有释放它,你将有一个相对不可见的内存泄漏.如果共享内存锁定在内存中,则可能会强制进行交换.可用共享内存的数量通常相对有限.
> Liquidsoap icecast bundle可能会遇到使用内存的缓冲问题.我没有使用过这个组合,所以我不确定这会怎么样.
正常的内存使用:可用内存不是你想要的很多东西.如果你的系统已经运行了很长时间并且有很多空闲内存,那就错了.每次读取或写入文件时,块都将进入缓冲区缓存.这会减少你的空闲记忆,这是一件好事.系统将保留足够的可用空间来启动一些程序,而无需寻找其他内存.由于许多程序运行速度很快,因此当它们停止运行时,它们的内存将返回到空闲池.
当您读取缓冲区高速缓存中的文件时,不需要磁盘访问,并且从缓冲区高速缓存中解析读取.写入使用类似的机制.如果您的系统需要内存,则缓冲区缓存是首先使用的地方之一.大多数缓冲区可以立即释放.
如果你有内存泄漏,你会发现可用内存和缓冲区都开始缩小.这仍然不是一个严重的问题,因为泄漏的内存最终应该移动到交换空间.在填充交换空间之前,系统仍然可以正常运行,并将剩余的可用空间绘制到无法启动的程序点.通常可以使用少量交换空间.