如何防止进程淹没服务器

如何防止进程淹没服务器

我有一个网络服务器,用于收集图像并将其转换为 gif。我使用 image-magick 的转换程序,大约每 1000 张图像转换一次。该过程运行时会完全淹没我的服务器。

我仍然只想将 1000 多张图片转换为 gif。如何才能避免convert对服务器造成过多的系统负载?

答案1

如果一个简单的答案就足以增加转换图像所需的时间,那么convert使用以下简单的答案来启动nice例如:

nice -n 19 convert ...(其中 ... 是当前转换命令的其余部分)将降低转换程序的优先级从 20(默认值)到 39

为进程设置特定优先级值的具体效果取决于 Unix/Linux 实现中调度程序的设计细节。特定操作系统的调度程序还会内置各种启发式算法(例如,优先选择 I/O 密集型进程,而不是 CPU 密集型进程)。

举一个简单的例子,当两个完全相同的 CPU 密集型进程在单 CPU Linux 系统上同时运行时,每个进程所占的 CPU 时间将与 20 − p 成比例,其中 p 是进程的优先级。因此,以 nice +15 运行的进程将获得分配给普通优先级进程的 25% 的 CPU 时间:(20 − 15)/(20 − 0) = 0.25。[2] 另一方面,在 BSD 4.x 调度程序上,同一示例中的比例约为十比一。

资料来源:

man nice

https://en.wikipedia.org/wiki/Nice_(Unix)

答案2

Imagemagick 内置了资源使用控制方法。您可以在 policy.xml 文件中限制 imagemagick 可用的资源。在 Ubuntu 上,默认情况下,它可能位于/etc/ImageMagick-6/policy.xml

有多个选项可供使用,例如,您可以将线程限制设置为小于 CPU 核心数的数字,启用 CPU 节流和/或根据服务器上的可用资源限制内存使用量。

您可以使用命令查看当前设置identify -list resource

答案3

如果它占用 I/O 和 CPU,则使用 ionice 和 nice 运行它。请注意,只有在使用 CFQ 块 I/O 调度程序时,ionice 才有效。可以使用以下命令在块设备(例如 /dev/sda)上设置此 I/O 调度程序:

echo "cfq" | sudo tee /sys/block/sda/queue/scheduler

然后使用以下命令运行您的流程:

ionice -c 2 -n 7 nice -n 19 <your command>

..这将以最低的 CPU 优待级别 7 运行尽力 I/O 优待的进程。

相关内容