技术分享 | 使用 systemd 修改资源隔离配置

作者:晏泽爱可生售后团队成员 , 主要负责公司数据库运维产品问题诊断;努力在数据库和IT领域里摸爬滚打中 。 本文来源:原创投稿*爱可生开源社区出品 , 原创内容未经授权不得随意使用 , 转载请联系小编并注明来源 。
本文关键字:Linux、systemd、资源隔离
一 , 修改systemdunitfile为了给程序配置资源隔离 , 通常我们会到cgroup层级树下的控制器里 , 创建或者修改控制组文件 。 在Linux7中 , 如果为程序配置了systemd服务 , 除了直接修改控制组文件之外 , 还可以通过systemd相关命令对程序的资源隔离配置进行修改 。
1.1修改方法有两种方法可以对配置了systemd的程序进行资源隔离:
命令行修改:通过执行systemctlset-property命令实现 , 形式为systemctlset-propertynameparameter=value;修改默认即时生效手工修改文件:直接编辑程序的systemdunitfile文件 , 完成之后需手工执行systemctldaemon-reload更新配置 , 并重启服务systemctlrestartname.servicesystemdunitfile里支持的资源隔离配置项 , 如常见的:
CPUQuota=value该参数表示服务可以获取的最大CPU时间 , value为百分数形式 , 高于100%表示可使用1核以上的CPU 。 与cgroupcpu控制器cpu.cfs_quota_us配置项对应 。 MemoryLimit=value该参数表示服务可以使用的最大内存量 , value可以使用K,M,G,T等后缀表示值的大小 。 与cgroupmemory控制器memory.limit_in_bytes配置项对应 。 完整的配置项列表 , 请参考官方文档:2.3.2.ModifyingUnitFiles1.2试验说明以MySQLCPU资源管理为例 。
环境信息:
系统版本:CentOSLinuxrelease7.5.1804(Core)CPU配置:4核CPU systemd使用以下三种类型的unit来进行资源管理:
service:Asystemserviceslice:Agroupofhierarchicallyorganizedunitsthatmanagesystemprocessscope:Anexternallycreatedprocess其中scope类型只能由程序自动创建;其他两种可程序自动创建 , 也可手动创建 。 系统在启动的时候将默认创建一系列运行时必要的service , 同时也会创建四种必要的slice:
-.slice—therootslice;system.slice—thedefaultplaceforallsystemservices;user.slice—thedefaultplaceforallusersessions;machine.slice—thedefaultplaceforallvirtualmachinesandLinuxcontainers.基于此 , 在Linux7中 , 系统通过绑定程序的systemd层级树路径和cgroup资源控制器路径实现资源隔离(可使用命令systemd-cgls直观查看 , 见下文图片) , 具体表现为:
将serviceunit、scopeunit或者sliceunit在systemd层级树里的路径 , 与对应的cgroup资源控制器路径进行匹配unitfile里有对应资源管理配置参数 , 直接作用于cgroup对应的资源控制器因此 , 通过修改程序的systemdunitfile里与资源管理相关的参数 , 即可达到资源隔离配置的目的 。


    推荐阅读