如何为给定进程永久设置cpu限制。cpulimit和尼斯不起作用


12

有很多类似的问题,但是没有一个问题能帮助我。

我在服务器(台式机版本)上有ubuntu 11.10。我有一个正在运行的网站。有一个过程非常重要,但不必高优先级运行。我想永久限制进程而不是用户的CPU使用率。此过程由exec函数运行(它是php函数,而不是系统进程)。

因此,我看到2个选项:1.每次执行函数时添加某种限制。2.永久限制此过程的CPU使用率。

我尝试使用“ nice”和cpulimit,但似乎没有任何效果。不错,没有任何作用,cpulimit(带有-e)表示:“未找到目标进程”。

我是一个初学者,所以请假设我几乎一无所知。


您能告诉我们您尝试了什么。cgroups可以为您做到这一点。
Panther

至于配置,您可以运行cgsnapshot -s来检索信息,而无需手动编写配置文件,不建议您使用后者。
Mingliang Liu 2014年

您是否要限制流程,即确保它超过设定的时间?
肯·夏普

我用这个方法,它为我工作.. ubuntuforums.org/showthread.php?t=992706
穆斯塔法·萨尔曼

Answers:


19

在没有要求的详细信息的情况下...

这是我在ubuntu上使用cgroups的方法。

在整个本文中,您需要将变量“ $ USER”更改为运行流程的用户

我添加了内存信息,这将是一个常见问题解答,如果您不需要它,请不要使用它。

1)安装 cgroup-bin

sudo apt-get install cgroup-bin

2)重新启动。cgroups现在位于/sys/fs/cgroup

3)为您的用户(进程的所有者)创建一个cgroup

# Change $USER to the system user running your process.
sudo cgcreate -a $USER -g memory,cpu:$USER

4)您的用户可以让他们管理资源。默认情况下,用户获得1024个cpu单位(份额),因此限制为大约10%cpu,内存以字节为单位...

# About 10 % cpu
echo 100 > /cgroup/cpu/$USER/cpu.shares

# 10 Mb
echo 10000000 > /cgroup/memory/$USER/memory.limit_in_bytes

5)开始您的进程(将exec更改为cgexec)

# -g specifies the control group to run the process in
# Limit cpu
cgexec -g cpu:$USER command <options> &

# Limit cpu and memory
cgexec -g memory,cpu:$USER command <options> &

组态

假设cgroup正在为您工作;)

编辑/etc/cgconfig.conf,添加自定义cgroup

# Graphical
gksudo gedit /etc/cgconfig.conf

# Command line
sudo -e /etc/cgconfig.conf

添加您的cgroup。再次将$ USER更改为拥有该进程的用户名。

group $USER {
# Specify which users can admin (set limits) the group
perm {    
    admin {
        uid = $USER;
    }
# Specify which users can add tasks to this group
    task {
        uid = $USER;
    }
}
# Set the cpu and memory limits for this group
cpu {
    cpu.shares = 100;
    }
memory {
    memory.limit_in_bytes = 10000000;
    }
}

您也可以指定组gid=$GROUP,/etc/cgconfig.conf的注释很好。

现在再次使用 cgexec -g cpu:$USER command <options>

您可以在以下位置看到您的过程(通过PID) /sys/fs/cgroup/cpu/$USER/tasks

bodhi @ ufbt:〜$ cgexec -g cpu:bodhi sleep 100&

[1] 1499

bodhi @ ufbt:〜$ cat / sys / fs / cgroup / cpu / bodhi / tasks

1499

有关更多信息,请参见:http : //docs.redhat.com/docs/zh-CN/Red_Hat_Enterprise_Linux/6/html/Resource_Management_Guide/


2
我设法完成了第1部分。它正在工作,但是您应该添加仅在某些其他进程需要CPU /内存时才限制进程的信息。这并不明显-我花了很长时间才弄清楚(因为我是乞讨人)。我是否正确理解“配置”将在重启后保存设置?
拉法尔2012年

1
很高兴你把事情解决了。有一些学习曲线=)是的,配置是在引导过程中保持设置不变。

当我从命令行使用cgroup时,它工作正常。但是,当我从php中的exec函数执行同一命令时:(<?php exec(“ cgexec -g cpu:GroupHere NameOfProcess InputFile OutputFile”);它不起作用。唯一的区别是从命令行中我使用的文件位于文件夹,我在和从PHP我用长路对这些文件的任何想法,可能是一个问题,我使用同一个用户在这两种情况下,?
拉法尔

1
@Rafal:我的一句话不是正确的,即使没有其他进程占用大量内存,内存也应受到限制。
Flimm 2013年

1
@Flimm当我测试此解决方案时,只有2个进程正在运行-Apache和应该受到限制的进程。当没有apache连接建立或只有一个与apache的连接时,该有限的进程占用了100%的cpu。只有与apache的几个连接建立起来之后,它才受到限制(我通过从Web浏览器重新刷新网站来完成此操作)。因此,可能是没有其他进程在运行的情况。
拉法尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.