一、什么是cgroup
Cgroup,全称Control Group,是Linux内核提供的一种机制,用于在进程组中限制,记录和隔离各种系统资源(如CPU,内存,磁盘IO等)。Cgroup被广泛用于容器技术和系统性能调优中,通过Cgroup可以有效地限制不同组内指定进程的系统资源使用情况。
Cgroup根据目标资源不同可以被汇总到不同的子系统里,目前已经有cpu,memory,blkio,net_cls,freezer,devices等等子系统。
二、为什么需要使用cgroup
在大型服务器上运行多个互不干扰的应用程序或容器时,需要确保每个应用程序或容器都能够分配足够的系统资源,以保证正常运行。在此之前,通常使用的方法是像使用vmware这样的虚拟机来隔离内存,I/O,网络,CPU等资源。但是,这种方法通常较为笨重,启动和关闭每个虚拟机都需要一定的时间,并且会占用较多的物理资源和系统负载。
而Cgroup则是在物理系统的基础上,根据任务组提供的系统资源使用配额来控制进程使用资源的数量和进程使用资源的优先级。这种方法比虚拟机方式更灵活、更有效、更轻量,易于使用和管理。
三、如何在Linux中使用cgroup
1、创建cgroup
$ mkdir /sys/fs/cgroup/memory
在/sys/fs/cgroup/memory/路径下创建新的memory控制组,即创建了一个新的cgroup。
2、为cgroup分配系统资源
$ echo 40M > /sys/fs/cgroup/memory/myapp/memory.limit_in_bytes
将cgroup分配40MB内存的资源配额
3、将进程加入cgroup
$ echo $PID > /sys/fs/cgroup/memory/myapp/tasks
将PID为$PID的进程添加到myapp控制组中
4、查看cgroup内的进程
$ cat /sys/fs/cgroup/memory/myapp/tasks
显示myapp控制组内的所有进程PID,若有多个,则以换行符分隔。
四、cgroup的进阶用法
1、blkio控制组
可以通过blkio控制组限制磁盘I/O资源的使用。例如,以下命令将限制进程组内PID为$PID的进程的读写速度为8MB/s和4MB/s。
$ echo "8:0 $((8*1024*1024))" > /sys/fs/cgroup/blkio/myapp/blkio.throttle.write_bps_device $ echo "8:0 $((4*1024*1024))" > /sys/fs/cgroup/blkio/myapp/blkio.throttle.read_bps_device
2、cpuset控制组
通过cpuset控制组,可以将应用程序的进程绑定到指定的CPU核心上。例如,以下命令将此控制组内Pid为$PID的进程展示到CPU 0和1热土上:
$ echo "0,1" > /sys/fs/cgroup/cpuset/myapp/cpuset.cpus
3、net_cls控制组
通过net_cls控制组,可以将进程分配到指定的网络类别中,从而限制网络带宽。例如,以下命令将此控制组中pid为$PID的进程在网络端口上标记为"my_app_class":
$ echo 0x10001 > /sys/fs/cgroup/net_cls/myapp/net_cls.classid
4、cpu, memory控制组
通过cpu,memory 控制组,可以对应用程序或容器程序把CPU和内存的使用限制到指定大小。例如,以下命令将限制$cgroup内的所有进程占用的CPU时间为20%,内存配额为50MB:
$ echo 20 > /sys/fs/cgroup/cpu/myapp/cpu.cfs_quota_percentage $ echo 50M > /sys/fs/cgroup/memory/myapp/memory.limit_in_bytes
五、cgroup的应用场景
基于Cgroup,可以实现很多有趣的应用场景,如LXC容器,Docker容器,虚拟桌面,视频编码,负载均衡服务等等。其中,容器化技术应用最为广泛。通过Cgroup可以限制不同容器的应用程序使用系统资源的数量和优先级,从而为容器环境提供更加稳定、简单易维护的系统支持。
六、总结
通过Cgroup,我们可以很好地控制不同进程或容器的系统资源使用情况,从而实现系统资源的分配优化。Cgroup是一种轻量级的容器管理机制,与传统虚拟化技术相比具有更高的效率和灵活性。但是,在应用Cgroup时需要注意合理分配资源,防止出现过度分配资源的问题。