cgroup&namespace

一、cgroup和namespace区别
NamespaceCgroup
功能资源隔离资源限制
作用范围进程及资源资源的使用限制
实现方式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

功能:

  1. 限制进程组可以使用的资源数量(Resource limiting )。比如:memory子系统可以为进程组设定一个memory使用上限,一旦进程组使用的内存达到限额再申请内存,就会出发OOM(out of memory)。
  2. 进程组的优先级控制(Prioritization )。比如:可以使用cpu子系统为某个进程组分配特定cpu share。
  3. 记录进程组使用的资源数量(Accounting )。比如:可以使用cpuacct子系统记录某个进程组使用的cpu时间
  4. 进程组隔离(Isolation)。比如:使用ns子系统可以使不同的进程组使用不同的namespace,以达到隔离的目的,不同的进程组有各自的进程、网络、文件系统挂载空间。
  5. 进程组控制(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:

  1. 测试程序,跑满两个cpu

    package main
    import (
    	"fmt"
    	"os"
    )
    func main() {
    	fmt.Println(os.Getpid())
    	go func() {
    		for {}
    	}()
    	for {}
    }
    
  2. 在/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 612 17:24 cgroup.clone_children
    --w--w--w- 1 root root 0 612 17:24 cgroup.event_control
    -rw-r--r-- 1 root root 0 613 16:53 cgroup.procs #线程组id
    -r--r--r-- 1 root root 0 612 17:24 cpuacct.stat
    -rw-r--r-- 1 root root 0 612 17:24 cpuacct.usage
    -r--r--r-- 1 root root 0 612 17:24 cpuacct.usage_percpu
    -rw-r--r-- 1 root root 0 612 17:24 cpu.cfs_period_us #时间片,默认100000
    -rw-r--r-- 1 root root 0 613 16:48 cpu.cfs_quota_us #限制使用的cpu比率,如果想要限制使用50%,则输入50000,如果限制200%,则输入200000
    -rw-r--r-- 1 root root 0 612 17:24 cpu.rt_period_us
    -rw-r--r-- 1 root root 0 612 17:24 cpu.rt_runtime_us
    -rw-r--r-- 1 root root 0 612 17:24 cpu.shares
    -r--r--r-- 1 root root 0 612 17:24 cpu.stat #线程id
    -rw-r--r-- 1 root root 0 612 17:24 notify_on_release
    -rw-r--r-- 1 root root 0 612 17:24 tasks
    
  3. 将第一步运行的测试程序启动,拿到pid,记录到cgroup.procs中

    echo ${pid} > cgroup.procs
    
  4. 修改需要限制的核数,这里限制只能使用1.5核,不做限制则会跑满2核

    echo 150000 > cgroup.procs
    
  5. 通过top命令,可以看到对应的pid占用的cpu会在150%左右浮动

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值