Linux systemd-run unit封装CGroup资源进行任务运行

news2024/9/24 1:19:42

Linux systemd-run 封装资源使用

之前我们讲了关于 systemctl 对各种服务或者说是 unit 进行了讲解,也讲了怎么创建一个 unit,进行相关配置或者依赖设置等等。在使用 systemctl status xxx 时,我们可以发现对应的资源使用情况,如:

systemctl status chronyd

在这里插入图片描述

但如果创建一个 unit 每次都要通过配置文件,然后巴拉巴拉,其实还是很麻烦的,我们只需要使用 systemd-run 就可以轻而易举的创建一个 CGroup,封装资源,运行命令,包装成一个 unit

systemd-run

快速认识

systemd-run 可以创建临时命令封装到 CGroup 中。CGroup 可以封装资源,运行任务。这样一个任务会变成我们熟悉的 unit 进行运行,然后可以通过 systemctl 进行管理。如:

# 后面会有完整实例
systemd-run -p  MemoryLimit=5M  -p CPUShares=100 --unit=mysleep --slice=test sleep 60
systemctl status mysleep

在这里插入图片描述

可以看到,我们直接创建了一个 service,运行在 CGroup 中,并设置了一些资源限制。甚至我们可以查看下她的 service 配置文件:

systemctl cat mysleep
# 自动构建在了 /run/systemd/system/mysleep.service 中

在这里插入图片描述

格式与我们之前创建配置一致,所以可以认为 systemd-run 创建了一次性的 unit 运行。

如果在该任务运行完毕后,再次使用 systemctl 去查看:

systemctl status mysleep
systemctl cat mysleep

在这里插入图片描述

会发现该任务已经运行完毕,查看不到了。

描述

systemd-run 可以创建一个临时的 service 或者 scopeunit,然后在里面运行简单的 COMMAND 命令。会创建对应的 service 文件,关联 pathsockettimer 等等,帮助在特定条件下启动临时的 service

通过 systemd-run 运行的命令,会在干净、独立的 CGroup 中;和其他的 unit 一样,可以使用 systemctl list-units 进行筛选查看;运行时,会使用 systemd 进程为父进程,以异步的方式在后台创建临时 service 运行,并且在命令执行之后返回结果(除明确 前台 执行外)。

使用

systemd-run 可以直接跟 bash 命令,全局默认运行程序:

systemd-run sleep 100
systemctl status run-5561

在这里插入图片描述

当然可以选择部分参数设置:

全量请参考,这里仅仅举例重要部分 https://www.linux.org/docs/man1/systemd-run.html

man systemd-run

–no-ask-password

需要切换用户执行时,不要进行密码验证

–scope

指定一个 unit 类型来创建任务,默认是 service

–unit=[name]

unit 指定名字,如果不指定,默认为 run-ID.service 格式。

–property / -p

unit 设置一个属性,这个属性列表是用空格分割的属性与值的键值对,比如:

systemd-run -p MemoryLimit=5M -p CPUShares=100 sleep 100

这里面大多数都是属性控制,需要参照的是 systemd.resource-control,主要包含 CPU、Memory、IO 相关属性配置。

以下列举了常用的配置,大全请读者自行百度:https://www.freedesktop.org/software/systemd/man/systemd.resource-control.html

或者参考该链接

选项取值含义
CPUAccountingyes/no如果为 yes,会开启CPU占用统计。
CPUWeight1-10000默认100;CPU分配权重,控制Cgroup的 cpu.weight 属性,是系统正常运行时占比
StartupCPUWeight1-10000默认100;CPU分配权重,控制Cgroup的 cpu.weight 属性,是系统启动过程时占比
CPUQuotaN%设置CPU时间上限,是一个百分数,占用单颗CPU的总时间多少
MemoryAccountingyes/no如果为 yes,会开启MEM占用统计。
MemoryMinN[KMGT] or N%进程保留的最低内存用量,可以使用512K进行表示,或者 10%相对系统的总物理内存;对应CGroup的memory.min
MemoryLowN[KMGT] or N%进程保障内存用量(除非其他的最低用量不够,才会少于这部分用量),可以使用512K进行表示,或者 10%相对系统的总物理内存;对应CGroup的memory.low
MemoryHighN[KMGT] or N%进程柔性内存用量限制(如果超过会降低权重,并且尽量回收内存),可以使用512K进行表示,或者 10%相对系统的总物理内存;对应CGroup的memory.high
MemoryMaxN[KMGT] or N%进程刚性内存用量限制(如果超过会被强制杀死),可以使用512K进行表示,或者 10%相对系统的总物理内存;对应CGroup的memory.max
MemorySwapMaxN[KMGT] or N%进程刚性交换空间用量限制(如果超过会被强制杀死),可以使用512K进行表示,或者 infinity 不做限制;对应CGroup的memory.swap.max
TasksAccountingyes/no如果为yes,会进行任务数量统计
TasksMaxN or N%总任务数量的限制配置,可以为整数或者最大任务数量的百分比,或者 infinity 不做限制;对应CGroup的pids.max
IOAccountingyes/no如果为yes,会进行块设备IO统计
IOWeight1-10000默认100;IO分配权重,控制Cgroup的 cpu.weight 属性,是系统正常运行时占比
StartupIOWeight1-10000默认100;IO分配权重,控制Cgroup的 cpu.weight 属性,是系统启动过程时占比
Slicestring将unit放入那个slice中,主要是可以做层次、分组的资源分配或者依赖管理等。

–description=[string]

可以直接给 unit 添加一个描述性的字符串,如果不存在则是 COMMAND 本身。

–slice=[sliceName]

将该 unit 放入对应的 slice 中,默认为 system.slice。与上面表格的 Slice 相同。

–remain-after-exit / -r

unit 执行完毕后,是否继续保持服务的存在,直到 stop 为止。如果不设置,在执行完 unit 后,该 unit 的信息会被全部删除。

–uid=[N]

以指定的 UID 身份进行 unit 的执行。

–gid=[N]

以指定的 GID 身份进行 unit 的执行。

–nice=[N]

执行 nice 谦让优先级。

–working-directory=[path]

指定工作目录进行 unit 运行。

–setenv=“[K=V]”

unit 传递一个环境变量,是一个列表使用空格隔开,内容为 KV 键值对,如:

systemd-run -r --setenv="name=huangyichun age=26" env

在这里插入图片描述

–cocllect / -G

unit 执行失败的时候,不会从内存中卸载,会一直保留在内存中,直到用户明确使用其他命令重启、或关闭。如果开启,资源回收会更加激进,在任务执行后被卸载,无论成功与否。

–on-active=[time]

在特定时间进行 unit 的运行,如:

systemd-run -r --on-active=60 env  # 60秒后运行
systemctl status run-11249.service
systemctl status run-11249.service
systemctl status run-11249.service

在这里插入图片描述

返回值

0 为提交成功,1 为提交失败。

哪些地方可以使用

可以看到 systemd-run 可以封装一个小型的 shell 资源,并且可以指定到不同的用户运行,所以一般可以作为调度平台的使用。

shell

在调度中,会涉及大量 shell 脚本的使用,但是 shell 脚本的返回结果,资源封装等等做的并不够好,此时我们完全可以通过 unit 进行 shell 任务的调度。

spark-sql

举例一个大数据环境中,需要提交一个 spark-sql 任务,其实用 shell 也可以,但是如果我们还想保留完整的提交日志,尽量少的资源占用等等,都可以使用 systemd-run 来实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/98369.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JSTL标签库 | 深入解析JSTL标签库

目录 一:深入解析JSTL标签库 1、什么是JSTL标签库 2、使用JSTL标签库的步骤 3、JSTL标签的原理 4、jstl中的核心标签库core当中常用的标签 一:深入解析JSTL标签库 1、什么是JSTL标签库 ①Java Standard Tag Lib(Java标准的标签库&am…

电脑文件不小心删除了怎么恢复 ? 删除的文件如何恢复文件?

如果误删电脑文件后,如何恢复文件? 电脑删除文件是很经常的事,为了电脑运行更快我们经常都会清理,但是有时候也会出现不小心删除重要文件的情况。如何恢复删除的文件?本文总结的2种常用方法可以帮助到你。 方法1、注册…

惠普CP1025 因转印离合器导致打印不全大片空白的问题

问题症状 自检只打印出一部分, 后面大部分都是空白. 如果是碳盒缺粉, 应该是均匀地浅或者空白, 如果是成像鼓的问题, 应该是从上到下成条状的不均匀, 这样显示一节后空白的情况是没见过, 上网查有类似的问题 惠普CP1025彩色激光打印机打印图像前半部有字后半部白纸惠普1025打印…

Java框架:Spring框架

文章目录一、Spring概念二、Spring特征三、Spring基本架构3.1Spring体系结构3.2Core Container(核心容器)3.3Data Access/Integration(数据访问/集成)3.4Web(MVC/Remoting)3.5Test(测试)3.6AOP(面向切面编程)四、Spring主要jar包五、Spring用到的设计模式一、Spring概念 什么是…

vue学习笔记(三)-组件化编程基础

概念 传统方式与组件化对比 存在问题 1.依赖关系混乱 2.代码复用率不高 模块与组件、模块化与组件化的关系 模块 a.理解:向外提供特定功能的 js 程序,一般就是一个 js 文件 b.为什么:js 文件很多很复杂 c.作用:复用、简化 …

【Docker技术内幕】(十二)使用docker安装Kafka

目录 一、准备工作 1、安装docker 2、设置加速镜像 二、开始安装 1、启动容器 三、验证Kafka是否安装成功 四、部署kafka-manager 一、准备工作 1、安装docker 参考 【Docker技术内幕】(四)Linux环境下安装docker 2、设置加速镜像 vim /etc/do…

C语言 数据存储 char int 数据存储 关于原码反码补码

上图 前五个整形是整形家族,为什么char也是 因为他是字符型 字符实际存储的时候寸的是这个的ascll值 ascll值是个整数 除了以上两种 还有构造类型 又叫自定义类型 为什么又数组类型 如下代码 arr和【】的内容都可以自定义 为什么出现以上情况.(ffff 是16进制表示…

第二证券|通过磁铁制造功率更大的电动汽车电池

德克萨斯大学奥斯汀分校的研讨人员表明,一个更厚的电极,经过磁优化的离子道路,能够使充电更快,充电之间的功率更大。 研讨人员制作了一种具有‘快速通道’摆放的电极,以进步充电速度和续航路程。 研讨人员发现了一种共…

Apache Hudi 数据湖介绍

目录​​​​​​​ Apache Hudi 数据湖介绍 Hudi 历程 Hudi Features Apache Hudi 数据湖介绍 Apache Hudi(发音为“hoodie”)是下一代流媒体数据湖平台源于Uber 。Apache Hudi将核心仓库和数据库功能直接引入数据湖。Hudi提供了表、事务、高效的追加…

[附源码]Nodejs计算机毕业设计基于云数据库的便民民宿租赁系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置: Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分…

人人都能看懂的Spring底层原理,看完绝对不会懵逼

人人都能看懂的Spring原理,绝对不会懵逼为什么要使用Spring?Spring的核心组件Spring是如何实现IOC和DI的?定义了BeanDefinition扫描加载BeanDefinition根据BeanDefinition进行Bean的实例化和初始化实例化属性赋值保存到单例缓冲池一个Bean从创…

docker高级篇2-分布式存储之三种算法

面试题: 1~2亿条数据需要缓存,请问如何设计这个缓存案例? 答:单机单台100%是不可能的。肯定是分布式缓存的。那么用Redis如何落地? 一般有三种方案: 哈希取余分区;一致性哈希算法分区&#…

HttpRunner4.x 安装与使用

HttpRunner4.x 安装与使用HttpRunner4.x 安装与使用安装使用运行脚手架项目方式一:录制生成用例步骤1:导出har文件步骤2:转化成测试用例文件步骤3:执行测试用例方式二:手工编写测试用例HttpRunner4.x 安装与使用 以下…

卡塔尔世界杯终局之战,阿根廷VS法国,是老将加冕还是新王登基?

【世界杯】阿根廷VS法国 不知不觉,世界杯已经走到最后的尾声,此前经历的28天,63场比赛皆是铺垫,卢赛尔体育场将会迎来2022卡塔尔世界杯最终的决赛,究竟是梅西球王加冕还是法国卫冕世界杯冠军,今晚23&#x…

KNN算法 鸢尾花种类预测

目录 一:KNN原理 二:数据处理 三:超参调试、模型保存及使用 四:鸢尾花种类预测 详细步骤 一:KNN原理 从训练集中找到跟待测数据最近的k条记录 根据这些记录的分类决定新数据的分类 主要因素包括有:K邻…

java------JVM之类加载和双亲委派机制

类加载器:加载.class文件。 将新建的对象放入堆里面,而对象的引用(地址)放到栈,其中引用指向堆里面对应的对象。 1-启动类加载器,负责加载jre\lib目录下的rt.jar包c编写,加载java核心库 java.*,构造ExtClassLoader和A…

[CocosCreator]封装行为树(一)

(老规矩:广告位留给自己) 欢迎喜欢或者从事CocosCreator开发的小伙伴请加入我的大家庭CocosCreator游戏开发Q群:26855530 行为树的定义:控制AI实体决策流程的分层节点树。游戏中Npc的活动,或者主角挂机行为都十分依赖行为树,本章开始,封装适用CococCreator使用的TypeScript行…

Mongo基本操作

文章目录核心概念库<DataBase>集合<Collection>文档<Document>MySQL与MongoDB关系总结基本操作库<database>集合<Collection>文档<document>文档查询ANDORAND 和 OR 联合模糊查询排序分页总条数去重指定返回字段索引<index>操作复合…

vmware ESXI 7 升级ESXI 8

1 、上传VMware-Esxi-8.0安装包 2开启ssh 3、 远程登录到Esxi主机 ssh root192.168.31.119 [rootlocalhost:~] 4、升级到Esxi 8.0 [rootlocalhost:~] esxcli software sources profile list -d /vmfs/volumes/datastore1/iso/VMware-ESXi-8.0-20513097-depot.zip Name Vend…

软件设计师——项目管理

文章目录Gantt图与Pert图风险管理配置管理沟通管理题目举例Gantt图与Pert图 甘特图能够清晰描述每个任务的开始 / 结束时间及各任务之间的并行性&#xff0c;也可以动态地反映项目的开发进展情况&#xff0c;但难以反映多个任务之间存在的逻辑关系&#xff1b;PERT 利用项目的…