linux – 有东西占用所有内存(我怀疑某些应用程序内存泄漏).怎么检测什么?

我有运行liquidsoap icecast bundle和简单网站(httpd mysqld)的服务器.没什么特别的.每天约2000人次,平均约50人同时在线.

服务器有8GB RAM.随着时间的推移,可用内存量不断减少,尽管在服务器上没有启动任何新内容,也没有新用户.在某些时候它开始交换,服务器上的负载上升,它变得没有响应.通常我所做的只是重启服务器……

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

有没有办法找出使用那么多内存的东西?或什么开始大量交换到磁盘?有没有重新启动服务器释放内存的方法?

解决方法

在批处理模式下运行top以定期报告内存大小可以用来查看当事情向南时谁在使用内存.在批处理模式下运行 sar应该对内存使用和相关I / O提供一些良好的诊断.运行munin来监视系统应该为您提供一个图表,其中详细说明了正在使用的内存.这可能会有很大帮助.

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

您正在运行一些可能使用大量内存的程序.你可以看到的一些事情包括.

>在apache2下运行的编程不良的应用程序可能会泄漏内存.发生这种情况时,您应该看到内存大小增加.通过将MaxRequestsPerChild设置为100左右,您可以调整apache2以在一定次数的使用后回收子项.如果这样可以解决问题,那么您需要解决泄漏问题.我会先看这个.
> MySQL可能会尝试将数据加载到内存中.如果你在内存中有大量数据,这可能会导致一些颠簸,但不应该像你看到的那样引人注目.
>如果安装了大型tmpfs文件系统,则在使用时不删除文件时可能会泄漏内存.大的长寿命文件也可能是个问题.
>如果问题是在一天大致同一时间发生的,那么您可能有一个泄漏内存的预定程序.
>如果你有一个程序分配共享内存,但在退出之前没有释放它,你将有一个相对不可见的内存泄漏.如果共享内存锁定在内存中,则可能会强制进行交换.可用共享内存的数量通常相对有限.
> Liquidsoap icecast bundle可能会遇到使用内存的缓冲问题.我没有使用过这个组合,所以我不确定这会怎么样.

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

当您读取缓冲区高速缓存中的文件时,不需要磁盘访问,并且从缓冲区高速缓存中解析读取.写入使用类似的机制.如果您的系统需要内存,则缓冲区缓存是首先使用的地方之一.大多数缓冲区可以立即释放.

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

相关文章

linux常用进程通信方式包括管道(pipe)、有名管道(FIFO)、...
Linux性能观测工具按类别可分为系统级别和进程级别,系统级别...
本文详细介绍了curl命令基础和高级用法,包括跳过https的证书...
本文包含作者工作中常用到的一些命令,用于诊断网络、磁盘占满...
linux的平均负载表示运行态和就绪态及不可中断状态(正在io)的...
CPU上下文频繁切换会导致系统性能下降,切换分为进程切换、线...