【Linux】进程的隔离和控制:namespace 隔离、cgroup 控制

文章目录

  • 五、namespace 隔离
    • dd -- 读取、转换并输出数据
    • mkfs -- 格式化文件系统
    • df -- 显示文件系统磁盘使用情况
    • mount -- 加载文件系统到指定的加载点
    • unshare -- 创建子进程,同时与父程序不共享namespace
    • 一个 demo
  • 六、cgroup(Control Group) 相关命令
    • pidstat -- 监控进程的 CPU、内存、线程、设备IO等系统资源的占用情况
    • stress -- 压力测试工具
    • 一些使用小 demo
      • 1. cgroups 信息查看
      • 2. 使用 cgroups 对内存进行控制
      • 3. 使用 cgroups 对 CPU 进行控制


五、namespace 隔离

dd – 读取、转换并输出数据

dd [选项] 可以从标准输入或文件中读取数据,根据指定的格式来转换数据,再输出到文件、设备或标准输出。

if=文件名 输入文件名,默认为标准输入。即指定源文件;
of=文件名 输出文件名,默认为标准输出。即指定目的文件;
ibs=bytes 一次读入 bytes 个字节,即指定一个块大小为 bytes个字节;
obs=bytes 一次输出 bytes 个字节,即指定一个块大小为 bytes 个字节;
bs=bytes 同时设置读入/输出的块大小为 bytes 个字节;
cbs=bytes 一次转换 bytes 个字节,即指定转换缓冲区大小;
skip=blocks 从输入文件开头跳过 blocks 个块后再开始复制;
oseek=blocks 从输出文件开头跳过 blocks 个块后再开始复制;
count=blocks 仅拷贝 blocks 个块,块大小等于 ibs 指定的字节数
conv=<关键字> 将文件进行转换,这里列举一部分

  • lcase 大写字符转小写
  • ucase 小写字符转大写
  • swap 交换输入的每对字节
  • noerror 出错时不停止
  • ascii 转换 ebcdic 为 ascii
  • ebcdic 转换 ascii 为 ebcdic
  • block 把每一行转换为长度为 cbs,不足部分用空格填充
  • unblock 使每一行的长度都为 cbs,不足部分用空格填充

mkfs – 格式化文件系统

mkfs [-V] [-t fstype] [fs-options] filesys [blocks] 用于在设备上创建Linux文件系统。

-t fstype:指定要建立何种文件系统,如 ext3、ext4…
filesys :指定要创建的文件系统对应的设备文件名
blocks:指定文件系统的磁盘块数
-V:详细显示模式
fs-options:传递给具体的文件系统的参数

使用 dd 创建空白文件,再利用空白文件做 Linux 文件系统的创建是一个比较常用的方式。

df – 显示文件系统磁盘使用情况

df [OPTION] ... [FILE] ... 显示目前在 Linux 系统上的文件系统磁盘使用情况统计。
-a / --all 包含所有具有 0 Blocks 的文件系统
-h / --human-readable 使用人类可读的格式,显示 M 或 G 为单位而不是字节数
-H / --si 和 -h 相似,只是用 1000 作为单位而不是 1024
-t / --type=TYPE 限制列出文件系统的 TYPE
-T / --print-type 显示文件系统的格式

mount – 加载文件系统到指定的加载点

此命令常用于挂载光盘(win可以自动挂载到 E:,而 Linux 需要手动挂载哦)

mount -l :显示已加载的文件系统列表
mount [-t vfstype] [-o options] device dir

-t:加载文件系统类型支持常见系统类型的 ext3, ext4, iso9660, tmpfs, xfs 等,大部分情况可以不指定,mount 可以自己识别;
-o options:主要来描述设备的挂接方式

  • loop 把一个文件当成硬盘分区挂接上系统
  • ro 用只读方式挂接设备
  • rw 用读写方式挂接设备
    device:要挂接的设备(比如我们用 dd + mkfs 创建出来的文件系统)
    dir:要挂接的目录

unshare – 创建子进程,同时与父程序不共享namespace

unshare [options] program [arguments]

-i / --ipc:不共享 IPC 空间(进程间通信)
-m / --mount:不共享 Mount 空间(文件系统)
-n / --net:不共享 Net 空间(网络)
-p / --pid:不共享 PID 空间(进程)
-u / --uts:不共享 UTS 空间(主机名/网络名)
-U / --user:不共享用户信息
-V / --version:不共享版本信息查看
--fork:执行一个新的子进程,在子进程里执行 unshare 传入的参数,而不是让现在的进程作为一个父进程
--mount-proc:执行子进程前,将 proc 优先挂载过去


一个 demo

# 创建 pid 隔离进程 /bin/bash
unshare --fork --pid --mount-proc /bin/bash
# mount 隔离
# 1. 创建 mount 隔离进程
unshare --mount --fork /bin/bash
# 2. 创建空白文件,并格式化成文件系统
dd if=/dev/zero of=data.img bs=8k count=10240
mkfs -t ext4 ./data.img
# 3. 挂载
mkdir -p /data/ttang/datamount
mount -t ext4 ./data.img /data/ttang/datamount
# 检查
df -h 
# 4. 创建文件并查看
cd /data/ttang/datamount
echo "hello world" > test.txt
cat test.txt
# 5. 在另一个会话中访问这个文件,会发现,找不到文件
ll /data/ttang/datamount/test.txt


六、cgroup(Control Group) 相关命令

pidstat – 监控进程的 CPU、内存、线程、设备IO等系统资源的占用情况

pidstat [选项] [<时间间隔>] [<次数>] 用于监控指定或全部进程的 CPU、内存、线程、设备IO等系统资源的占用情况。pidstat 第一次采样显示自系统启动开始的各项统计信息,后续采样将显示自上次运行命令后的统计信息。用户可以用过指定统计的次数和时间来获得所需的统计信息。

-u:默认参数,显示各进程的 CPU 使用统计
-r:显示各进程的 内存 使用统计
-d:显示各进程的 IO 使用统计
-p:指定进程号,后接 ALL 表示所有进程
-C:指定命令
-l:显示命令名和所有参数

在 root 下

  • 安装 pidstat 命令:yum install sysstat -y
  • 卸载 pidstat 命令:yum remove sysstat -y

stress – 压力测试工具

stress [选项 [ARG]] 可以对 CPU、Memory、IO、磁盘 进行压力测试

-c N / --cpu N:产生 N 个进程,每个进程都循环调用 sqrt 函数产生 CPU 压力。
-i N / --io N:产生 N 个进程,每个进程都循环调用 sync 函数将内存缓冲区内容写到磁盘上,产生 IO 压力。
-m N / --vm N:产生 N 个进程,每个进程循环调用 malloc/free 函数分配和释放内存

  • --vm-bytes B:指定分配内存的大小
  • --vm-keep:一直占用内存,区别于默认的不断的释放和重新分配
    -d N / --hdd N:产生 N 个不断执行 write 和 unlink 函数的进程(创建文件、写入内容、删除文件),测试的是写入压力
  • --hdd-bytes B:指定文件的大小
    -t N / --timeout N:在 N 秒后结束程序
    -q / --quiet:程序在运行的过程中不输出信息

在 root 下

  • 安装 stress 命令:yum install stress -y
  • 卸载 stress 命令:yum remove stress -y

一些使用小 demo

1. cgroups 信息查看

  • cgroups 版本查看
cat /proc/filesystems | grep cgroup
  • cgroup 子系统查看
cat /proc/cgroups
  • cgroups 挂载信息查看,可以看到各种控制组的信息包括存储位置
mount |grep cgroup

我们在这里找到 cpu 的 cgroups 的储存位置
在这里插入图片描述

  • 查看某个进程的 cgroups 信息
    以当前 bash 为例,$$ 表示当前进程的 PID
cat /proc/$$/cgroup

同样找到当前进程使用 cpu 中 cgroups 的储存位置
在这里插入图片描述
把两行目录拼接起来,便可以查找到进程 cgroups 的具体配置信息
在这里插入图片描述
在这里插入图片描述


2. 使用 cgroups 对内存进行控制

这里我们做一个实现,创建一个控制内存的控制组,限制他的最大内存使用上限,然后用 stress 工具将给一个进程内存压力测试,同时将这个进程拉入我们创建的控制组中。
先说结论,当进程最大内存超过控制组内存上限的时候,就会直接挂掉。

  • 创建一个内存控制组

    # 进入存放内存控制组的位置,建立我们的测试目录,就是我们即将进行操作的控制组
    cd /sys/fs/cgroup/memory/
    mkdir test_memory
    ll ./test_memory/
    

    在相应目录下创建后,可以查看到这个目录里面直接被初始化出来很多内容,我们将完成上述实现作为最终目的,只需要关注框选的这两个文件

    在这里插入图片描述

  • 配置 cgroup 的策略为最大使用 10M 内存

    echo "10485760" > test_memory/memory.limit_in_bytes
    

    在这里插入图片描述

  • stress 创建一个需要 50M 内存的进程,同时用 pidstat 对其进行监控

    • 进入创建的 dir 中,并复制两个SSH渠道
      在这里插入图片描述

    • 在会话 1 中运行一个 stress 进程

      stress -m 1 --vm-bytes 50M
      

      在这里插入图片描述

    • 在会话 2 对运行的进行进行监测,可以看到stress的这个进程不断的进行 50M 内存申请又释放的工作

      pidstat -C stress -p ALL -r 2 9999
      

      在这里插入图片描述

    • 将 PID 挪到 tasks 中

      echo "实际的pid" > tasks
      

      在这里插入图片描述
      可以看到会话 1、2 中都迅速给出了响应:进程退出
      在这里插入图片描述
      在这里插入图片描述

3. 使用 cgroups 对 CPU 进行控制

与上面相似,创建一个控制 cpu 的控制组,设置 cpu 占用率,然后用 stress 工具将一个进程的 cpu 消耗打满,同时将这个进程拉入我们创建的控制组中。
先说结论,当进程超过规定 cpu 消耗,就会直接挂掉。

  • 创建一个 cpu 控制组

    # 进入存放 cpu 控制组的位置,建立我们的测试目录,就是我们即将进行操作的控制组
    cd /sys/fs/cgroup/cpu/
    mkdir test_cpu
    ll ./test_cpu/
    cd test_cpu
    

    在相应目录下创建后,可以查看到这个目录里面直接被初始化出来很多内容,我们将完成上述实现作为最终目的,只需要关注下面提到的两个值的大小。

    • cfs_quota_us / cfs_period_us 就是 cpu 的使用率

      • cfs_period_us:表示一个 cpu 带宽,单位为微秒,系统总 cpu 带宽,默认值 100000
      • cfs_quota_us:表示 cgroup 可以使用的cpu带宽,单位为微秒。如果其值为 -1,表示使用的 CPU 不受 cgroup 限制。cfs_quota_us 的最小值为 1ms(1000),最大值为 1s
        在这里插入图片描述
    • 我们将 cfs_quota_us 的值设为 30000,从理论上就可以限制 test_cpu 控制进程的 cpu 利用率最多为 30%

      echo 30000 > cpu.cfs_quota_us
      

      在这里插入图片描述

  • stress 创建一个 cpu 压力测试的进程,同时用 pidstat 对其进行监控

    • 保持在创建的 dir 中,复制两个SSH渠道

    • 在会话 1 中,进行 stress cpu 压力测试

      stress -c 1
      

      在这里插入图片描述

    • 在会话 2 中,pidstat 监视进程的 cpu 使用率

      # -u 是监测 cpu,默认也是监测 cpu,所以可以不用写
      pidstat -C stress -p ALL 2 9999 
      

      在这里插入图片描述

  • 将所监视进程的 pid 放到 cpu 控制组的 tasks 中

    echo "该进程的PID" > tasks
    

    在这里插入图片描述

    • 在会话 2 中可以观察到,压力测试进程的 cpu 的占用率,急速下降,来到了我们给设置的 30%的大小。
      在这里插入图片描述

🥰如果本文对你有些帮助,欢迎👉 点赞 收藏 关注,你的支持是对作者大大莫大的鼓励!!(✿◡‿◡) 若有差错恳请留言指正~~


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode刷题记录】230. 二叉搜索树中第K小的元素

230 二叉搜索树中第K小的元素 给定一个二叉搜索树的根节点 root &#xff0c;和一个整数 k &#xff0c;请你设计一个算法查找其中第 k 个最小元素&#xff08;从 1 开始计数&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,1,4,null,2], k 1 输出&#xff1…

2024年深圳杯东三省联赛数模竞赛A题代码改进-更加合理的结果

4月下旬深圳杯开赛后第二天就推出了完整版的论文&#xff0c;经过长达半个月大家再售后群的讨论分析&#xff0c;我们又重新对之前思路下写的代码进行了改进。本次改进的结果&#xff0c;我们特地参考了网上一些常见的火箭及其相关的级别分离高度&#xff1a;&#xff08;我们的…

c语言刷题——输出图案

1.输出用“*”组成的X形图案 题目&#xff1a;请打印用“*”组成的X形图案 描述&#xff1a; 多组输入&#xff0c;一个整数&#xff08;2~20&#xff09;&#xff0c;表示输出的行数&#xff0c;也表示组成“X”的反斜线和正斜线的长度。 输出描述&#xff1a; 针对每行输…

【C语言】指针篇- 深度解析Sizeof和Strlen:热门面试题探究(5/5)

&#x1f308;个人主页&#xff1a;是店小二呀 &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;C笔记专栏&#xff1a; C笔记 &#x1f308;喜欢的诗句:无人扶我青云志 我自踏雪至山巅 文章目录 一、简单介绍Sizeof和Strlen1.1 Sizeof1.2 Strlen函数1.3 Sie…

零基础学习数据库SQL语句之查询表中数据的DQL语句

是用来查询数据库表的记录的语句 在SQL语句中占有90%以上 也是最为复杂的操作 最为繁琐的操作 DQL语句很重要很重要 初始化数据库和表 USE dduo;create table tb_emp(id int unsigned primary key auto_increment comment ID,username varchar(20) not null unique comment…

大语言模型中的第一性原理:Scaling laws

大语言模型的尺度定律在大语言模型的训练过程中起到了非常重要的作用。即使读者不参与大语言模型的训练过程&#xff0c;但了解大语言模型的尺度定律仍然是很重要的&#xff0c;因为它能帮助我们更好的理解未来大语言模型的发展路径。 1. 什么是尺度定律 尺度定律&#xff08…

stamps做sbas-insar,时序沉降图怎么画?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

【跟我学RISC-V】(二)RISC-V的基础知识学习与汇编练习

写在前面&#xff1a; 这篇文章是跟我学RISC-V的第二期&#xff0c;是第一期的延续&#xff0c;第一期主要是带大家了解一下什么是RISC-V,是比较大体、宽泛的概念。这一期主要是讲一些基础知识&#xff0c;然后进行RISC-V汇编语言与c语言的编程。在第一期里我们搭建了好几个环…

WPF之绑定验证(错误模板使用)

1&#xff0c;前言&#xff1a; 默认情况下&#xff0c;WPF XAML 中使用的绑定并未开启绑定验证&#xff0c;这样导致用户在UI上对绑定的属性进行赋值时即使因不符合规范内部已抛出异常&#xff08;此情况仅限WPF中的数据绑定操作&#xff09;&#xff0c;也被程序默认忽略&…

4.【Orangepi Zero2】Linux定时器(signal、setitimer),软件PWM驱动舵机(SG90)

Linux定时器&#xff08;signal、setitimer&#xff09;&#xff0c;软件PWM驱动舵机&#xff08;SG90&#xff09; signalsetitimer示例 软件PWM驱动舵机&#xff08;SG90&#xff09; signal 详情请看Linux 3.进程间通信&#xff08;shmget shmat shmdt shmctl 共享内存、si…

【计算机网络】循环冗余校验:Cyclic Redundancy Check

1. 任务目标 利用循环冗余校验&#xff08;CRC&#xff09;检测错误。 循环冗余校验&#xff08;英语&#xff1a;Cyclic redundancy check&#xff0c;通称 CRC&#xff09;是一种根据网上数据包或计算机文件等数据产生简短固定位数校验码的一种散列函数&#xff0c;主要用来…

智慧文旅展现文化新风貌,科技助力旅行品质升级:借助智慧技术,文旅产业焕发新生机,为旅行者带来更高品质的文化体验之旅

一、引言 在数字化、智能化的浪潮下&#xff0c;文旅产业正迎来前所未有的发展机遇。智慧文旅作为文旅产业与信息技术深度融合的产物&#xff0c;不仅为旅行者带来了全新的文化体验&#xff0c;也为文旅产业注入了新的活力。本文旨在探讨智慧文旅如何借助智慧技术展现文化新风…

C++:二叉搜索树的底层模拟实现

概念&#xff1a; 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树&#xff1a; 搜索二叉树的操作&#xff1a; int a[] {8, 3, 1, 10, 6, 4, 7, 14, 13};二叉搜索树需要满足左子树比根小&#xff0c;右子树比根大&#xff0c;…

Leetcode—1235. 规划兼职工作【困难】(upper_bound、自定义排序规则)

2024每日刷题&#xff08;125&#xff09; Leetcode—1235. 规划兼职工作 算法思想 实现代码 class Solution { public:int jobScheduling(vector<int>& startTime, vector<int>& endTime, vector<int>& profit) {int n startTime.size();vec…

循环神经网络完整实现(Pytorch 13)

一 循环神经网络的从零开始实现 从头开始基于循环神经网络实现字符级语言模型。 %matplotlib inline import math import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2lbatch_size, num_steps 32, 35 train_iter, vocab …

(六)SQL系列练习题(下)#CDA学习打卡

目录 三. 查询信息 16&#xff09;检索"1"课程分数小于60&#xff0c;按分数降序排列的学生信息​ 17&#xff09;*按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩 18&#xff09;*查询各科成绩最高分、最低分和平均分 19&#xff09;*按各科成绩…

PHP 反序列化

一、PHP 序列化 1、对象的序列化 <?php class people{public $nameGaming;private $NationLiyue;protected $Birthday12/22;public function say(){echo "老板你好呀&#xff0c;我是和记厅的镖师&#xff0c;叫我嘉明就行&#xff0c;要运货吗你&#xff1f;"…

手机恢复出厂设置ip地址会变吗

当我们对手机进行恢复出厂设置时&#xff0c;很多人会担心手机的IP地址是否会发生变化。IP地址对于手机的网络连接至关重要&#xff0c;它决定了手机在网络中的身份和位置。那么&#xff0c;手机恢复出厂设置后&#xff0c;IP地址到底会不会发生变化呢&#xff1f;虎观代理小二…

Jenkins docker部署springboot项目

1、创建jenkins容器 1&#xff0c;首先&#xff0c;我们需要创建一个 Jenkins 数据卷&#xff0c;用于存储 Jenkins 的配置信息。可以通过以下命令创建一个数据卷&#xff1a; docker volume create jenkins_data启动 Jenkins 容器并挂载数据卷&#xff1a; docker run -dit…

Python量化择时的技术指标函数

Python量化择时的技术指标函数 技术指标通过对原始数据&#xff08;开盘价、收盘价、最低价、最高价、成交量、成交金额、成交笔数&#xff09;的处理&#xff0c;来反映出市场的某一方面深层的内涵&#xff0c;这些内涵是很难通过原始数据直接看出来的。技术指标能客观地反映…
最新文章