ubuntu cgroup 服务配置,用户使用核的限制
- cgroup
- 安装
- 文件创建
- /etc/cgconfig.conf
- 关于限制核的问题
- /etc/cgrules.conf
- 加载模块
- 服务配置
- cgconfigparser.service
- cgrulesgend.service
- 加载服务
- 服务启动
- 后记
cgroup
ulimits不好用,别看了,systemd-run只能限制单个进程,想针对用户进行配置,限制某个用户的内存或者cpu核使用,只能通过cgroup,基于核的配置必须指明所用的是哪个核,基于内存的配置限制则少很多,这里说一些基本属性的配置和检错方法,其他的配置也可用类似的方法进行使用
安装
sudo apt install cgroup-tools。没啥好说的。
文件创建
sudo cp /usr/share/doc/cgroup-tools/examples/cgred.conf /etc/
#File - call it the 'groups file' - that specifies groups.
sudo touch /etc/cgconfig.conf
#File - call it the 'rules file' - that allocates programs to groups.
sudo touch /etc/cgrules.conf
/etc/cgconfig.conf
group indexer {
cpuset {
cpuset.cpus=4-8;
cpuset.mems=0-1;
}
memory{
memory.limit_in_bytes = 5G;
memory.soft_limit_in_bytes = 4G;
memory.swappiness = 0;
}
}
indexer名字随意,适配器名字,后来在生成文件时候可以看见,5G是严格内存大小,4G是松弛内存大小,超了会自动杀死程序。
关于限制核的问题
cpuset子系统中,有个参数是cpuset.cpus,这个参数用于设置被限制的进程在第几号cpu上运行,但是这个参数单独设置无效,必须与cpuset.mems配合使用,这个错误能通过cgconfigparaser但是不会报错,后面的cgrulesengd也不会报错,但是对应的tasks里进程不会更改。
mems参数设置通过numactl --hardware查看,为了对核进行管理,会把cpu分成多个node,如果不设置这个参数cgrulesengd中会报tasks无法写入错误。(这个错花了我一整天)
/etc/cgrules.conf
friend memory indexer
friend是用户名称,也可以通过用户名:进程指明具体的进程,memory是子系统名称,这里是配的内存,可添加cpuset等等,indexer是适配器名称,上面任意取的。
加载模块
cgconfigparser -l /etc/cgconfig.conf
这一步会在/sys/fs/cgroup/模块名,下创建文件夹,可以通过cgexec进而限制单独的进程。
这里会在/sys/fs/cgroup/memory下创建indexer文件夹。
启用:
cgrulesengd
到这一步,限制用户内存基本配置完事,下一步是将这些配置服务的,顺手吐槽ubuntu,没服务害苦我们了。
服务配置
cgconfigparser.service
// An highlighted block
sudo touch /etc/systemd/system/cgconfigparser.service
vi /etc/systemd/system/cgconfigparser.service
[Unit]
Description=cgroup config parser
After=network.target
[Service]
User=root
Group=root
ExecStart=/usr/sbin/cgconfigparser -l /etc/cgconfig.conf
Type=oneshot
[Install]
WantedBy=multi-user.target
cgrulesgend.service
// An highlighted block
sudo touch /etc/systemd/system/cgrulesgend.service
vi /etc/systemd/system/cgrulesgend.service
[Unit]
Description=cgroup rules generator
After=network.target cgconfigparser.service
[Service]
User=root
Group=root
Type=forking
EnvironmentFile=-/etc/cgred.conf
ExecStart=/usr/sbin/cgrulesengd
Restart=on-failure
[Install]
WantedBy=multi-user.target
顺手提示下,ubuntu里粘贴是ctrl shift c,因为ctrl c是终止,而浏览器里是ctrl c,吐槽。
加载服务
sudo systemctl daemon-reload && sudo systemctl enable cgconfigparser --now && sudo systemctl enable cgrulesgend --now
服务启动
sudo systemctl restart cgconfigparser && sudo systemctl restart cgrulesgend
服务配完修改配置时候重启这两个服务即可,说是服务其实就是两个程序命令的简化。
第一个服务可以理解为加载模块,用于每次载入cgconfig.conf配置,更新子系统。
第二个服务是启动守护进程,不断对/sys/fs/cgroup/子系统/模块名/tasks更新,这个文件里是对应的需要限制的进程pid,这个守护进程会监听系统的进程,对pid,uid,等进行判断,如果匹配就把pid加入对应模块的tasks文件中,起到限制作用。换句话说,如果tasks正确更新,cgroups就会正确运行。
后记
如果cgroup运行不正常,可以启动cgrulesengd -d -n >文件名,然后进对应的文件里查看报错,主要注意开头的模块匹配部分和后面的进程是否正确归类,只要tasks正确归类,cgroup就会正确运行。
cpuset.cpus和mems参数务必一起使用,切记切记。