linux 限制进程,Linux卸载软件

Linux中使用cgroups限制cpu资源实例

这回说说怎样通过 cgroups来管理 cpu资源。先说控制进程的 cpu使用。在一个机器上运行多个可能消耗大量资源的程序时,我们不希望出现某个程序占据了所有的资源,导致其他程序无法正常运行,或者造成系统假死无法维护。这时候用 cgroups就可以很好地控制进程的资源占用。这里单说 cpu资源。

cgroups里,可以用 cpu.cfs_period_us和 cpu.cfs_quota_us来限制该组中的所有进程在单位时间里可以使用的 cpu时间。这里的 cfs是完全公平调度器的缩写。cpu.cfs_period_us就是时间周期,默认为 100000,即百毫秒。cpu.cfs_quota_us就是在这期间内可使用的 cpu时间,默认-1,即无限制。

跑一个耗 cpu的程序

复制代码代码如下:

# echo'while True: pass'|python&

[1] 1532

top一下可以看到,这进程占了 100%的 cpu

复制代码代码如下:

PID USER PR NI VIRT RES SHR S%CPU%MEM TIME+ COMMAND

1532 root 20 0 112m 3684 1708 R 99.6 0.7 0:30.42 python

...

然后就来对这个进程做一下限制。先把/foo这个控制组的限制修改一下,然后把进程加入进去。

复制代码代码如下:

echo 50000>/sys/fs/cgroup/cpu/foo/cpu.cfs_quota_us

echo 1532>/sys/fs/group/cpu/foo/tasks

可见,修改设置只需要写入相应文件,将进程加入 cgroup也只需将 pid写入到其中的 tasks文件即可。这里将 cpu.cfs_quota_us设为 50000,相对于 cpu.cfs_period_us的 100000即 50%。再 top一下看看效果。

复制代码代码如下:

PID USER PR NI VIRT RES SHR S%CPU%MEM TIME+ COMMAND

1532 root 20 0 112m 3684 1708 R 50.2 0.7 5:00.31 python

...

可以看到,进程的 cpu占用已经被成功地限制到了 50%。这里,测试的虚拟机只有一个核心。在多核情况下,看到的值会不一样。另外,cfs_quota_us也是可以大于 cfs_period_us的,这主要是对于多核情况。有 n个核时,一个控制组中的进程自然最多就能用到 n倍的 cpu时间。

这两个值在 cgroups层次中是有限制的,下层的资源不能超过上层。具体的说,就是下层的 cpu.cfs_period_us值不能小于上层的值,cpu.cfs_quota_us值不能大于上层的值。

另外的一组 cpu.rt_period_us、cpu.rt_runtime_us对应的是实时进程的限制,平时可能不会有机会用到。

在 cpu子系统中,cpu.stat就是用前面那种方法做的资源限制的统计了。nr_periods、nr_throttled就是总共经过的周期,和其中受限制的周期。throttled_time就是总共被控制组掐掉的 cpu使用时间。

还有个 cpu.shares,它也是用来限制 cpu使用的。但是与 cpu.cfs_quota_us、cpu.cfs_period_us有挺大区别。cpu.shares不是限制进程能使用的绝对的 cpu时间,而是控制各个组之间的配额。比如

复制代码代码如下:

/cpu/cpu.shares: 1024

/cpu/foo/cpu.shares: 2048

那么当两个组中的进程都满负荷运行时,/foo中的进程所能占用的 cpu就是/中的进程的两倍。如果再建一个/foo/bar的 cpu.shares也是 1024,且也有满负荷运行的进程,那/、/foo、/foo/bar的 cpu占用比就是 1:2:1。前面说的是各自都跑满的情况。如果其他控制组中的进程闲着,那某一个组的进程完全可以用满全部 cpu。可见通常情况下,这种方式在保证公平的情况下能更充分利用资源。

此外,还可以限定进程可以使用哪些 cpu核心。cpuset子系统就是处理进程可以使用的 cpu核心和内存节点,以及其他一些相关配置。这部分的很多配置都和 NUMA有关。其中 cpuset.cpus、cpuset.mems就是用来限制进程可以使用的 cpu核心和内存节点的。这两个参数中 cpu核心、内存节点都用 id表示,之间用“,”分隔。比如 0,1,2。也可以用“-”表示范围,如 0-3。两者可以结合起来用。如“0-2,6,7”。在添加进程前,cpuset.cpus、cpuset.mems必须同时设置,而且必须是兼容的,否则会出错。例如

复制代码代码如下:

# echo 0>/sys/fs/cgroup/cpuset/foo/cpuset.cpus

# echo 0>/sys/fs/cgroup/cpuset/foo/cpuset.mems

这样,/foo中的进程只能使用 cpu0和内存节点0。用

复制代码代码如下:

# cat/proc/

/status|grep'_allowed_list'

可以验证效果。

cgroups除了用来限制资源使用外,还有资源统计的功能。做云计算的计费就可以用到它。有一个 cpuacct子系统专门用来做 cpu资源统计。cpuacct.stat统计了该控制组中进程用户态和内核态的 cpu使用量,单位是 USER_HZ,也就是 jiffies、cpu滴答数。每秒的滴答数可以用 getconf CLK_TCK来获取,通常是 100。将看到的值除以这个值就可以换算成秒。

cpuacct.usage和 cpuacct.usage_percpu是该控制组中进程消耗的 cpu时间,单位是纳秒。后者是分 cpu统计的。

P.S. 2014-4-22

发现在 SLES 11 sp2、sp3,对应内核版本 3.0.13、 3.0.76中,对 cpu子系统,将 pid写入 cgroup.procs不会实际生效,要写入 tasks才行。在其他环境中,更高版本或更低版本内核上均未发现。

Linux 下如何结束指定进程

一般linux使用kill来结束进程

Linux中的kill命令用来终止指定的进程(terminate a process)的运行,是Linux下进程管理的常用命令。通常,终止一个前台进程可以使用Ctrl+C键,但是,对于一个后台进程就须用kill命令来终止,我们就需要先使用ps/pidof/pstree/top等工具获取进程PID,然后使用kill命令来杀掉该进程。kill命令是通过向进程发送指定的信号来结束相应进程的。在默认情况下,采用编号为15的TERM信号。TERM信号将终止所有不能捕获该信号的进程。对于那些可以捕获该信号的进程就要用编号为9的kill信号,强行“杀掉”该进程。

1.命令格式:

kill[参数][进程号]

2.命令功能:

发送指定的信号到相应进程。不指定型号将发送SIGTERM(15)终止指定进程。如果任无法终止该程序可用“-KILL”参数,其发送的信号为SIGKILL(9),将强制结束进程,使用ps命令或者jobs命令可以查看进程号。root用户将影响用户的进程,非root用户只能影响自己的进程。

3.命令参数:

-l信号,若果不加信号的编号参数,则使用“-l”参数会列出全部的信号名称

-a当处理当前进程时,不限制命令名和进程号的对应关系

-p指定kill命令只打印相关进程的进程号,而不发送任何信号

-s指定发送信号

-u指定用户

注意:

1、kill命令可以带信号号码选项,也可以不带。如果没有信号号码,kill命令就会发出终止信号(15),这个信号可以被进程捕获,使得进程在退出之前可以清理并释放资源。也可以用kill向进程发送特定的信号。例如:

kill-2 123

它的效果等同于在前台运行PID为123的进程时按下Ctrl+C键。但是,普通用户只能使用不带signal参数的kill命令或最多使用-9信号。

2、kill可以带有进程ID号作为参数。当用kill向这些进程发送信号时,必须是这些进程的主人。如果试图撤销一个没有权限撤销的进程或撤销一个不存在的进程,就会得到一个错误信息。

3、可以向多个进程发信号或终止它们。

4、当kill成功地发送了信号后,shell会在屏幕上显示出进程的终止信息。有时这个信息不会马上显示,只有当按下Enter键使shell的命令提示符再次出现时,才会显示出来。

5、应注意,信号使进程强行终止,这常会带来一些副作用,如数据丢失或者终端无法恢复到正常状态。发送信号时必须小心,只有在万不得已时,才用kill信号(9),因为进程不能首先捕获它。要撤销所有的后台作业,可以输入kill 0。因为有些在后台运行的命令会启动多个进程,跟踪并找到所有要杀掉的进程的PID是件很麻烦的事。这时,使用kill 0来终止所有由当前shell启动的进程,是个有效的方法。

Linux中使用cpulimit限制进程的cpu使用率

很用 Linux时可能大家经常发现莫名其妙就变的非常慢,这时多半是后台进程使用的cpu和内存太多了。如何限制每个进程的cpu使用资源呢?

可以使用cpulimit限制每个进程的cpu使用率,使用率用百分百来表示。

安装cpulimit

使用源码安装

#cd/tmp

#wget';

#tarcpulimit-1.1.tar.gz

#cdcpulimit-1.1

#make

#cpcpulimit/usr/local/sbin/

#rm-rfcpulimit*

Debian/ Ubuntu用户

使用apt-get更方便的安装

$sudoapt

-

getupdate

$sudoapt

-

getinstallcpulimit

如何使用cpulimit?

限制firefox使用30% cpu利用率

#cpulimit-efirefox-l30

限制进程号1313的程序使用30% cpu利用率

#cpulimit-p1313-l30

根据进程名找出pid的方法

#psaux|less

#psaux|grepfirefox

#pgrep-uvivekphp-cgi

#pgreplighttpd

可以使用绝对路径限制进程的cpu利用率

#cpulimit-P/opt/firefox/firebox-l30

单核cpu和多核cpu

单核cpu的使用率范围为0%-100%,四核cpu的使用率范围为0%-400%.

相关工具

nice:以指定的优先级运行程序

renice:调整以运行进程的优先级

阅读剩余
THE END