cgroup使用过程中的注意事项

通常大家都应该通过使用libcgroup 这样的高级管理接口去玩转cgroup的。而它提供了cgconfig.conf 和cgrules.conf 两个可供配置的文件。

cgconfig.conf:可配置相关的group信息

cgrules.conf: 可配置相应的规则,如某些用户下的某些进程可以放到那个group中被限制

example,cgconfig.conf 的配置如下:

group a.com.cn {
	cpu {
		cpu.shares = "100";
	}
	cpuacct {
	}
	memory {
		memory.limit_in_bytes = 100M;
		memory.soft_limit_in_bytes = 80M;
		memory.swappiness = 0;
	}
}
group b.com.cn {
	cpu {
		cpu.shares = "100";
	}
	cpuacct {
	}
	memory {
		memory.limit_in_bytes = 100M;
		memory.soft_limit_in_bytes = 80M;
		memory.swappiness = 0;
	}
}
group c.com.cn {
	cpu {
		cpu.shares = "100";
	}
	cpuacct {
	}
	memory {
		memory.limit_in_bytes = 100M;
		memory.soft_limit_in_bytes = 80M;
		memory.swappiness = 0;
	}
}

cgrules.conf 配置如下:

#<user>  	<controllers>  		<destination>
@auser           cpu,cpuacct,memory	a.com.cn
@buser	         cpu,cpuacct,memory	b.com.cn
@cuser           cpu,cpuacct,memory	c.com.cn
# End of file

以上的配置,可以得出结论。以组auser运行的所有进程相应的cpu和内存被隔离到了a.com.cn 这个group组中。

以上都么有任何问题,加入auser、buser、cuser都是php-fpm对应的一个pool的group,而他们运行的用户都为www。若当时建立group的时候同时将www用户放到了这个组里,即:

usermod -G auser www
usermod -G buser www
usermod -G cuser www

此时,如论怎么运行。都无法发现相应的group中的tasks存在相应组的进程PID。

详细的品味官方文档中关于组的概念:

@ — when prefixed to user, indicates a group instead of an individual user. For example, @admins are all users in the admins group.

也就是说,会将这个组下面所有用户运行的进程全部放到对应的group中。而我们建立的group和user的关系这样就感觉很错论了。我的解决方法是:将www这个用户从各个组中拿出来。即组中没有任何成员。这是将重启类似php-fpm的进程。你会发现cgroup对应的tasks文件中已经有了PID。

另记录Ubuntu12.04 LTS 和 Ubuntu14.04 LTS 中有关cgroup的注意事项:

Ubuntu12.04中启动cgroup的脚本中有一个开启默认group的配置 CREATE_DEFAULT="yes"。 这个选项开启总会启动一个默认的group 叫做sysdefault 。而且会将基本上所有的pid 都扔到这里面去。很讨厌,若不知道这个,肯定以为自己错了。看一下它具体做了什么:

# cat /etc/init/cgconfig.conf
        if [ "$CREATE_DEFAULT" = "yes" ]; then
                /usr/sbin/create_default_cgroups
        fi

若CREATE_DEFAULT 为YES ,则它会去执行 /usr/sbin/create_default_cgroups。这也是一个shell。

它的行为是去创建一个sysdefault的group。然后将进程放入到这个group中,这个功能会提前与cgrules

因此我们一定要阻止它干坏事。create_default_cgroups 干坏事的代码

# Classify everything to default cgroup. Ignore errors, some processes
# may exit after ps is run and before cgclassify moves them.
#
cgclassify -g $controllers:$defaultcgroup `ps --no-headers -eL o tid` 	 2>/dev/null || :

在使用Ubuntu 14.04 LTS 时,会发现完全不是那么回事。没有了cgconfig.conf 和cgrules.conf 这两个配置。而且也没有了相应的启动命令。查看Ubuntu的官方文档说,有一个cgmanager这么个东西。就那么一个cgm,感觉特难用。对应运维来说,管理起来不方便了.又要在Ubuntu 14.04 LTS中重新的过一下.

首先安装管理工具吧:

apt-get cgroup-bin cgroup-lite libcgroup1

安装后发现其实在cgrup-lite中有一个相应的启动脚本:

# dpkg -L cgroup-lite
/.
/usr
/usr/share
/usr/share/doc
/usr/share/doc/cgroup-lite
/usr/share/doc/cgroup-lite/copyright
/usr/share/doc/cgroup-lite/changelog.gz
/usr/bin
/etc
/etc/init
/etc/init/cgroup-lite.conf
/bin
/bin/cgroups-mount
/bin/cgroups-umount
/usr/bin/cgroups-mount
/usr/bin/cgroups-umount

其中 /etc/init/cgroup-lite.conf 就是这个启动脚本。看一下:

description "mount available cgroup filesystems"
author "Serge Hallyn <[email protected]>"

start on mounted MOUNTPOINT=/sys/fs/cgroup

pre-start script
	test -x /bin/cgroups-mount || { stop; exit 0; }
	test -d /sys/fs/cgroup || { stop; exit 0; }
	/bin/cgroups-mount
end script

post-stop script
	if [ -x /bin/cgroups-umount ]
	then
		/bin/cgroups-umount
	fi
end script

它在开启启动的时候就根据系统支持的各个子系统做好了挂在。跟我们没有毛事了。怎么办? 我还想像原来一样去用。这样管理起来太费劲了。那只能自己动手,丰衣足食了。

更改cgroup-lite.conf 脚本,加入如下配置

	test -x /bin/cgroups-mount || { stop; exit 0; }
	test -d /sys/fs/cgroup || { stop; exit 0; }
	/bin/cgroups-mount
	test -f /etc/cgconfig.conf && /usr/sbin/cgconfigparser -l /etc/cgconfig.conf

加入 test -f /etc/cgconfig.conf && /usr/sbin/cgconfigparser -l /etc/cgconfig.conf 就相当于激活了我们原先的cgconfig这个东西了。可以使用cgconfig.conf 的配置了。那cgrules.conf 这个怎么去激活呢? OK,我们将低版本Ubuntu 12.04 LTS 中的相应配置那出来改改吧。

# cat /etc/init/cgred.conf 
# cgred

description "cgred"
author "Serge Hallyn <[email protected]>"

start on started cgroup-lite   #注意此处
stop on stopped cgroup-lite    #注意此处

pre-start script
	test -x /usr/sbin/cgrulesengd || { stop; exit 0; }
end script

script
	# get default options
	OPTIONS=""
	CGRED_CONF=/etc/cgrules.conf
	if [ -r "/etc/default/cgred" ]; then
		. /etc/default/cgred
	fi

	# Don‘t run if no configuration file
	if [ ! -s "$CGRED_CONF" ]; then
		echo "Cgred unconfigured"
		stop
		exit 0
	fi

	# Make sure the kernel supports cgroups
	# This check is retained from the original sysvinit job, but should
	# be superfluous since we depend on cgconfig running, which will
	# have mounted this.
	grep -q "^cgroup" /proc/mounts || { stop; exit 0; }

	exec /usr/sbin/cgrulesengd --nodaemon $OPTIONS
end script

OK 。有了它,我们在/etc/cgrules.conf 这个配置也可以生效了。

后来想了想,为什么Ubuntu 14.04 LTS 会这样呢? CentOS 7 应该也是这样的? 那为什么呢? 为什么高版本后对cgroup的可配置性变差了呢? 而且感觉完全不像让人去参与进去的样子。全是问号。

是否可以认为和Docker有关呢? docker也好使用cgroup去做资源限定。你又想通过配置去做资源限定。对cgroup的管理入口不统一了。是否更麻烦了。所以削弱了直接通过配置文件去管理的特性(异想天开)

时间: 2024-08-02 11:00:48

cgroup使用过程中的注意事项的相关文章

U盘文件恢复过程中的注意事项

如今U盘已经成为大家最常使用的移动存储设备,U盘的优越性就不细说了,因为这些正是我们购买的理由.使用U盘的过程中,总会遇见些问题,尤其是中病毒.格式化.操作失误等等,这些问题一般导致的结果就是U盘内存储的数据丢失.随着U盘容量的不断加大,数据丢失带来的麻烦也在随着增加.因此,无敌数据恢复软件就成了电脑上必备的软件了. 无敌数据恢复软件不仅功能强大,操作也非常简单,它拥有人性化的提示向导,即使是第一次接触的人也可以很快上手,只是很多人只是一味的寻求最终的扫描结果,而忽略了一些基本的数据恢复原理和常

JCS使用过程中的注意事项

JCS对象缓存到Disk的过程是在缓存分区执行dispose()操作或者JVM shutdown的时候才执行写入,不是保存1个写1个: JCS对象缓存到Disk有可能会因为断电等异常情况导致缓存到Disk不成功: JCS中defineRegion( String name, ICompositeCacheAttributes cattr, IElementAttributes attr )方法的attr参数在实现中没有使用,故不能通过调用这个方法来配置动态生成缓存分区的ElementAttrib

oracle 安装过程中的注意事项

场景描述: oracle 安装过程中,dbca创建数据库的过程中,出现标题中的错误! 检测确认环境:防火墙已经关闭. 原因是:这里有一个需要注意的事项,在设置oracle数据库用户(sys,system...)密码的时候,密码中不能含有“@”符号!!!否则安装过程会报ora-12145错误. 操作建议: 出现上述错误,虽然选择ignore忽略可以继续安装,后续数据库也能正常使用. 但是,这里的操作建议是,先选择忽略该报错选项,继续安装,完成之后,重新执行dbca,将刚才创建的数据库删除,然后再重

WINDOWS系统下MYSQL安装过程中的注意事项

1.首先MySQL的安装方式有两种:一种是MSI安装方式,很简单就像安装Windows软件一样.另外一种就是ZIP安装方式.这种相对而言比较麻烦.新手推荐MSI安装方式. 安装方式有以下两种: MSI的安装包方式(相对简单):ZIP安装方式 选择安装类型:(推荐选择Typical 典型安装方式) Typical:典型安装 Custom:自定义安装 Complete:完全安装 2.MySQL配置 详细配置 detailed configuration 标准配置 standard configura

编写代码过程中,注意事项

如果写的是一个工具类的话,比如说想获取默认12个月,然后返回值希望是个map,那么这里的map做泛型定义的时候,就需要细化.写成Map<String, String>,而不能写成Map<String, Object>.

使用MatLab过程中的一些注意事项

1.如果输入单行后直接按回车,如 则直接显示结果如下 2.如果希望输入多行,则需要在行尾使用"Shift"+"Enter"组合键来换行 3.如果输入多行,但只需显示最后一条结果,可以在之前的语句末尾使用";" //未完待续 使用MatLab过程中的一些注意事项

android 反编译 混淆过程中注意事项

此文源自组内成员分享的PPT,其他成员的文档由于没有得到授权,暂不公开. 本文命令如果没有特殊注明,均为windows 7环境. 本文只涉及大概的知识点,不涉及具体的细节,需要注意. 反编译 apktool 可反编译资源文件(xml,点九图)以及代码为smali代码 使用命令:apktool d xxx.apk output_filepath dex2jar 反编译dex文件(解压apk获得的classes.dex)为jar 使用命令:dex2jar xxx.dex jd-gui 查看jar文件

Sybase IQ使用过程中注意事项

Sybase IQ使用过程中注意事项 1,字母大小写比对不敏感,也就是在值比对判断时大小写字母都一样; 2,等值,或<>判断,系统默认对等式两边比对值去右边空格再进行比较: 3,GROUP BY 可以根据SELECT字段或表达式的别名来 汇总,在编写时也尽量避免SELECT 语句的别名与FROM表中的字段有重复,不然会出现莫名其妙的错误: 4,FROM后的子查询 要定义别名才可使用: 5,存储过程要返回IQ系统错误信息 SQLCODE || ERRORMSG(*) :(两者都为EXCEPTIO

配置Office 365单点登录过程中的一些注意事项 (稍后配图)

这些天一直在整O365单点登录的问题,其中涉及到了很多知识点,其中以ADFS,CA为主吧,IIS为辅.下面我就把这些天积累的一些经验写下来备用. 1. 申请证书不一定要通过“证书颁发机构Web注册”,直接在mmc控制台即可进行,详见我的另一篇博文. 2. 如果通过http://server/certsrv的方式申请证书,需要注意以下几点:2.1 http://server/certsrv这个网站需要启用HTTPS,否则“证书模板”下拉列表出不来.但是实验过程中遇到没启用照样可以申请的事情,不清楚