据我所了解,当系统接近没有可用内存时,内核应该开始终止进程以释放一些内存。但在我的系统中,这根本不会发生。
假设有一个简单的脚本,它只是分配比系统中可用内存更多的内存(例如,一个包含数百万个字符串的数组)。如果我运行这样的脚本(作为普通用户),它会一直占用所有内存,直到系统完全冻结(只有SysRQ REISUB可以工作)。
奇怪的是,当计算机冻结时,硬盘指示灯会亮起并保持这种状态,直到计算机重新启动,无论我是否挂载了交换分区!
因此,我的问题是:
1. 这种行为正常吗?一个作为普通用户执行的应用程序能够以这种方式使系统崩溃,这很奇怪... 2. 是否有任何办法让Ubuntu在这些应用程序占用过多(或最多)内存时自动终止它们?
假设有一个简单的脚本,它只是分配比系统中可用内存更多的内存(例如,一个包含数百万个字符串的数组)。如果我运行这样的脚本(作为普通用户),它会一直占用所有内存,直到系统完全冻结(只有SysRQ REISUB可以工作)。
奇怪的是,当计算机冻结时,硬盘指示灯会亮起并保持这种状态,直到计算机重新启动,无论我是否挂载了交换分区!
因此,我的问题是:
1. 这种行为正常吗?一个作为普通用户执行的应用程序能够以这种方式使系统崩溃,这很奇怪... 2. 是否有任何办法让Ubuntu在这些应用程序占用过多(或最多)内存时自动终止它们?
附加信息
- Ubuntu 12.04.3
- Kernel 3.5.0-44
RAM: 约3.7GB,总共4GB(与显卡共享)。 *
$ tail -n+1 /proc/sys/vm/overcommit_* ==> /proc/sys/vm/overcommit_memory <== 0 ==> /proc/sys/vm/overcommit_ratio <== 50 $ cat /proc/swaps Filename Type Size Used Priority /dev/dm-1 partition 4194300 344696 -1
tail -n+1 /proc/sys/vm/overcommit_*
并将输出添加进来。此外,也可以参考这里的链接:如何配置 oom-killer。 - kiriecho 1 | sudo tee /proc/sys/vm/oom_kill_allocating_task
命令。此操作将在重启后恢复原状。 - admirabilis