![尽管页面缓存从未被逐出,但 OOM 杀手仍会终止进程](https://linux22.com/image/718018/%E5%B0%BD%E7%AE%A1%E9%A1%B5%E9%9D%A2%E7%BC%93%E5%AD%98%E4%BB%8E%E6%9C%AA%E8%A2%AB%E9%80%90%E5%87%BA%EF%BC%8C%E4%BD%86%20OOM%20%E6%9D%80%E6%89%8B%E4%BB%8D%E4%BC%9A%E7%BB%88%E6%AD%A2%E8%BF%9B%E7%A8%8B.png)
我们的生产服务器在负载下有时会遇到以下问题(Linux 4.10):
- 处理负载的应用程序(网络服务器)正在高负载运行。
- 启动了一项新任务(例如 cron)。这需要 clone() 系统调用,但无法分配内存。
- 内核 OOM 终止程序启动,并终止其中一个 Web 服务器应用程序进程,以便新的任务可以启动。
- “free -m”显示可用内存极低,服务器 64GB 内存中大约只有 1-3GB。但是,大部分内存都在页面缓存中。
- 系统没有任何交换分区/文件设置,并且 vm.swappiness 设置为其默认值 60。
相反,如果我们在加载开始之前运行“echo 3 > /proc/sys/vm/drop_caches”,OOM 就不会终止我们的网络服务器应用程序,一切都会正常运行。
在上述情况下,内核在尝试终止进程以释放一些内存之前是否不释放页面缓存?