我正在pdftoppm
将用户提供的 PDF 转换为 300DPI 图像。这很好用,除非用户提供页面非常大的 PDF。 pdftoppm
将分配足够的内存来在内存中保存该大小的 300DPI 图像,对于 100 英寸的方形页面,它是 100*300 * 100*300 * 4 字节/像素 = 3.5GB。恶意用户可以给我一个愚蠢的大 PDF 并导致各种问题。
所以我想做的是对我即将运行的子进程的内存使用设置某种硬限制——如果它试图分配超过 500MB 的内存,就让进程死掉。那可能吗?
我不认为 ulimit 可以用于此,但是否有一个等价的进程?
我正在使用 Debian sid,硬盘格式化为 ext4,在 linux 3.1 上运行
我记得在以前的 linux 版本上(可能在 3.0 之前),如果内存不足,并且没有启用交换,程序通常会崩溃。这非常适合我的环境:简单的网络浏览,没有关键操作。也就是说,如果我不小心遇到一个占用过多内存的坏网站,它只会崩溃而不会使我的终端无法使用。
但是在我当前的设置中,计算机在后台以剧烈的 I/O 吞吐量挂起。iotop 显示 kswapd0 是罪魁祸首,这意味着它是由于交换造成的。在使用swapon -s
确定已启用的任何交换之后,我曾经swapoff -a
禁用所有交换并swapon -s
再次确认所有交换都已禁用。
然后我再次尝试最大化我的内存使用。唉,我期望的行为没有发生。相反,kswapd0 一遍又一遍地尝试换出 RAM,但由于没有交换空间而失败。因为它永不放弃,我的计算机被锁定在永恒的 I/O 严重冻结中,这对我的磁盘健康不利。
我在尝试做错了swapoff -a
什么吗?为什么行为与过去不同(可能是 3.0 之前的时代)?