cgroup 配置 对核,内存等限制

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就会正确运行。

后记

如果不小心使用了cgclear命令清除了所有模块,可以参考https://blog.csdn.net/xinshuzhan/article/details/118293022。这个文章中的那个脚本可以重新加载模块。

如果cgroup运行不正常,可以启动cgrulesengd -d -n >文件名,然后进对应的文件里查看报错,主要注意开头的模块匹配部分和后面的进程是否正确归类,只要tasks正确归类,cgroup就会正确运行。

cpuset.cpus和mems参数务必一起使用,切记切记。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值