服务器缓存/缓冲内存不断增长且得不到释放

服务器缓存/缓冲内存不断增长且得不到释放

我们正在运行具有以下版本规范的服务器。

Linux 版本 3.10.0-693.5.2.el7.x86_64 ([电子邮件保护])(gcc 版本 4.8.5 20150623(Red Hat 4.8.5-16)

服务器运行以下主要应用程序。

  1. Apache (PHP) - 服务器版本:Apache/2.4.6 (CentOS) | PHP 版本 => 5.4.16
  2. MySQL-5.5.68-MariaDB
  3. SOLR-solr-6.3.0

Apache 包含我们自己的基于 PHP 的应用程序,这是一种基于类似搜索过滤记录的搜索引擎。数据库包含数百万条数据。像往常一样,MySQL 存储数据,SOLR 保留索引以提高搜索性能。此外,我们还有一个批量上传文件的功能,文件大小可达数百兆字节。

该应用程序自 2018 年起就已部署在服务器上,自 2022 年 1 月起一切正常。

从 2022 年 1 月开始,我们突然发现服务器缓存/缓冲区正在逐渐增加但无法释放。请参阅内存信息。

$ free -h
                  total        used        free      shared  buff/cache   available
    Mem:           9.6G        2.5G        446M        569M        6.7G        6.1G
    Swap:          4.9G        342M        4.6G

$ free -w -h
                  total        used        free      shared     buffers       cache   available
    Mem:           9.6G        2.5G        419M        569M          0B        6.7G        6.2G
    Swap:          4.9G        342M        4.6G

当我们使用命令手动清除缓冲区/缓存时/proc/sys/vm/drop_caches,缓冲区/缓存内存会被清除。但它会逐渐开始增长,并在大约 24 小时或更短的时间内达到上述状态。它不会释放。然后我们的基于 PHP 的应用程序开始运行缓慢,我们不断收到 HTTP 504 错误。

  1. 为什么 buff/cache 内存不能按需释放?
  2. 如果这是内存泄漏,那么显然内存泄漏发生在哪个级别(操作系统还是应用程序)?
  3. 我可以遵循哪些方法来进一步调试此问题?

答案1

部分答案:

我们观察到服务器缓存/缓冲区正在逐渐增加但并未释放。

这是正常的,Linux 会将所有可用内存用作缓冲区/缓存,并且只在需要时释放。它永远不会“自动”释放,在正常运行期间您永远不会看到内存大幅减少。

然后我们的基于 PHP 的应用程序开始运行缓慢

我已经在我的机器上观察到类似的问题很长时间了:有时系统 I/O 变慢,删除缓冲区会使它再次变快。我怀疑缓冲区管理中存在内核错误,但到目前为止我还没有看到修复(如果有人解决了这个问题,修复不会改变 Linux 的行为以使用它的所有内存)。

但当然你的问题可能与我的问题无关。

相关内容