docker 容器基础技术
生活随笔
收集整理的這篇文章主要介紹了
docker 容器基础技术
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
點擊上方“朱小廝的博客”,選擇“設為星標”
回復”1024“獲取獨家整理的學習資料
作者:吳偉
原文鏈接:https://cizixs.com/2017/08/25/linux-cgroup/
- 資源限制:限制進程使用的資源上限,比如最大內存、文件系統緩存使用限制
- 優先級控制:不同的組可以有不同的優先級,比如 CPU 使用和磁盤 IO 吞吐
- 審計:計算 group 的資源使用情況,可以用來計費
- 控制:掛起一組進程,或者重啟一組進程
cgroups 核心概念
- task:任務,對應于系統中運行的一個實體,一般是指進程
- subsystem:子系統,具體的資源控制器(resource class 或者 resource controller),控制某個特定的資源使用。比如 CPU 子系統可以控制 CPU 時間,memory 子系統可以控制內存使用量
- cgroup:控制組,一組任務和子系統的關聯關系,表示對這些任務進行怎樣的資源管理策略
- hierarchy:層級樹,一系列 cgroup 組成的樹形結構。每個節點都是一個 cgroup,cgroup 可以有多個子節點,子節點默認會繼承父節點的屬性。系統中可以有多個 hierarchy
子資源系統(Resource Classes or SubSystem)
目前有下面這些資源子系統:- Block IO(blkio):限制塊設備(磁盤、SSD、USB 等)的 IO 速率
- CPU Set(cpuset):限制任務能運行在哪些 CPU 核上
- CPU Accounting(cpuacct):生成 cgroup 中任務使用 CPU 的報告
- CPU (CPU):限制調度器分配的 CPU 時間
- Devices (devices):允許或者拒絕 cgroup 中任務對設備的訪問
- Freezer (freezer):掛起或者重啟 cgroup 中的任務
- Memory (memory):限制 cgroup 中任務使用內存的量,并生成任務當前內存的使用情況報告
- Network Classifier(net_cls):為 cgroup 中的報文設置上特定的 classid 標志,這樣 tc 等工具就能根據標記對網絡進行配置
- Network Priority (net_prio):對每個網絡接口設置報文的優先級
- perf_event:識別任務的 cgroup 成員,可以用來做性能分析
Hierarchy
Linux 進程之間組成一棵樹的結構,每個進程(除了?init?根進程之外)都有一個父進程,子進程創建之后會繼承父進程的一些屬性(比如環境變量,打開的文件描述符等)。和進程模型類似,只不過 cgroups 是一個森林結構。使用 cgroups
cgroup 內核功能比較有趣的地方是它沒有提供任何的系統調用接口,而是對 linux vfs 的一個實現,因此可以用類似文件系統的方式進行操作。使用 cgroups 的方式有幾種:- 使用 cgroups 提供的虛擬文件系統,直接通過創建、讀寫和刪除目錄、文件來控制 cgroups
- 使用命令行工具,比如 libcgroup 包提供的 cgcreate、cgexec、cgclassify 命令
- 使用?rules engine daemon?提供的配置文件
- 當然,systemd、lxc、docker 這些封裝了 cgroups 的軟件也能讓你通過它們定義的接口控制 cgroups 的內容
直接操作 cgroup 文件系統
查看 cgroups 掛載信息
- tasks:當前 cgroup 包含的任務(task)pid 列表,把某個進程的 pid 添加到這個文件中就等于把進程移到該 cgroup
- cgroup.procs:當前 cgroup 中包含的 thread group 列表,使用邏輯和?tasks?相同
- notify_on_release:0 或者 1,是否在 cgroup 銷毀的時候執行 notify。如果為 1,那么當這個 cgroup 最后一個任務離開時(退出或者遷移到其他 cgroup),并且最后一個子 cgroup 被刪除時,系統會執行?release_agent?中指定的命令
- release_agent:需要執行的命令
創建 cgroup
刪除 cgroup
刪除子資源,就是刪除對應的目錄:設置 cgroup 參數
把進程加入到 cgroup
在 cgroup 中運行進程
把進程移動到 cgroup
cgroup-tools
列出 cgroup mount 信息
創建 cgroup
- 選項?-t?指定?tasks?文件的用戶和組,也就是指定哪些人可以把任務添加到 cgroup 中,默認是從父 cgroup 繼承
- -a?指定除了?tasks?之外所有文件(資源控制文件)的用戶和組,也就是哪些人可以管理資源參數
- -g?指定要添加的 cgroup,冒號前是逗號分割的子資源類型,冒號后面是 cgroup 的路徑(這個路徑會添加到對應資源 mount 到的目錄后面)。也就是說在特定目錄下面添加指定的子資源
刪除 cgroup
設置 cgroup 的參數
在某個 cgroup 中運行進程
把已經運行的進程移動到某個 cgroup
cgroup 子資源參數詳解
blkio:限制設備 IO 訪問
- blkio.weight:設置 cgroup 讀寫設備的權重,取值范圍在 100-1000
- blkio.weight_device:設置 cgroup 使用某個設備的權重。當訪問該設備時,它會使用當前值,覆蓋?blkio.weight?的值。內容的格式為?major:minor weight,前面是設備的 major 和 minor 編號,用來唯一表示一個設備,后面是 100-1000 之間的整數值。設備號的分配可以參考:https://www.kernel.org/doc/html/v4.11/admin-guide/devices.html
- blkio.throttle.read_bps_device:最多每秒鐘從設備讀取多少字節
- blkio.throttle.read_iops_device:最多每秒鐘從設備中執行多少次讀操作
- blkio.throttle.write_bps_device:最多每秒鐘可以往設備寫入多少字節
- blkio.throttle.write_iops_device:最多每秒鐘可以往設備執行多少次寫操作
- blkio.throttle.io_serviced:cgroup 中進程讀寫磁盤的次數,文件中內容格式為?major:minor operation number,表示對磁盤進行某種操作(read、write、sync、async、total)的次數
- blkio.throttle.io_service_bytes:和上面類似,不過這里保存的是操作傳輸的字節數
- blkio.reset_stats:重置統計數據,往該文件中寫入一個整數值即可
- blkio.time:統計 cgroup 對各個設備的訪問時間,格式為?major:minor milliseconds
- blkio.io_serviced:CFQ 調度器下,cgroup 對設備的各種操作次數,和?blkio.throttle.io_serviced?剛好相反,所有不是 throttle 下的請求
- blkio.io_services_bytes:CFQ 調度器下,cgroup 對各種設備的操作字節數
- blkio.sectors:cgroup 中傳輸的扇區次數,格式為?major:minor sector_count
- blkio.queued:cgroup IO 請求進隊列的次數,格式為?number operation
- blkio.dequeue:cgroup 的 IO 請求被設備出隊列的次數,格式為?major:minor number
- blkio.avg_queue_size:
- blkio.merged:cgroup 把 BIOS 請求合并到 IO 操作請求的次數,格式為?number operation
- blkio.io_wait_time:cgroup 等待隊列服務的時間
- blkio.io_service_time:CFQ 調度器下,cgroup 處理請求的時間(從請求開始調度,到 IO 操作完成)
cpu:限制進程組 CPU 使用
- cpu.cfs_quota_us:每個周期 cgroup 中所有任務能使用的 CPU 時間,默認為?-1,表示不限制 CPU 使用。需要配合?cpu.cfs_period_us?一起使用,一般設置為?100000(docker 中設置的值)
- cpu.cfs_period_us:每個周期中 cgroup 任務可以使用的時間周期,如果想要限制 cgroup 任務每秒鐘使用 0.5 秒 CPU,可以在?cpu.cfs_quota_us?為?100000?的情況下把它設置為?50000。如果它的值比?cfs_quota_us?大,表明進程可以使用多個核 CPU,比如?200000?表示進程能夠使用?2.0?核
- cpu.stat:CPU 使用的統計數據,nr_periods?表示已經過去的時間周期;nr_throttled?表示 cgroup 中任務被限制使用 CPU 的次數(因為超過了規定的上限);throttled_time?表示被限制的總時間
- cpu.shares:cgroup 使用 CPU 時間的權重值。如果兩個 cgroup 的權重都設置為 100,那么它們里面的任務同時運行時,使用 CPU 的時間應該是一樣的;如果把其中一個權重改為 200,那么它能使用的 CPU 時間將是對方的兩倍。
- cpu.rt_period_us:設置一個周期時間,表示多久 cgroup 能夠重新分配 CPU 資源
- cpu.rt_runtime_us:設置運行時間,表示在周期時間內 cgroup 中任務能訪問 CPU 的時間。這個限制是針對單個 CPU 核數的,如果是多核,需要乘以對應的核數
cpuacct:任務使用 CPU 情況統計
- cpuacct.usage:該 cgroup 中所有任務(包括子 cgroup 中的任務,下同)總共使用 CPU 的時間,單位是納秒(ns)。往文件中寫入?0?可以重置統計數據
- cpuacct.stat:該 cgroup 中所有任務使用 CPU 的user 和 system 時間,也就是用戶態 CPU 時間和內核態 CPU 時間
- cpuacct.usage_percpu:該 cgroup 中所有任務使用各個 CPU 核數的時間,單位為納秒(ns)
cpuset: cpu 綁定
- cpuset.cpus:設置 cgroup 中任務能使用的 CPU,格式為逗號(,)隔開的列表,減號(-)可以表示范圍。比如,0-2,7?表示 CPU 第 0,1,2,和 7 核。
- cpuset.mems:設置 cgroup 中任務能使用的內存節點,和?cpuset.cpus?格式一樣
memory:限制內存使用
- memory.limit_in_bytes:cgroup 能使用的內存上限值,默認為字節;也可以添加?k/K、m/M?和?g/G?單位后綴。往文件中寫入?-1?來移除設置的上限,表示不對內存做限制
- memory.memsw.limit_in_bytes:cgroup 能使用的內存加 swap 上限,用法和上面一樣。寫入?-1?來移除上限
- memory.failcnt:任務使用內存量達到?limit_in_bytes?上限的次數
- memory.memsw.failcnt:任務使用內存加 swap 量達到?memsw.limit_in_bytes?上限的次數
- memory.soft_limit_in_bytes:設置內存軟上限。如果內存充足, cgroup 中的任務可以用到?memory.limit_in_bytes?設定的內存上限;當時當內存資源不足時,內核會讓任務使用的內存不超過?soft_limit_in_bytes?中的值。文件內容的格式和?limit_in_bytes?一樣
- memory.swappiness:設置內核 swap out 進程內存(而不是從 page cache 中回收頁) 的傾向。默認值為 60,低于 60 表示降低傾向,高于 60 表示增加傾向;如果值高于 100,表示允許內核 swap out 進程地址空間的頁。如果值為 0 表示傾向很低,而不是禁止該行為。
- memory.stat:匯報內存的使用情況,里面的數據包括:
- cache:頁緩存(page cache)字節數,包括 tmpfs(shmem)
- rss:匿名和 swap cache 字節數,不包括 tmpfs
- mapped_file:內存映射(memory-mapped)的文件大小,包括 tmpfs,單位是字節
- pgpgin: paged into 內存的頁數
- pgpgout:paged out 內存的頁數
- swap:使用的 swap 字節數
- active_anon:活躍的 LRU 列表中匿名和 swap 緩存的字節數,包括 tmpfs
- inactive_anon:不活躍的 LRU 列表中匿名和 swap 緩存的字節數,包括 tmpfs
- active_file:活躍 LRU 列表中文件支持的(file-backed)的內存字節數
- inactive_file:不活躍列表中文件支持的(file-backed)的內存字節數
- unevictable:不可以回收的內存字節數
- memory.usage_in_bytes:cgroup 中進程當前使用的總內存字節數
- memory.memsw.usage_in_bytes:cgroup 中進程當前使用的總內存加上總 swap 字節數
- memory.max_usage_in_bytes:cgroup 中進程使用的最大內存字節數
- memory.memsw.max_usage_in_bytes:cgroup 中進程使用的最大內存加 swap 字節數
net_cls:為網絡報文分類
net_prio:網絡報文優先級
- net_prio.prioidx:只讀文件,里面包含了一個整數值,內核用來標識這個 cgroup
- net_prio.ifpriomap:網絡接口的優先級,里面可以包含很多行,用來為從網絡接口中發出去的報文設置優先級。每行的格式為?network_interface priority,比如?echo "eth0 5" > /sys/fs/cgroup/net_prio/mycgroup/net_prio.ifpriomap
devices:設備黑白名單
- devices.allow:cgroup 中的任務能夠訪問的設備列表,格式為?type major:minor access,
- type?表示類型,可以為?a(all),?c(char),?b(block)
- major:minor?代表設備編號,兩個標號都可以用*?代替表示所有,比如?*:*代表所有的設備
- accss?表示訪問方式,可以為?r(read),w(write),?m(mknod) 的組合
- devices.deny:cgroup 中任務不能訪問的設備,和上面的格式相同
- devices.list:列出 cgroup 中設備的黑名單和白名單
freezer
- freezer.state:這個文件值存在于非根 cgroup 中(因為所有的任務默認都在根 cgroup 中,停止所有的任務顯然是錯誤的行為),里面的值表示 cgroup 中進程的狀態:
- FROZEN:cgroup 中任務都被掛起(暫停)
- FREEZING:cgroup 中任務正在被掛起的過程中
- THAWED:cgroup 中的任務已經正常恢復
總結
參考資料
- An introduction to cgroups and cgroupspy
- LXC, Cgroups and Advanced Linux Container Technology Lecture
- redhat doc:Subsystems and Tunable Parameters
- Docker背后的內核知識——cgroups資源限制
- Docker資源管理探秘:Docker背后的內核Cgroups機制
- Linux 內核 cgroups 簡介
- 王喆鋒:Linux Cgroups 詳解
- Linux Cgroups V2 設計
- Understanding the new control groups API
- Resource Management: Linux Kernel Namespaces and cgroups – Rami Rosen
- wikipedia cgroups page
想知道更多?掃描下面的二維碼關注我
相關推薦:
《科普 | 明星公司之Netflix》
《看我如何作死 | 將CPU、IO打爆》
《看我如何作死 | 網絡延遲、丟包、中斷一個都沒落下》
《7102-2019年技術文全套整理,建議收藏》
《看我如何假死!》
《總結緩存使用過程中的幾種策略以及優缺點組合分析》
加技術群入口(備注:技術):>>>Learn More<<
免費資料入口(備注:1024):>>>Learn More<<
免費星球入口:>>>Free<<<
點個"在看"唄^_^
總結
以上是生活随笔為你收集整理的docker 容器基础技术的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ElasticSearch 性能优化实战
- 下一篇: 史上最难10道Java面试题!