我试图确定为什么某个进程不断意外停止,一种可能性是服务器内存不足,但我不确定我是否正确理解内存和 Linux。
从命令中获取以下输出free
(从我正在尝试修复的问题所在的同一台机器上获取):
total used free shared buffers cached
Mem: 991 827 163 0 107 361
-/+ buffers/cache: 358 633
Swap: 0 0 0
最上面一行表明这台机器确实使用了大量内存(只有 163 Mb 可用),因此,如果启动更多进程(确实会启动),那么我们可能会出现内存不足的情况,并且各种进程都会被终止。
然而,我一直认为,由于 Linux 充分利用了内存中的缓冲区和缓存,可以在需要时使用,所以我应该更加关注的数字是第二行,它表明~633 Mb 是可用的,在这种情况下,我认为这台机器不太可能出现内存不足的情况。
那么你能澄清我对 Linux 和内存的理解并帮助我理解 Linux 何时真正耗尽内存吗?
PS - 这台机器是一台单一用途的机器 - 它为大型 Web 应用程序运行后台进程,这就是它所做的一切。没有 Web 服务器,没有数据库,只有一个作为后台进程运行的大型 Ruby on Rails 应用程序。偶尔会为特定应用程序任务启动 cron 作业,这些任务会在内存中临时创建 Rails 应用程序的另一个实例。
答案1
内核使用未被利用的 RAM 来缓存从存储中读取的数据 - 这被称为缓冲区缓存。由于缓冲区缓存只是硬盘上内容的副本,因此如果内核需要内存来处理更重要的事情,它可以“忘记”内存中该数据的副本并将其用于其他用途。如果它需要该数据,它只需从驱动器重新读取它即可。
请记住,有缓冲区缓存,然后有常规内核缓冲区(用于 tcp 套接字、路由表等)
因此,第一行的 free 命令显示:
- 总计:您有多少内存,就这样。
- 已使用:其中实际上有多少有价值的东西。
- 空闲:绝对没用过——可能不是空的,但不管怎样都是垃圾。
- 共享:进程之间共享的东西 - 主要是共享库。
- 缓冲区:常规内核缓冲区。
- Cached:表面上看,就是缓冲区缓存。
现在,第二行显示“实际使用”的内容。也就是说,内存中的内容不能被遗忘,否则会产生后果。第二行上的“空闲”字段是未使用内存和缓冲区缓存的总和。
最后一行将包含交换空间 - 内核可以将重要信息写入内存的存储空间,以便内核可以将该内存位置用于其他用途。但是,从您的屏幕截图来看,您没有任何配置。
目前,您似乎使用了 1GB 内存中的约 360MB。如果您担心或怀疑内存不足,请检查内核日志消息。当内核达到绝对内存不足且必须采取措施的情况时,它会记录日志。它将调用内存不足终止程序,希望通过终止一个进程来挽救这种情况。
我最初以为这是 VPS。如果这是物理服务器,并且您没有可以添加的额外 RAM,那么请考虑添加交换空间!
否则,请检查 /var/log 中的日志消息,或者在命令行上使用 dmesg 检查最新的内核消息。