一、什麼是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時需要注意合理分配資源,防止出現過度分配資源的問題。
原創文章,作者:VXDK,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/133271.html