文章目录
- 五、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%的大小。
  
 
- 在会话 2 中可以观察到,压力测试进程的 cpu 的占用率,急速下降,来到了我们给设置的 30%的大小。
🥰如果本文对你有些帮助,欢迎👉 点赞 收藏 关注,你的支持是对作者大大莫大的鼓励!!(✿◡‿◡) 若有差错恳请留言指正~~