有没有办法限制进程组中花费的绝对 CPU 时间(以 CPU 秒为单位)?
ulimit -t 10; ./my-process
看起来是一个不错的选择,但如果my-process
fork 后,进程组中的每个进程都有自己的限制。整个进程组可以通过每 9 秒 fork 一次来使用任意数量的时间。
接受的答案类似的问题 https://superuser.com/questions/262013/linux-make-ulimit-limits-be-cumulative-across-spawned-subprocesses是使用 cgroups 但没有解释如何使用。然而,还有其他答案(使用 cgroup 限制 CPU 总使用量 https://stackoverflow.com/questions/43587767/limit-total-cpu-usage-with-cgroups/43660834)表示这在 cgroup 中是不可能的,只能限制相对 CPU 使用率(例如,每 1 秒使用 0.2 秒)。
Liran Funaro 建议使用较长的时间cpu.cfs_period_us
(https://stackoverflow.com/a/43660834/892961 https://stackoverflow.com/a/43660834/892961) 但配额参数最多可以为 1 秒。因此,即使很长一段时间,我也不知道如何将 CPU 时间限制设置为 10 秒或一小时。
If ulimit
而 cgroups 无法做到这一点,还有其他方法吗?
你可以用 cgroup 来做到这一点。以 root 身份执行:
# Create cgroup
cgcreate -g cpu:/limited
# set shares (cpu limit)
cgset -r cpu.shares=256 limited
# run your program
cgexec -g cpu:limited /my/hungry/program
或者,您可以使用cpulimit
可以定期冻结您的代码的程序。 cgroups 是最先进的方法。
设置固定CPU共享:
cgcreate -g cpu:/fixedlimit
# allow fix 25% cpu usage (1 cpu)
cgset -r cpu.cfs_quota_us=25000,cpu.cfs_period_us=100000 fixedlimit
cgexec -g cpu:fixedlimit /my/hungry/program
事实证明,目标是在测量时将运行时间限制在特定秒内。设置所需的 cgroup 限制(为了获得公平的沙箱)后,您可以通过运行以下命令来实现此目标:
((time -p timeout 20 cgexec -g cpu:fixedlimit /program/to/test ) 2>&1) | grep user
20秒后程序无论如何都会停止,我们可以解析用户时间(或系统时间或实时时间)来评估它的性能。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)