有时候我需要处理大量的数据,希望将其保存在内存中进行处理。有时候我会错误地估计程序所需的内存量,或者调试器会将内存使用量乘以一个超过可用内存的因子。
每当我启动一个占用大量内存的进程时,这是我对一个正常操作系统的期望:尝试占用所有空闲内存,然后礼貌地要求其他非必要的进程释放一些它们不需要的内存,然后写入交换空间。
而Ubuntu为我做的是:占用所有空闲内存,然后要求操作系统将所有必要的服务(gnome会话、终端、键盘)置换到交换空间,然后冻结并等待我拔掉电源。
两个问题:
1. 操作系统怎么能假设任何东西都可能如此重要,以至于可以停止响应用户输入呢? 2. 我该如何告诉Ubuntu永远不要置换必要的服务,并始终对用户输入作出反应,即使某个愚蠢的进程试图占用比系统提供的更多资源?
每当我启动一个占用大量内存的进程时,这是我对一个正常操作系统的期望:尝试占用所有空闲内存,然后礼貌地要求其他非必要的进程释放一些它们不需要的内存,然后写入交换空间。
而Ubuntu为我做的是:占用所有空闲内存,然后要求操作系统将所有必要的服务(gnome会话、终端、键盘)置换到交换空间,然后冻结并等待我拔掉电源。
两个问题:
1. 操作系统怎么能假设任何东西都可能如此重要,以至于可以停止响应用户输入呢? 2. 我该如何告诉Ubuntu永远不要置换必要的服务,并始终对用户输入作出反应,即使某个愚蠢的进程试图占用比系统提供的更多资源?
swappiness
设置更改为10,即在/etc/sysctl.conf中添加vm.swappiness = 10
。在此处搜索swappiness以获取更多信息。2)如果swappiness没有帮助...尽管您可能不想这样做...将交换文件的大小增加到1.5x16G,然后查看是否有所改善。请随时告诉我最新情况。祝好,Al - heynnema/etc/sysctl.conf
文件中没有vm.swappiness
变量。当在Ubuntu 16.04下启动内核4.7.2时,/etc/sysctl.conf
文件甚至不存在,我记得在某个地方读到systemd文档建议使用/etc/sysctl.d/
目录下的配置文件来替代sysctl.conf。供参考。 - WinEunuuchs2Unixsysctl vm.swappiness
命令可以查看预修改值,通常为70,修改后应该为10。鉴于楼主不太愿意增加物理内存,更改交换空间是一个简单的步骤,以确定系统是否可以正常运行而不会冻结。根据经验法则,交换空间的大小一般为RAM_SIZE x 1-1.5,因此我建议使用16G x 1.5的交换空间。如果系统上有第二个硬盘,则甚至可以在那里添加交换空间。 - heynnemasysctl vm.swappiness
时,回应是60。但是当我cat /etc/sysctl.conf
时,每一行都被注释掉了,用#
表示,并且根本没有出现vm.swappiness参数。同时,在16.04版本下升级到了Kernel 4.7.2。稍后我会重新启动,使用原始的Kernel 4.4,并更新如果有不同的情况。 - WinEunuuchs2Unixvm.swappiness=10
需要添加到sysctl.conf文件中。有经验的人甚至可以使用sysctl命令即时设置vm.swappiness=10,而无需编辑sysctl.conf文件。祝好,Al ps:等待OP回复。 - heynnema