我们正在运行具有以下版本规范的服务器。
Linux 版本 3.10.0-693.5.2.el7.x86_64 ([电子邮件保护])(gcc 版本 4.8.5 20150623(Red Hat 4.8.5-16)
服务器运行以下主要应用程序。
- Apache (PHP) - 服务器版本:Apache/2.4.6 (CentOS) | PHP 版本 => 5.4.16
- MySQL-5.5.68-MariaDB
- 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 错误。
- 为什么 buff/cache 内存不能按需释放?
- 如果这是内存泄漏,那么显然内存泄漏发生在哪个级别(操作系统还是应用程序)?
- 我可以遵循哪些方法来进一步调试此问题?
答案1
部分答案:
我们观察到服务器缓存/缓冲区正在逐渐增加但并未释放。
这是正常的,Linux 会将所有可用内存用作缓冲区/缓存,并且只在需要时释放。它永远不会“自动”释放,在正常运行期间您永远不会看到内存大幅减少。
然后我们的基于 PHP 的应用程序开始运行缓慢
我已经在我的机器上观察到类似的问题很长时间了:有时系统 I/O 变慢,删除缓冲区会使它再次变快。我怀疑缓冲区管理中存在内核错误,但到目前为止我还没有看到修复(如果有人解决了这个问题,修复不会改变 Linux 的行为以使用它的所有内存)。
但当然你的问题可能与我的问题无关。