我正在pdftoppm将用户提供的 PDF 转换为 300DPI 图像。这很好用,除非用户提供页面非常大的 PDF。 pdftoppm将分配足够的内存来在内存中保存该大小的 300DPI 图像,对于 100 英寸的方形页面,它是 100*300 * 100*300 * 4 字节/像素 = 3.5GB。恶意用户可以给我一个愚蠢的大 PDF 并导致各种问题。
所以我想做的是对我即将运行的子进程的内存使用设置某种硬限制——如果它试图分配超过 500MB 的内存,就让进程死掉。那可能吗?
我不认为 ulimit 可以用于此,但是否有一个等价的进程?
我需要测试一个内存管理过程。
limitmemory 400k -p <pid>有没有办法在unix中做到这一点?任何常见的 Unix 实用程序都很棒。
我知道 Linux 命名空间,除此之外,还可以用来安全地处理限制和监禁子进程,而不会让它们被僵尸化和转储到init. 但我对实现细节很模糊。我如何使用util-linux诸如mountand提供的工具nsenter来监视、监视和确保启动的所有进程都是另一个进程的直接命名空间后代?
我花了2个小时阅读关于这件事的问题,但仍然存在一些误解。
我有这个过程:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1452 0.4 1.8 1397012 19308 ? Sl 04:23 3:48 ./transaction_server
Run Code Online (Sandbox Code Playgroud)
这表明它使用19.3Mb系统驻留内存(我没有交换文件),1.8%整个1GB系统内存。虚拟大小是1.39GB?!?。我读过那ulimit -m不起作用。人们使用ulimit -v例如为进程设置虚拟内存。这个虚拟内存是与 VSZ 一起列出的ps吗?如果我想限制这个进程100MB最多使用系统内存,我应该设置什么值。我已阅读文档setrlimit,这似乎是合法的:
RLIMIT_AS
This is the maximum size of a process' total available memory,
in bytes. If this limit is exceeded, the malloc() and mmap()
functions shall fail with errno set to [ENOMEM]. In addition, …Run Code Online (Sandbox Code Playgroud)