多年来,我的操作系统的OOM 杀手无法正常工作并导致系统冻结。
当内存使用率非常高时,整个系统往往会“冻结”(实际上:变得非常慢)几个小时甚至几天,而不是杀死进程来释放内存。
我记录的最长期限是在辞职以进行重置之前的 7 天。
当即将达到 OOM 时,iowait非常非常高(~ 70%),然后变得不可测量。
该工具:iotop表明每个程序都以非常高的吞吐量(每几十 MB/秒)从我的硬盘驱动器中读取。
那些程序在读什么?
- 目录层次结构?
- 可执行代码本身?
我现在不知道。
[已编辑] 在我写这条消息时(2017 年),我使用的是最新的 ArchLinux (4.9.27-1-lts),但几年前就已经遇到了这个问题。
我在各种 Linux 发行版和不同的硬件配置中遇到过同样的问题。
目前(2019 年),我使用的是最新的 Debian 9.6 (4.9.0) 我有16 GB的物理内存,一个安装了我的操作系统的 SSD,而不是任何交换分区。
由于我拥有的 ram 数量,我不想启用交换分区,因为它只会延迟问题的出现。
此外,由于 SSD 交换过于频繁,可能会缩短磁盘的使用寿命。
顺便说一下,我已经尝试过使用和不使用交换分区,事实证明它只会延迟问题的出现,而不是解决方案。
对我来说,问题是由于 Linux 从缓存中删除了重要数据,这导致系统冻结,因为它每次都必须从硬盘驱动器读取所有内容。
我什至想知道 Linux 是否不会删除正在运行的程序的可执行代码页,这可以解释为什么通常不读取大量数据的程序在这种情况下会这样做。
我已经尝试了几件事,希望能解决这个问题。
一种是设置/proc/sys/vm/min_free_kbytes为1000000(1 GB)。
因为这1 GB应该是空闲的,所以我认为这块内存会被 Linux 保留来缓存重要数据。
但它没有奏效。
另外,我认为补充一点很有用,即使它在理论上听起来不错,但通过定义 …
我有一台带有交换分区的标准 Linux(Debian 测试)笔记本电脑。
我用它做了很多实验。其中一些真的很占用内存,Linux 默认的行为方式对我来说是一个问题......让我们举一个愚蠢的例子:
python,然后a = [0]*100000000现在很可能您没有足够的 RAM 来处理那个大列表。Linux 将填充 RAM,然后进行交换,几分钟后,OOM 杀手将被触发并终止(几乎)随机服务,并且希望,如果您在合适的时间按下 Ctrl+C python,并且如果终端仍然有焦点,计算机将再次响应。
我想强制执行一些内存限制以避免不必要的交换并拒绝进程分配比我拥有的内存(在 RAM 中)更多的内存的权利。如果内存需求低于某个限制或被 root 询问,那么就杀死除 root 之外的任何用户的最耗内存的进程。
ulimit -Sv [mem] 我在后面听到了!
呵呵!“使用cgroups通过cgexec!” 第一排有人说!
是的,您是对的:这些确实是非常好的解决方案。但:
我想要的是内核说:“你属于用户foo(不是 root),你使用了很多内存,我们会用完内存。对不起,伙计......死吧!”
或者:“你到底在做什么?你需要x MB 而只有y MB 可用。是的,SWAP 是空的,但你不打算使用 SWAP 来做你的脏活,是吗?不,我说不!没有你的记忆!如果你坚持,你会死的!