限制单个Linux进程的内存使用量

我正在运行pdftoppm将用户提供的PDF转换为300DPI图像.这非常有用,除非用户提供的页面大小非常大. pdftoppm将分配足够的内存来在内存中保存该大小的300DPI图像,对于100英寸的方形页面,每像素100 * 300 * 100 * 300 * 4字节= 3.5GB.恶意用户可能只是给我一个愚蠢的大PDF并导致各种问题.

所以我想要做的是对我即将运行的子进程的内存使用量设置一些硬性限制 – 如果它试图分配超过500MB的内存,那么就会让进程死掉.那可能吗?

我不认为ulimit可以用于此,但是有一个单进程等效吗?

解决方法:

ulimit存在一些问题.以下是关于该主题的有用读物:Limiting time and memory consumption of a program in Linux,它导致timeout工具,它允许您按时间或内存消耗来保存进程(及其分支).

超时工具需要安装Perl 5和/ proc文件系统.之后,您将工具复制到例如/usr/local/bin如下:

curl https://raw.githubusercontent.com/pshved/timeout/master/timeout | \
  sudo tee /usr/local/bin/timeout && sudo chmod 755 /usr/local/bin/timeout

在那之后,你可以通过内存消耗“笼罩”你的过程,就像你的问题一样:

timeout -m 500 pdftoppm Sample.pdf

或者你可以使用-t< seconds>和-x<赫兹>分别按时间或CPU约束限制进程.

此工具的工作方式是,如果生成的进程没有超额设置其设置边界,则每秒检查多次.这意味着实际上有一个小窗口,其中一个进程可能在超时通知之前超额订阅并杀死进程.

因此,更正确的方法可能涉及cgroups,但即使您使用Docker或runC,它们也需要更多参与设置,这些事件可以提供围绕cgroup的更加用户友好的抽象.

上一篇:debian – 为daemonized nginx主进程配置`max open files`的ulimit


下一篇:Linux:如何更改进程可以打开的最大文件数?