云时代【4】—— 资源隔离与控制技术
- 二、资源隔离与控制技术
- (一)NameSpace
- 1. 基本介绍
- 2. 相关 Linux 指令
- 实战1:隔离进程
- 实战2:隔离文件系统
- (二)CGroups
- 1. 基本介绍
- 2. 相关 Linux 指令
- 实战1:cgroups 信息查看
- 实战2:使用 cgroups 对内存进行控制
- 实战3:使用 cgroups 对 cpu 进行控制
二、资源隔离与控制技术
创建好虚拟机之后,查看 虚拟机 自身的信息
# 该指令是 两个指令的合体
cat /etc/*release*
(一)NameSpace
1. 基本介绍
NameSpace 是 Linux 内核用来隔离内核资源的方式。通过 namespace 可以让一些进程只能看到与自己相关的一部分资源,而另外一些进程也只能看到与它们自己相关的资源,这两拨进程根本就感觉不到对方的存在。
Linux namespaces 是对全局系统资源的一种封装隔离,使得处于不同 namespace 的 进程拥有独立的全局系统资源,改变一个 namespace 中的系统资源只会影响当前 namespace 里的进程,对其他 namespace 中的进程没有影响。
2. 相关 Linux 指令
(1)dd – 复制文件,根据操作数进行转换和格式化
dd if=/dev/zero of=test.img bs=8k count=1024
# /dev/zero 产生连续不断的空白字符流
**(2)mkfs – **Make a Linux filesystem.
mkfs -t ext4 ./test.img
(3)df – 查看文件系统的相关信息
Show information about the file system on which each FILE resides, or all file systems by default.
df
df -a # -a, --all 查看所有具有 0Bloeks 的文件系统
df -h # 人类可读的格式
df -t tmpfs # 列出 tmpfs 类型的文件系统
df -T # 现实文件系统的形式
**(4)unshare – **与父进程进行命名空间的隔离
ll /proc
# /proc 是一个虚拟文件系统
unshare -u /bin/bash # 不共享用户的命名空间
hostname test
hostname # 通过hostname,可以唯一地标识计算机的位置
(5)mount – Mount a filesystem
挂载就是:文件的入口
dd if=/dev/zero of=test.img bs=8k count=1024
mkfs -t ext4 ./test.img
# -t 知道文件系统类型
mount ./test.img /data/testmount
cd /data/testmymount
echo "hello world" > text.txt
ll -h
cat text.txt
实战1:隔离进程
**Q1:需要指定子进程 **
当直接 -p
之后 /bin/bash
进程 与 父进程完成资源隔离。内部的/bin/bash
进程没有自己的父进程,且无法看到外部的父进程,因此报错。
unshare -p /bin/bash
Q2:当执行ps -ef
时发现 PID 依然可以查看到。原因是:**ll /proc**
** 下有全部的进程,因此需要提前把 **/proc**
挂载过去**
unshare -p --fork /bin/bash
unshare -p --fork --mount-proc /bin/bash
ls -l /proc
ps -ef
# ps 是“process status”的缩写,它用于显示当前系统上运行的进程的状态信息。
# -e参数表示显示所有进程,
# -f参数表示全格式显示。
实战2:隔离文件系统
mkdir -p /data/mymount
unshare --mount --fork /bin/bash
dd if=/dev/zero of=/data.img bs=8k count=10240
mkfs -t ext4 ./data.img
df -h
mount -t ext4 ./data.img /data/mymount
hostname
df -h
(二)CGroups
1. 基本介绍
CGroups(Control Groups)是 linux 内核提供的一种机制,这种机制可以根据需求把一系列系统任务及其子任务整合(或分隔)到按资源划分等级的不同组内,从而为系统资源管理提供统一的框架。简单说,CGroups 可以限制、记录任务组所使用的物理资源。本质上来说,cgroups 是内核附加在程序上的一系列钩子(hook),通过程序运行时对资源的调度触发相应的钩子以达到资源追踪和限制的目的。
2. 相关 Linux 指令
**(1)pidstat – **查看各种资源信息
pidstat -u # 显示各个进程CPU使用情况(-u 为默认参数)
pidstat -r # 现实各进程的内存使用情况
pidstat -d # 显示各进程的 IO 使用情况
pidtest -p 1480 # 显示该进程号的资源使用情况
pidtstat -p 1480
pidstat -r -p 1480
pidstat -d -p 1480
**(2)stress – **压力工具
stress -c 1 # 产生N个进程,每个进程循环调用 sqrt函数 产生CPU压力
stress -i 1 # 产生N个进程,每个进程循环调用sync将内存缓冲区内容写到磁盘上,产生IO压力。
# 通过系统调用sync刷新内存缓冲区数据到磁盘中,以确保同步。
# 如果缓冲区内数据较少,写到磁盘中的数据也较少,不会产生IO压力。
# 在SSD磁盘环境中尤为明显,很可能iowait总是0,却因为大量调用系统调用sync,导致系统CPU使用率sys升高。
stress -m 1 --vm-bytes 50m
# -m : 产生N个进程,每个进程循环调用malloc/free函数分配和释放内存。
# --vm-bytes B : 指定分配内存的大小
stress -d 1 # N:产生N个不断执行write和unlink函数的进程(创建文件,写入内容,删除文件)
stress -d 1 -t 3
# -t : 在N秒后结束程序
stress -d 1 -t 3 -q
# -q : 程序在运行的过程中不输出信息
实战1:cgroups 信息查看
cat /proc/filesystems | cg
cat /proc/cgroups
mount | grep cgroup
ll /sys/fs/cgroup/cpu,cpuacct
查看一个进程上的 cgroup 限制
# $$ 代表当前进程的PID
cat /proc/$$/cgroup
mount | grep cgroup
# 控制组下的cpu文件 /sys/fs/cgroup/cpu,cpuacct
# 具体进程的cpu控制文件位置 /user.slice
ll /sys/fs/cgroup/cpu,cpuacct/user.slice
实战2:使用 cgroups 对内存进行控制
mount | grep cgroups
cd /sys/fs/cgroup/memory
ll
mkdir test-memlimit
cd /test-memlimit
ls -l # 自动将配置信息初始化好
echo "20971520" > memory.limit_in_bytes
cat memory.limit_in_bytes
stress -m 1 --vm-bytes 50m
pidstat -C stress -P ALL -r 2 100000
echo "xxxx" > tasks
实战3:使用 cgroups 对 cpu 进行控制
cd /sys/fs/cgroup/cpu,cpuacct
mkdir test-cpulimit
ll
stress -c 1
pidstat -u -C stress -p ALL 1 100000
cat cpu.cfs_period_us
cat cpu.cfs_quota_us
echo "20000" > cpu.cfs_quota_us
cat cpu.cfs_quota_us
echo "xxxxx" > tasks