一、cgroup和namespace区别
Namespace | Cgroup | |
---|---|---|
功能 | 资源隔离 | 资源限制 |
作用范围 | 进程及资源 | 资源的使用限制 |
实现方式 | Linux 内核提供的机制 | Linux 内核提供的机制 |
-
Namespace 是 Linux 内核提供的一种资源隔离机制,它可以将一组进程和资源隔离开来,使它们在不同的命名空间中运行,互相之间不受影响。在 Kubernetes 中,namespace 用于将集群的各种资源(如 Pod、Deployment、Service 等)分组到不同的命名空间中,以便更好地进行管理和隔离。
-
Cgroup(Control Group) 是 Linux 内核提供的一种资源限制机制,它可以对一组进程的资源使用进行限制,如 CPU、内存、磁盘等。在 Kubernetes 中,cgroup 用于限制容器的资源使用,确保它们在运行时不会超出预定的资源范围。
二、Namespace
[root@node1 ~]# nsenter -h
用法:
nsenter [options] <program> [<argument>...]
选项:
-t, --target <pid> 要获取名字空间的目标进程
-m, --mount[=<file>] enter mount namespace
-u, --uts[=<file>] enter UTS namespace (hostname etc) #UTS命名空间,用于隔离nodename和domainname
-i, --ipc[=<file>] enter System V IPC namespace #IPC命名空间,用于隔离System V IPC和POSIX消息队列
-n, --net[=<file>] enter network namespace
-p, --pid[=<file>] enter pid namespace
-U, --user[=<file>] enter user namespace
demo:
-
第一步,找到对应容器的CONTAINER Id
crictl ps
-
第二步,找到容器对应的进程id
crictl inspect ${CONTAINER} |grep pid
-
第三步,进入namespace
nsenter -n -t ${pid}
三、Cgroup
功能:
- 限制进程组可以使用的资源数量(Resource limiting )。比如:memory子系统可以为进程组设定一个memory使用上限,一旦进程组使用的内存达到限额再申请内存,就会出发OOM(out of memory)。
- 进程组的优先级控制(Prioritization )。比如:可以使用cpu子系统为某个进程组分配特定cpu share。
- 记录进程组使用的资源数量(Accounting )。比如:可以使用cpuacct子系统记录某个进程组使用的cpu时间
- 进程组隔离(Isolation)。比如:使用ns子系统可以使不同的进程组使用不同的namespace,以达到隔离的目的,不同的进程组有各自的进程、网络、文件系统挂载空间。
- 进程组控制(Control)。比如:使用freezer子系统可以将进程组挂起和恢复。
- **cgroup:**cgroup和subsystem的一组关系
- subsystem: 内核模块,cpu、内存都属于一种子系统
- hierarchy: 层级,每种子系统对应的cgroup组成的一种树状结构,子cgroup继承父cgroups属性
[root@node1 cgroup]# cat /proc/cgroups
#subsys_name hierarchy num_cgroups enabled
cpuset 3 228 1
cpu 2 702 1
cpuacct 2 702 1
memory 7 699 1
devices 4 699 1
freezer 6 228 1
net_cls 9 228 1
blkio 10 699 1
perf_event 11 228 1
hugetlb 8 228 1
pids 5 699 1
net_prio 9 228 1
测试demo:
-
测试程序,跑满两个cpu
package main import ( "fmt" "os" ) func main() { fmt.Println(os.Getpid()) go func() { for {} }() for {} }
-
在/sys/fs/cgroup/cpu下创建一个测试目录,目录创建后会自动生成以下文件
[root@node1 test]# pwd /sys/fs/cgroup/cpu/test [root@node1 test]# ll 总用量 0 -rw-r--r-- 1 root root 0 6月 12 17:24 cgroup.clone_children --w--w--w- 1 root root 0 6月 12 17:24 cgroup.event_control -rw-r--r-- 1 root root 0 6月 13 16:53 cgroup.procs #线程组id -r--r--r-- 1 root root 0 6月 12 17:24 cpuacct.stat -rw-r--r-- 1 root root 0 6月 12 17:24 cpuacct.usage -r--r--r-- 1 root root 0 6月 12 17:24 cpuacct.usage_percpu -rw-r--r-- 1 root root 0 6月 12 17:24 cpu.cfs_period_us #时间片,默认100000 -rw-r--r-- 1 root root 0 6月 13 16:48 cpu.cfs_quota_us #限制使用的cpu比率,如果想要限制使用50%,则输入50000,如果限制200%,则输入200000 -rw-r--r-- 1 root root 0 6月 12 17:24 cpu.rt_period_us -rw-r--r-- 1 root root 0 6月 12 17:24 cpu.rt_runtime_us -rw-r--r-- 1 root root 0 6月 12 17:24 cpu.shares -r--r--r-- 1 root root 0 6月 12 17:24 cpu.stat #线程id -rw-r--r-- 1 root root 0 6月 12 17:24 notify_on_release -rw-r--r-- 1 root root 0 6月 12 17:24 tasks
-
将第一步运行的测试程序启动,拿到pid,记录到cgroup.procs中
echo ${pid} > cgroup.procs
-
修改需要限制的核数,这里限制只能使用1.5核,不做限制则会跑满2核
echo 150000 > cgroup.procs
-
通过top命令,可以看到对应的pid占用的cpu会在150%左右浮动