![如何防止进程淹没服务器](https://linux22.com/image/1059873/%E5%A6%82%E4%BD%95%E9%98%B2%E6%AD%A2%E8%BF%9B%E7%A8%8B%E6%B7%B9%E6%B2%A1%E6%9C%8D%E5%8A%A1%E5%99%A8.png)
我有一个网络服务器,用于收集图像并将其转换为 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
答案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 优待的进程。