【Docker】0.空间资源隔离
NameSpace
dd + option : 可以从标准输入或文件中读取数据,根据指定格式来转换数据,再输出到文件、设备或标准输出 --help 显示帮助信息 --version 显示版本信息 if=文件名(输出文件名,默认标准输入) 源文件 of=文件名(输出文件名,默认标准输出) 目的文件 ibs=bytes 一次读取bytes个字节 obs=bytes 一次输出bytes个字节 bs=bytes 同时设置ibs和obs cbs=bytes 一次转换bytes个字节 skip=blocks 从输入文件开头跳过blocks个块后开始复制 seek=blocks 从输出文件开头跳过blocks个块后开始复制 count=blocks 拷贝blocks个块,块大小等于ibs指定的字节数 conv=<关键字> ▪ conversion:用指定的参数转换文件。 ▪ ascii:转换 ebcdic 为 ascii ▪ ebcdic:转换 ascii 为 ebcdic ▪ ibm:转换 ascii 为 alternate ebcdic ▪ block:把每一行转换为长度为 cbs,不足部分用空格填充 ▪ unblock:使每一行的长度都为 cbs,不足部分用空格填充 ▪ lcase:把大写字符转换为小写字符 ▪ ucase:把小写字符转换为大写字符 ▪ swap:交换输入的每对字节 ▪ noerror:出错时不停止 ▪ notrunc:不截短输出文件 ▪ sync:将每个输入块填充到 ibs 个字节,不足部分用空(NUL)字符补齐。 @example # 从/dev/zero 中读取10240 8k的page到fdimage.img中 dd if=/dev/zero of=fdimage.img bs=8k count=10240 # 将testfile 文件中的英文字母转换成大写,并输出到testfile_1文件中 dd if=testfile_2 of=testfile_1 conv=ucase mkfs [-V][-t fstype][fs-options] filesys [blocks] : 格式化文件 @example # 格式化镜像文件ext4 mkfs -t ext4 ./data1.img df [option]...[file](disk free 磁盘空间)显示Linux系统上的文件系统磁盘使用情况 * -a(all) 包含所有具有0 Blocks的文件系统 * -h(human-readable) * -H(单位1000) * --type=TYPE(指定文件系统TYPE) * -T 显示文件系统的形式 @example df -h 查看磁盘使用情况 df -Th 查看磁盘的系统类型 mount命令:可以用于加载文件系统到指定加载点。常用于挂载关盘,使我们可以访问光盘中的数据。因为关盘插入光驱中,Linux并不会自动进行挂载,必须使用Linux mount命令手动完成挂载 Linux系统不同目录下可以挂载不同分区和磁盘设备,它的目录和磁盘分区时分离的,可以自由组合 不同目录数据可以跨越不同磁盘分区或者不同磁盘设备 挂载的本质就是为磁盘添加入口(挂载点) @example mount [-l] 显示已经加载的文件系统 mount [-t vfstype] [-o options] device dir -t指定文件系统类型,可以不指定,会自动识别 # 将镜像挂载到/mnt/test4下面,确保挂载点也就是目录存在 mount ./fdimage.img /mnt/test4 unshare 主要能力是使用父进程不共享的名称空间运行程序 unshare [options] program [arguments] 这里主要介绍几个重要参数 -m,--mount 不共享mount空间,父进程不能看到该命名空间中的mount空间 --fork 执行unshare递达进程fork一个新的子进程,再子进程中执行unshare传入的参数 --mount-proc 执行子进程前,将proc优先挂载过去 @example unshare -u /bin/bash 用户隔离 unshare --fork --pid --mount-proc /bin/bash PID隔离 *** 注意: 1、--fork 新建一个bash进程,如果不新建进程,新的namespace就会使用unshare的PID作为新的空间的父进程,而unshare进程并不在新的namespace中,所以会报Cannot allocate memory 2、mount-proc 是因为Linux下每个进程都有一个对应的/proc/PID目录,该目录中包含大量当前进程的信息,对一个PID namespace 而言。创建一个新的PID namespace后,如果向让子进程中ll、to等指令依赖/proc文件系统的命令工作,需要挂载/proc文件系统。而文件系统隔离是mount namespace管理的,所以Linux特意提供了一个选项--mount-proc来解决这个问题。如果不带这个我们看到的进程还是系统的进程信息
NameSpace Actual Conbat
[root@VM-20-6-centos data]# df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 1.8G 0 1.8G 0% /dev tmpfs 1.9G 24K 1.9G 1% /dev/shm tmpfs 1.9G 3.9M 1.9G 1% /run tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup /dev/vda1 59G 23G 34G 41% / tmpfs 370M 0 370M 0% /run/user/0 tmpfs 370M 0 370M 0% /run/user/1001 /dev/loop0 6.8M 77K 6.2M 2% /data/testmymount
打开一个新的shell窗口,执行mount隔离命令
[root@VM-20-6-centos ~]# unshare --mount --fork /bin/bash #表示创建子进程并隔离mount命名空间 [root@VM-20-6-centos ~]# mkdir -p /data/tmpmount
添加新的磁盘挂载,并添加文件
[root@VM-20-6-centos ~]# cd /data/tmpmount/ [root@VM-20-6-centos ~]# dd if=/dev/zero of=fdimage.img bs=8k count=10240 [root@VM-20-6-centos tmpmount]# mount ./fdimage.img /data/tmpmount [root@VM-20-6-centos tmpmount]# echo "hello world" > test.txt
分别在两个窗口中查看挂载信息,并查看文件。可以观察到两者观察到的目录内文件并不相同,说明我们实现了文件系统的隔离
[root@VM-20-6-centos tmpmount]# df -h Filesystem Size Used Avail Use% Mounted on /dev/vda1 59G 23G 34G 41% / devtmpfs 1.8G 0 1.8G 0% /dev tmpfs 1.9G 24K 1.9G 1% /dev/shm tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup tmpfs 1.9G 3.9M 1.9G 1% /run tmpfs 370M 0 370M 0% /run/user/0 tmpfs 370M 0 370M 0% /run/user/1001 /dev/loop0 6.8M 77K 6.2M 2% /data/testmymount /dev/loop1 74M 1.6M 67M 3% /data/tmpmount [root@VM-20-6-centos tmpmount]# ll total 4492 -rw-r--r-- 1 root root 83886080 May 25 19:38 fdimage.img -rw-r--r-- 1 root root 12 May 25 19:35 test.txt [root@VM-20-6-centos tmpmount]# ll total 13 drwx------ 2 root root 12288 May 25 19:34 lost+found -rw-r--r-- 1 root root 12 May 25 19:38 test.txt
CGroups
pidstat 是sysstat的一个命令,用于监控全部或指定进程的CPU、内存、线程、设备IO等系统资源的占用情况,用户可以通过指定的统计次数和时间来获得所需的统计信息 pidstat [option][<time interval>][<times>] # 安装: yum install sysstat -y # 卸载: yum remove sysstat -y @example pidstat -C stress -p ALL -u 2 100000 # 每两秒监控stress命令全部进程cpu使用,监视100000次 stress 是Linux的一个压力测试工具,可以对CPU、Memory、IO、磁盘等进行压力测试 stress [OPTION[ARG]] -c --cpu N :产生N个进程,每个进程都训话你调用sqrt函数压力CPU -i --io N :产生N个进程,每个进程循环调用sync将内存缓冲区内容写道磁盘上,产生IO压力 -m --vm N :产生N个进程,每个进程频繁调用malloc/free来分配释放内存
查看cgroups版本
[root@VM-20-6-centos tmpmount]# cat /proc/filesystems | grep cgroup nodev cgroup
cgroups子系统查看
[root@VM-20-6-centos tmpmount]# cat /proc/cgroups #subsys_name hierarchy num_cgroups enabled cpuset 5 2 1 cpu 2 186 1 cpuacct 2 186 1 memory 4 186 1 devices 7 167 1 freezer 3 2 1 net_cls 6 2 1 blkio 11 167 1 perf_event 8 2 1 hugetlb 10 2 1 pids 9 167 1 net_prio 6 2 1
cgroups挂载信息查看
[root@VM-20-6-centos tmpmount]# ls /sys/fs/cgroup blkio cpuacct cpuset freezer memory net_cls,net_prio perf_event systemd cpu cpu,cpuacct devices hugetlb net_cls net_prio pids
查看一个进程上cgroup限制
# 以当前shell进程为例,查看进程cgrouup [root@VM-20-6-centos tmpmount]# cat /proc/$$/cgroup 11:blkio:/user.slice 10:hugetlb:/ 9:pids:/user.slice 8:perf_event:/ 7:devices:/user.slice 6:net_prio,net_cls:/ 5:cpuset:/ 4:memory:/user.slice 3:freezer:/ 2:cpuacct,cpu:/user.slice 1:name=systemd:/user.slice/user-1001.slice/session-1217342.scope # 可以组合mount | grep cgroup 来查找控制信息 [root@VM-20-6-centos 7058]# mount | grep cgroup tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755) cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd) cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu) cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer) cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory) cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset) cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_prio,net_cls) cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices) cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event) cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids) cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb) cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio) [root@VM-20-6-centos 7058]# ll /sys/fs/cgroup/cpu,cpuacct/user.slice total 0 -rw-r--r-- 1 root root 0 May 17 17:22 cgroup.clone_children --w--w--w- 1 root root 0 May 17 17:22 cgroup.event_control -rw-r--r-- 1 root root 0 May 17 17:22 cgroup.procs -r--r--r-- 1 root root 0 May 17 17:22 cpuacct.stat -rw-r--r-- 1 root root 0 May 17 17:22 cpuacct.usage -r--r--r-- 1 root root 0 May 17 17:22 cpuacct.usage_percpu -rw-r--r-- 1 root root 0 May 17 17:22 cpu.cfs_period_us # CPU总时间片 -rw-r--r-- 1 root root 0 May 17 17:22 cpu.cfs_quota_us # 该进程占用时间片 -1代表不受cgroup控制 -rw-r--r-- 1 root root 0 May 17 17:22 cpu.rt_period_us -rw-r--r-- 1 root root 0 May 17 17:22 cpu.rt_runtime_us -rw-r--r-- 1 root root 0 May 17 17:22 cpu.shares -r--r--r-- 1 root root 0 May 17 17:22 cpu.stat -rw-r--r-- 1 root root 0 May 17 17:22 notify_on_release -rw-r--r-- 1 root root 0 May 17 17:22 tasks
Cgroup Control Memory
[root@VM-20-6-centos 7058]# mount | grep cgroup # 找到控制内存信息的文件 tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755) cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd) cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu) cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer) cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory) # 这个 cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset) cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_prio,net_cls) cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices) cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event) cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids) cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb) cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio) [root@VM-20-6-centos 7058]# cd /sys/fs/cgroup/memory [root@VM-20-6-centos memory]# mkdir test_memlimit # 系统会为我们自动配置文件 [root@VM-20-6-centos test_memlimit]# ls # 重点关注limit_in_bytes空间上线 和 tasks(任务) cgroup.clone_children memory.kmem.tcp.max_usage_in_bytes memory.oom_control cgroup.event_control memory.kmem.tcp.usage_in_bytes memory.pressure_level cgroup.procs memory.kmem.usage_in_bytes memory.soft_limit_in_bytes memory.failcnt memory.limit_in_bytes memory.stat memory.force_empty memory.max_usage_in_bytes memory.swappiness memory.kmem.failcnt memory.memsw.failcnt memory.usage_in_bytes memory.kmem.limit_in_bytes memory.memsw.limit_in_bytes memory.use_hierarchy memory.kmem.max_usage_in_bytes memory.memsw.max_usage_in_bytes notify_on_release memory.kmem.slabinfo memory.memsw.usage_in_bytes tasks memory.kmem.tcp.failcnt memory.move_charge_at_immigrate memory.kmem.tcp.limit_in_bytes memory.numa_stat [root@VM-20-6-centos test_memlimit]# cat memory.limit_in_bytes # 可以看到内存是不上限的 9223372036854771712 [root@VM-20-6-centos test_memlimit]# echo "20971520" > memory.limit_in_bytes # 将其设置为20M [root@VM-20-6-centos test_memlimit]# cat memory.limit_in_bytes 20971520
新建两个终端进行压力测试
# 终端1 [clx@VM-20-6-centos test_memlimit]$ stress -m 1 --vm-bytes 50m stress: info: [1851] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd stress: FAIL: [1851] (415) <-- worker 1852 got signal 9 stress: WARN: [1851] (417) now reaping child worker processes # 压力测试退出 stress: FAIL: [1851] (451) failed run completed in 139s # 终端2 08:30:29 PM UID PID minflt/s majflt/s VSZ RSS %MEM Command 08:30:31 PM 1001 1851 0.00 0.00 10428 456 0.01 stress 08:30:31 PM 1001 1852 244557.00 0.00 61632 11324 0.30 stress 08:30:31 PM UID PID minflt/s majflt/s VSZ RSS %MEM Command 08:30:33 PM 1001 1851 0.00 0.00 10428 456 0.01 stress 08:30:33 PM 1001 1852 240434.00 0.00 61632 29280 0.77 stress # 此时在终端0中将 1852 移入tasks中,压力测试立马退出 08:30:33 PM UID PID minflt/s majflt/s VSZ RSS %MEM Command
Cgroup Control CPU
[clx@VM-20-6-centos test_memlimit]$ mount | grep cgroup tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755) cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd) cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu) # 这个 cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer) cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory) cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset) cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_prio,net_cls) cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices) cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event) cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids) cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb) cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio) [root@VM-20-6-centos test_memlimit]# cd /sys/fs/cgroup/cpu,cpuacct [root@VM-20-6-centos cpu,cpuacct]# cat cpu.cfs_period_us # 默认带宽,单位为微秒 100000 [root@VM-20-6-centos cpu,cpuacct]# cat cpu.cfs_quota_us # 目前不受cgroup控制 -1 [root@VM-20-6-centos cpu,cpuacct]# mkdir test_cpu [root@VM-20-6-centos cpu,cpuacct]# cd test_cpu [root@VM-20-6-centos test_cpu]# echo "20000" > cpu.cfs_quota_us [root@VM-20-6-centos test_cpu]# cat cpu.cfs_quota_us # 设置CPU占用率为20% 20000
新建两个终端进行压力测试
# 终端1 [root@VM-20-6-centos tmpmount]# stress --cpu 1 stress: info: [7206] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd # 终端2 [root@VM-20-6-centos tmpmount]# pidstat -C stress -p ALL -u 2 10000 # 开始7207进程CPU使用率接近100% 09:58:14 AM UID PID %usr %system %guest %CPU CPU Command 09:58:16 AM 0 7206 0.00 0.00 0.00 0.00 1 stress 09:58:16 AM 0 7207 97.50 0.00 0.00 97.50 0 stress 09:58:16 AM UID PID %usr %system %guest %CPU CPU Command 09:58:18 AM 0 7206 0.00 0.00 0.00 0.00 1 stress 09:58:18 AM 0 7207 81.50 0.50 0.00 82.00 1 stress # 将7207进程写入到tasks中,可以看到该进程的CPU使用率最高只有20%了 09:58:18 AM UID PID %usr %system %guest %CPU CPU Command 09:58:20 AM 0 7206 0.00 0.00 0.00 0.00 1 stress 09:58:20 AM 0 7207 20.00 0.00 0.00 20.00 1 stress # 终端0 [root@VM-20-6-centos test_cpu]# cat tasks; [root@VM-20-6-centos test_cpu]# echo "7207" > tasks
总结:docker的本质就是调用这些API来完成对资源的管理的,但docker的易用性和镜像的设计更加人性化
https://blog.csdn.net/m0_69442905/article/details/131097450
本文系转载,版权归原作者所有,如若侵权请联系我们进行删除!
云掣基于多年在运维领域的丰富时间经验,编写了《云运维服务白皮书》,欢迎大家互相交流学习:
《云运维服务白皮书》下载地址:https://fs80.cn/v2kbbq
想了解更多大数据运维托管服务、数据库运维托管服务、应用系统运维托管服务的的客户,欢迎点击云掣官网沟通咨询:https://yunche.pro/?t=shequ