您遇到Linux Ate My Ram问题。
不要惊慌。
这不是问题。
您的系统正在按设计工作。
问题不在于您的操作系统,而是您对什么是“可用”内存的理解。
Unix系统使用内存的不仅仅是运行程序。内存可能用于:
- 运行程序(活动/已使用)
- 缓冲传输中的数据(缓冲区)
- 缓存最近从磁盘读取/写入磁盘的数据(缓存)
- 绝对没有(免费)
接下来是对现代Unix系统如何报告RAM使用情况的简要介绍(并且在很大程度上是不完整的)。
什么是可用内存(操作系统定义)?
当Unix系统将RAM报告为Free时,表示“我没有在任何东西上使用此RAM”。
免费 RAM是有效地毫无价值-这是不是让你的系统变得更快,它只是坐在那里的情况是“免费”的东西需要它。那可能是我上面提到的其他三个项目中的任何一个。
什么是缓存和缓冲存储器?
缓存和缓冲存储器是操作系统用来使您的系统更快的RAM。现在不需要运行该程序所需的
内存,因此您的操作系统正在使用它来保存其经常需要的数据-例如,C库(几乎所有运行的程序都需要此库)几乎总是保存在内存中,因此系统不必转到磁盘上即可找到在屏幕上打印“ Hello World”所需的说明。实际上,这要复杂得多-有共享内存,有线内存等-但就我们的目的而言,这种简单的解释就足够了。cache
什么是活动内存?
活动内存是我们理解为“已使用”内存的一部分-应用程序正在使用的RAM用于应用程序的工作-排序电子表格,提供网页,编辑图形等。
“活动”内存最近一直处于“活动”状态- -声称它已利用其内容(读取或写入)的程序,并且它不被认为是换出的理想选择。
什么是非活动内存?
像活动内存一样,非活动内存是应用程序正在使用的RAM。所不同的是,该存储器已经有一段时间没有被访问了,因此如果推一下推操作系统会认为它可以换出到磁盘上,并且(幸运的是)该程序声称不会再请求它,因此永远不会注意到。
什么是“已用”内存(人类定义)
您和我认为的“已用”内存实质上是活动内存和非活动内存的总和。应用程序当前要求其使用的所有RAM。
只要您安装的RAM超过活动内存和非活动内存的总和(再加上512-1024MB的安全裕度),您就可以放心:您的操作系统可能不会达到交换和破坏性能的目的。 。
什么是“空闲”内存(人类定义)?
您和我认为的“空闲”内存是可用于运行程序的内存。
这比操作系统报告的“免费”数字稍微复杂一些。当程序请求RAM时,操作系统将尝试以最小的破坏性方式获取该RAM:
- 如果有可用内存(无所事事),则会分配RAM。
- 如果没有可用的可用内存,则OS会蚕食Cache和Buffer空间:将丢弃缓冲池中最近/最少访问的内容,并将该RAM分配给程序。
- 如果没有缓冲区/高速缓存RAM用来蚕食交换器,它将查看不活动的内存并选择它认为最不可能访问的区域。该数据将被调出以交换(磁盘),并将新释放的RAM分配给程序。
- 如果所有非活动RAM已被换出,交换器将开始将活动RAM放入磁盘。
(这是性能通常会受到影响的地方:每次程序打开CPU时,其换出的位都必须带回RAM中,这意味着其他程序的活动内存必须换出 -掉期的高周转率被称为th动)
- 如果系统已经交换了所有可能的东西(并填满了交换分区),或者如果您运行的系统没有交换分区,则发生坏事。此时,将发生以下两种情况之一:
malloc()
将失败。这是符合POSIX的行为-操作系统将告知程序要求RAM的程序不能满足该请求。
该程序可以请求较少的RAM,或者如果无法占用较小的内存块就可以清理并退出。(如果程序编写不当,将导致崩溃。)
- 如果您使用的是Linux,则OOM-Killer可能会通过杀死狂潮来进行帮派风格的驱逐,终止其他进程以尝试释放足够的RAM以满足请求。
如果您无法通过此处的描述和对链接问题的回答无法分辨,我认为这是解决问题的一种糟糕方法。
删除文件时,为什么可用RAM会增加?
在这里问题的示例中,您注意到可以通过删除备份文件来“释放” RAM的原因-解释很简单:由于没有文件在使用该文件(没有打开的文件句柄),并且不再可从该文件访问操作系统知道文件系统(未链接)后,再也没有人会再次访问该数据,因此它会从文件系统缓存中清除数据。
这使操作系统报告更多的可用内存,但对系统性能没有影响。