Linux 利用Cgroup 資源控制

来源:https://www.cnblogs.com/greatsql/archive/2022/08/26/16626469.html
-Advertisement-
Play Games

GreatSQL社區原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。 GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。 cgroups 是Linux內核提供的可以限制進程所使用資源的機制,可以對 cpu,記憶體等資源實現精細化的控制. 什麼是cgroups 控制族群(cgr ...


  • GreatSQL社區原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。
  • GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。

cgroups 是Linux內核提供的可以限制進程所使用資源的機制,可以對 cpu,記憶體等資源實現精細化的控制.

什麼是cgroups

  • 控制族群(cgroup) - 關聯一組task和一組subsystem的配置參數。一個task對應一個進程, cgroup是資源分片的最小單位。

  • 子系統(subsystem) - 資源管理器,一個subsystem對應一項資源的管理,如 cpu, cpuset, memory等

    1. cpu 子系統,主要限制 cpu 使用率。
    2. cpuacct 子系統,可以統計 cgroups 中的進程的 cpu 使用報告。
    3. cpuset 子系統,可以為 cgroups 中的進程分配單獨的 cpu 節點或者記憶體節點。
    4. memory 子系統,可以限制進程的 memory 使用量。
    5. blkio 子系統,可以限制進程的塊設備 io。
    6. devices 子系統,可以控制進程能夠訪問某些設備。
    7. net_cls 子系統,可以標記 cgroups 中進程的網路數據包,然後可以使用 tc 模塊(traffic control)對數據包進行控制。
    8. freezer 子系統,可以掛起或者恢復 cgroups 中的進程。
    9. ns 子系統,可以使不同 cgroups 下麵的進程使用不同的 namespace。
  • 層級(hierarchy) - 關聯一個到多個subsystem和一組樹形結構的cgroup. 和cgroup不同,hierarchy包含的是可管理的subsystem

    mount -t cgroup 可以查看當前已經掛載的子系統
    
  • 任務(task)- 每個cgroup都會有一個task列表文件tasks,一個task就對應一個進程。

cpu 子系統

cgroups的創建很簡單,只需要在相應的子系統下創建目錄即可。下麵我們到 cpu 子系統下創建測試文件夾:

1.創建cpu 系統的cgroup

/sys/fs/cgroup/cpu/ctest

執行完成創建就可以看到

root@moyu20:/sys/fs/cgroup/cpu/ctest# ls -l 
總用量 0
-rw-r--r-- 1 root root 0 7月  29 15:25 cgroup.clone_children
-rw-r--r-- 1 root root 0 7月  29 15:25 cgroup.procs
-r--r--r-- 1 root root 0 7月  29 15:25 cpuacct.stat
-rw-r--r-- 1 root root 0 7月  29 15:25 cpuacct.usage
-r--r--r-- 1 root root 0 7月  29 15:25 cpuacct.usage_all
-r--r--r-- 1 root root 0 7月  29 15:25 cpuacct.usage_percpu
-r--r--r-- 1 root root 0 7月  29 15:25 cpuacct.usage_percpu_sys
-r--r--r-- 1 root root 0 7月  29 15:25 cpuacct.usage_percpu_user
-r--r--r-- 1 root root 0 7月  29 15:25 cpuacct.usage_sys
-r--r--r-- 1 root root 0 7月  29 15:25 cpuacct.usage_user
-rw-r--r-- 1 root root 0 7月  29 15:25 cpu.cfs_period_us
-rw-r--r-- 1 root root 0 7月  29 15:25 cpu.cfs_quota_us
-rw-r--r-- 1 root root 0 7月  29 15:25 cpu.shares
-r--r--r-- 1 root root 0 7月  29 15:25 cpu.stat
-rw-r--r-- 1 root root 0 7月  29 15:25 cpu.uclamp.max
-rw-r--r-- 1 root root 0 7月  29 15:25 cpu.uclamp.min
-rw-r--r-- 1 root root 0 7月  29 15:25 notify_on_release
-rw-r--r-- 1 root root 0 7月  29 15:25 tasks

已經把cpu子系統 對應控制文件創建好了

2.創建進程加入cgroup

查看當前進程

root@moyu20:/sys/fs/cgroup/cpu/ctest# echo $$
1273114
root@moyu20:/sys/fs/cgroup/cpu/ctest# ps -aux|grep 1273114
root     1273114  0.0  0.0  13988  4944 pts/4    S    15:10   0:00 bash
root     1304325  0.0  0.0  12132  2512 pts/4    S+   15:35   0:00 grep --color=auto 1273114

將進程號添加到 tasks 中

echo $$ > tasks

查看task 會將當前bash 進行與所有子進程都放入tasks 中

root@moyu20:/sys/fs/cgroup/cpu/ctest# cat tasks 
1273114
1306199

3 驗證

製作一個耗時cpu 的進程

while true;do echo;done;

查看監控可以非常容易發現 cpu 跑滿了一個cpu

╰─○ top -p 1273114 
top - 15:40:21 up 23 days,  5:12,  1 user,  load average: 1.71, 1.36, 1.23
任務:   1 total,   1 running,   0 sleeping,   0 stopped,   0 zombie
%Cpu(s): 12.7 us, 12.0 sy,  0.0 ni, 75.2 id,  0.1 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :  15605.0 total,    971.2 free,  12135.4 used,   2498.4 buff/cache
MiB Swap:  15718.7 total,   1156.2 free,  14562.5 used.   2939.0 avail Mem 

 進程號 USER      PR  NI    VIRT    RES    SHR    %CPU  %MEM     TIME+ COMMAND                                   
1273114 root      20   0   13988   4944   3396 R 100.0   0.0   0:29.73 bash                                      

cgoups 利用 cpu.cfs_quota_us 與cfs_period_us 限制cpu 的頻率分配, 分配為 cfs_quota_us / cfs_period_us

限制分配0.25 個cpu

echo 25000 > cpu.cfs_quota_us 
while true;do echo;done;

再查看監控

╰─○ top -p 1273114 
top - 15:45:43 up 23 days,  5:17,  1 user,  load average: 1.28, 1.51, 1.36
任務:   1 total,   1 running,   0 sleeping,   0 stopped,   0 zombie
%Cpu(s):  7.1 us,  3.9 sy,  0.0 ni, 89.0 id,  0.1 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :  15605.0 total,    209.3 free,  11560.7 used,   3835.0 buff/cache
MiB Swap:  15718.7 total,    953.0 free,  14765.7 used.   3522.6 avail Mem 

 進程號 USER      PR  NI    VIRT    RES    SHR    %CPU  %MEM     TIME+ COMMAND                                   
1273114 root      20   0   13988   4944   3396 R  25.0   0.0   1:24.41 bash  

可以非常明顯看到了進程被限制最大使用 25% 了

同理可以創建 memory , blkio 等cgroup 用於限制系統資源

4.移除cgroup

退出tasks

╭─root@moyu20 /sys/fs/cgroup/cpu 
╰─# cgdelete cpu:ctest   

5.cgroup 在Docker 中的使用

docker 是目前常用容器,它就依賴cgroup 對資源進行限制

創建一個centos7 分配0.25 個cpu 與1g 記憶體

docker run  -itd  --name test7 -m 1g  --cpus 0.25  centos:7 bash

可以到

╰─○ docker inspect test7|more
[
    {
        "Id": "7d1d6b1865094f5e357f89f615dcdf57ce50954f6299d8a7aea41b4ca0cc73c8",
        "Created": "2022-07-28T09:29:30.247354976Z",

在宿主機上可以看到Docker 創建了容器相關的 cpu 的cgroup

root@moyu20:/sys/fs/cgroup/cpu/docker/7d1d6b1865094f5e357f89f615dcdf57ce50954f6299d8a7aea41b4ca0cc73c8$ ls
cgroup.clone_children  cpuacct.usage         cpuacct.usage_percpu_sys   cpuacct.usage_user  cpu.shares      cpu.uclamp.min
cgroup.procs           cpuacct.usage_all     cpuacct.usage_percpu_user  cpu.cfs_period_us   cpu.stat        notify_on_release
cpuacct.stat           cpuacct.usage_percpu  cpuacct.usage_sys          cpu.cfs_quota_us    cpu.uclamp.max  tasks

root@moyu20:/sys/fs/cgroup/cpu/docker/7d1d6b1865094f5e357f89f615dcdf57ce50954f6299d8a7aea41b4ca0cc73c8$ cat cpu.cfs_quota_us 
25000

進入容器在Docker 中

docker exec -it test7 bash
可以看到相同的目錄已經被 mount 到 /sys/fs/cgroup/cpu 下了
[root@7d1d6b186509 ~]# cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us 
25000

類似 top, free 等命令查看 /proc/ 目錄都是宿主機的信息
就會導致 free 的實際值並不准確

[root@7d1d6b186509 cpu]# while true;do echo;done; 

[root@7d1d6b186509 cpu]# free -g
              total        used        free      shared  buff/cache   available
Mem:             15          10           0           0           3           3
Swap:            15          14           0
[root@7d1d6b186509 /]# top

top - 08:03:26 up 23 days,  5:35,  0 users,  load average: 2.73, 1.83, 1.54
Tasks:   4 total,   1 running,   3 sleeping,   0 stopped,   0 zombie
%Cpu(s): 11.6 us,  2.2 sy,  0.0 ni, 86.0 id,  0.2 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem : 15979492 total,   392728 free, 11511792 used,  4074972 buff/cache
KiB Swap: 16095996 total,  1042540 free, 15053456 used.  3935784 avail Mem 

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                             
      1 root      20   0   11844    292     16 S   0.0  0.0   0:00.02 bash                                                                                                                                
     34 root      20   0   11820   2920   2516 S   0.0  0.0   0:19.85 bash                                                                                                                                
     55 root      20   0   11844   2968   2556 S   0.0  0.0   0:00.02 bash                                                                                                                                
     72 root      20   0   56212   3732   3176 R   0.0  0.0   0:00.00 top   

實際已經將分配的資源使用完了,但是在容器內這些命令並不能顯示正確的結果,實際顯示的宿主系統的資源使用情況,會對使用的情況產生誤導,需要註意

判斷進程是否屬於cgroup 可以通過 /proc//cgroup 進行判斷

[root@7d1d6b186509 ~]# cat /proc/1/cgroup 
13:hugetlb:/docker/7d1d6b1865094f5e357f89f615dcdf57ce50954f6299d8a7aea41b4ca0cc73c8
12:net_cls,net_prio:/docker/7d1d6b1865094f5e357f89f615dcdf57ce50954f6299d8a7aea41b4ca0cc73c8
11:freezer:/docker/7d1d6b1865094f5e357f89f615dcdf57ce50954f6299d8a7aea41b4ca0cc73c8
10:cpuset:/docker/7d1d6b1865094f5e357f89f615dcdf57ce50954f6299d8a7aea41b4ca0cc73c8
9:devices:/docker/7d1d6b1865094f5e357f89f615dcdf57ce50954f6299d8a7aea41b4ca0cc73c8
8:rdma:/docker/7d1d6b1865094f5e357f89f615dcdf57ce50954f6299d8a7aea41b4ca0cc73c8
7:memory:/docker/7d1d6b1865094f5e357f89f615dcdf57ce50954f6299d8a7aea41b4ca0cc73c8
6:misc:/
5:pids:/docker/7d1d6b1865094f5e357f89f615dcdf57ce50954f6299d8a7aea41b4ca0cc73c8
4:blkio:/docker/7d1d6b1865094f5e357f89f615dcdf57ce50954f6299d8a7aea41b4ca0cc73c8
3:perf_event:/docker/7d1d6b1865094f5e357f89f615dcdf57ce50954f6299d8a7aea41b4ca0cc73c8
2:cpu,cpuacct:/docker/7d1d6b1865094f5e357f89f615dcdf57ce50954f6299d8a7aea41b4ca0cc73c8
1:name=systemd:/docker/7d1d6b1865094f5e357f89f615dcdf57ce50954f6299d8a7aea41b4ca0cc73c8
0::/docker/7d1d6b1865094f5e357f89f615dcdf57ce50954f6299d8a7aea41b4ca0cc73c8

可以明顯看到這個進程被分配到docker 下的cgroup 中了

關於 GreatSQL

GreatSQL是由萬里資料庫維護的MySQL分支,專註於提升MGR可靠性及性能,支持InnoDB並行查詢特性,是適用於金融級應用的MySQL分支版本。

GreatSQL社區 Gitee GitHub Bilibili

GreatSQL社區

https://greatsql.cn/

技術交流群:

微信:掃碼添加GreatSQL社區助手微信好友,發送驗證信息加群

圖片


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • NCH Prism Plus for mac是一款Mac視頻格式轉換器,NCH Prism Plus mac版輕鬆轉換視頻!Prism轉換avi,mpg,vob,asf,wmv,mp4,amv以及所有具有基於DirectShow的編解碼器的視頻格,如果您可以使用Prism Plus mac版下載播放 ...
  • 未完待續...... 把一些有用的命令記錄下來,後期需要用到的時候就過來查詢吧。這篇文章沒啥營養,就當個字典用吧。 查看當前登錄用戶 w 查看登錄用戶數、IP、運行命令 查看進程 top 最常用的方法 查看所有進程 ps 兩個命令功能一樣的,寫法不一樣而已; ps aux # BSD操作系統格式 參 ...
  • Texpad是一個LaTeX編輯軟體,Texpad(現更名為 Texifier),Texpad 在與 LaTeX 同等的基礎上支持 Markdown,專為任何規模的項目的直接導航、編輯和排版而設計,使用 Texpad 內置的 TexpadTeX 排版機進行即時實時排版,並且Texpad 的編輯器具有 ...
  • 第一章 (p1-p10) 1、安裝環境 1、配置環境變數到/bin 2、創建my.ini.txt目錄 輸入內容:(直接複製) 【 client 】 port=3306 default-character-set=utf8 [mysqld] #設置為自己MYSQL的目錄 basedir=D:\AppG ...
  • ###前置條件:已安裝nodejs,安裝詳情可參考鏈接:https://www.cnblogs.com/zhen9436/p/16617383.html 1. cmd視窗安裝newman npm install -g newman 2. cmd視窗安裝newman-html報告 nnpm insta ...
  • 上一期我們介紹了幾種常見的構建鏡像方式,並給出了功能對比、決策樹等作為選型參考。本期我們將演示如何使用 Alpine 構建一個 Redis 鏡像。 Alpine 系統使用 apk 包管理工具,文中相關 apk 使用技巧不再贅述。 我們將構建鏡像 Dockerfile 中的幾個部分單獨講解,最後提供一 ...
  • 摘要:本文主要著重介紹資源池資源監控以及用戶資源監控。 本文分享自華為雲社區《GaussDB(DWS)資源監控之用戶、隊列資源監控》,作者: 一隻菜菜鳥。 GaussDB(DWS)資源監控功能包含實例資源監控、記憶體資源監控、資源池資源監控、查詢監控以及用戶資源監控,本文主要著重介紹資源池資源監控以及 ...
  • 1 背景 京東SRC(Security Response Center)收錄大量外部白帽子提交的sql註入漏洞,漏洞發生的原因多為sql語句拼接和Mybatis使用不當導致。 2 手工檢測 2.1 前置知識 mysql5.0以上版本中存在一個重要的系統資料庫information_schema,通過 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...