文件传输时由磁盘I/O引起的OOM Killer
大家好,我是无能。
在新家以低价搭建家庭服务器已经过去几天了。之前一直困扰我的问题,即使在内存充裕的情况下也发生了。
发生了什么
我目前的环境有点特殊,内存容量是16GB + 8GB,感觉有点不伦不类,但这是用剩余的部件搭建的,请大家谅解。
也就是说,虽然现在24GB的RAM可能很常见,但对我个人而言已经相当富裕了,所以我以为不会发生OOM,结果却收到了来自Linux内核的“责骂”般的OOM。
应用程序只有Apache、php-fpm、Redis等,它们各自占用的内存量微不足道,但是...。
为文件传输而烦恼
当我尝试从仍在老家放置的家庭服务器通过scp传输文件,或者为了保存一些镜像而使用aria2c批量保存到2TB硬盘时,就发生了。
那么,为什么仅仅是这个写入操作就会导致OOM呢?这是因为文件在写入到存储区域之前,会先被内存接收,为了提高速度,需要先作为缓存被内存接收。
大约在使用scp -r传输数百GB的文件,并且这些文件包含随机I/O操作时,似乎真的会消耗大量资源。
而且,这不属于进程级别的内存使用,所以在top中查看也无法在单个进程中确认,这纯粹是Linux内核层面的问题,因此很难定位。
简单来说,似乎是因为I/O等待导致临时存储在内存中的数据量无法跟上写入速度,从而陷入困境。
可修改的内核参数
作为内核可以做的事情,似乎可以设置缓存量等,我尝试调整了一下,但感觉效果不明显。
2.2. VFS 调优选项:研究与实验 Red Hat 产品文档
修改Linux页面缓存设置以优化写入I/O的备忘录 - YOMON8.NET
现象上与这个人描述的类似。
OOM Killer invoked due to slow disk I/O - #17 by Whis-key - troubleshooting - Storj Community Forum (official)
好久没看到Storj这个词了...不过我的免费额度好像被擅自删除了...
没想到,仅仅是向HDD写入数据就能导致内存耗尽,真是令人头疼...。
这也正是常说的关于内存方面“Linux对RAM是乐观的,Windows是悲观的”这一说法。尽管可以理解其充分利用内存以提高性能的意图,但我还是希望能设法解决这种因I/O等待而产生的问题。