真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何利用cgroup的cpuset控制器限制進程的CPU使用

本篇內(nèi)容主要講解“如何利用 cgroup 的 cpuset 控制器限制進程的 CPU 使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“如何利用 cgroup 的 cpuset 控制器限制進程的 CPU 使用”吧!

迭部ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)建站的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!

最近在做一些性能測試的事情,首要前提是控制住 CPU 的使用量。最直觀的方法無疑是安裝 Docker,在每個配置了參數(shù)的容器里運行基準程序。

對于計算密集型任務(wù),在只限制 CPU 的需求下,直接用 Linux 原生的 cgroup 功能來限制 CPU 使用無疑是最方便的。

本文簡要說明如何使用 cgroup 的 cpuset 控制器限制進程只使用某幾個 CPU,更準確的說是某個幾個邏輯核。

1. 查看 CPU 配置

常用的配置可以用如下 BASH 命令查看。

1

2

3

cat /proc/cpuinfo grep "physical id" sort uniq # 查看物理 CPU 數(shù)量

cat /proc/cpuinfo grep "cores" uniq # 查看每塊 CPU 的核心數(shù)

cat /proc/cpuinfo grep "processor" wc -l # 查看主機總的邏輯線程數(shù)

特別地,啟用了超線程的話,每個 CPU 物理核心會模擬出 2 個線程,也叫邏輯核。判斷方式如下:

1

是否開啟超線程 = 物理 CPU 數(shù)量 * 每塊 CPU 核心數(shù) / 總邏輯線程數(shù) == 2

2. 什么是 NUMA

這里提到一個概念叫 NUMA,主機板上如果插有多塊 CPU 的話,那么就是 NUMA 架構(gòu)。每塊 CPU 獨占一塊面積,一般都有獨立風扇。

一個 NUMA 節(jié)點包含了直連在該區(qū)域的 CPU、內(nèi)存等硬件設(shè)備,通信總線一般是 PCI-E。由此也引入了 CPU 親和性的概念,即 CPU 訪問同一個 NUMA 節(jié)點上的內(nèi)存的速度大于訪問另一個節(jié)點的。

執(zhí)行以下命令,以查看本機的 NUMA 結(jié)構(gòu)。

1

2

3

4

5

6

7

8

9

10

11

12

numactl --harware

# available: 2 nodes (0-1)

# node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

# node 0 size: 127834 MB

# node 0 free: 72415 MB

# node 1 cpus: 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

# node 1 size: 128990 MB

# node 1 free: 68208 MB

# node distances:

# node   0   1

#   0:  10  21

#   1:  21  10

一個 NUMA 節(jié)點包括一個內(nèi)存節(jié)點和屬于同一塊 CPU 的若干個邏輯核,請記住它們的編號,將在配置 cpuset 中用到。

在此解釋下“node distance”,訪問本節(jié)點的內(nèi)存的通信成本是常量值 10,操作系統(tǒng)以此基準來量化訪問其他 NUMA 節(jié)點上內(nèi)存的代價。

3. 創(chuàng)建 cgroup 并配置資源使用

 內(nèi)核版本較高(>=2.6.24)的 Linux 發(fā)行版都內(nèi)置了 cgroup,可以執(zhí)行以下命令驗證一下。

1

2

3

4

5

6

7

8

9

10

11

12

mount grep cgroup

# tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)

# cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/lib/systemd/systemd-cgroups-agent,name=systemd)

# cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)

# cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)

# cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)

# cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)

# cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)

# cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls,net_prio)

# cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)

# cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)

# cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)

如果沒有的話,也可以執(zhí)行一段簡單的腳本呢,來一次性掛載齊全。

1

2

3

4

5

6

7

cgroot="${1:-/sys/fs/cgroup}"

subsys="${2:-blkio cpu cpuacct cpuset devices freezer memory net_cls net_prio ns perf_event}"

mount -t tmpfs cgroup_root "${cgroot}"

for ss in $subsys; do

  mkdir -p "$cgroot/$ss"

  mount -t cgroup -o "$ss" "$ss" "$cgroot/$ss"

done

cgroup 針對每一種資源都提供了相應(yīng)的控制器來進行配置,在 Linux 中以文件系統(tǒng)的形式呈現(xiàn)。本文只涉及進程在物理核上的放置,因此來看一下 cpuset 目錄下有什么。

1

2

3

4

5

6

7

8

9

10

11

mkdir /sys/fs/cgroup/cpuset/tiger # 創(chuàng)建一個控制組,刪除用 rmdir 命令

ls /sys/fs/cgroup/cpuset/tiger

# cgroup.clone_children  cpuset.memory_pressure

# cgroup.procs           cpuset.memory_spread_page

# cpuset.cpu_exclusive   cpuset.memory_spread_slab

# cpuset.cpus            cpuset.mems

# cpuset.effective_cpus  cpuset.sched_load_balance

# cpuset.effective_mems  cpuset.sched_relax_domain_level

# cpuset.mem_exclusive   notify_on_release

# cpuset.mem_hardwall    tasks

# cpuset.memory_migrate

如果要使用 cpuset 控制器,需要同時配置 cpuset.cpus 和 cpuset.mems 兩個文件(參數(shù))。這兩個文件接受用短橫線和逗號表示的區(qū)間,如“0-7,16-23”。如果對應(yīng)的資源不存在,那么寫入的時候會報錯。

不建議直接在控制器的根目錄下配置,通過創(chuàng)建子目錄的形式可以同時維持多個控制器。執(zhí)行如下命令,限制 tiger 控制組下所有進程只能使用邏輯核0和1。

1

2

echo "0-1" /sys/fs/cgroup/cpuset/tiger/cpuset.cpus

echo 0 > /sys/fs/cgroup/cpuset/tiger/cpuset.mems

對于 cpuset.mems 參數(shù)而言,每個內(nèi)存節(jié)點和 NUMA 節(jié)點一一對應(yīng)。如果進程的內(nèi)存需求量較大,可以把所有的 NUMA 節(jié)點都配置進去。這里就用到了 NUMA 的概念。出于性能的考慮,配置的邏輯核和內(nèi)存節(jié)點一般屬于同一個 NUMA 節(jié)點,可用“numactl --hardware”命令獲知它們的映射關(guān)系。

4. 驗證效果

在 cpuset 的所有配置文件中,tasks 和 cgroups.procs 是用來管理控制組中的進程的。執(zhí)行以下命令,把當前會話加入剛剛創(chuàng)建的控制組里,本會話發(fā)起的所有命令(子進程)都會收到 cpu 使用的約束。

1

echo $$ > /sys/fs/cgroup/cpuset/tiger/cgroup.procs # 寫入當前進程編號

兩個配置項基本是等價的,但有一小點不同。操作系統(tǒng)以線程為調(diào)度單位,將一個一般的 pid 寫入到 tasks 中,只有這個 pid 對應(yīng)的線程,以及由它產(chǎn)生的其他進程、線程會屬于這個控制組。而把 pid 寫入 cgroups.procs,操作系統(tǒng)則會把找到其所屬進程的所有線程,把它們統(tǒng)統(tǒng)加入到當前控制組。

進程在加入一個控制組后,控制組所對應(yīng)的限制會即時生效。啟動一個計算密集型的任務(wù),申請用 4 個邏輯核。

1

2

3

stress -c 4 &

# [1] 2958521

# stress: info: [2958521] dispatching hogs: 4 cpu, 0 io, 0 vm, 0 hdd

觀察 CPU 的使用情況來驗證效果,只有編號為 0 和 1 的兩個邏輯核在工作,用戶態(tài)的比例高達 100%。

1

2

3

4

5

6

top # 在列表頁按數(shù)字 1 鍵,切換到 CPU 看板

# Tasks: 706 total,   3 running, 702 sleeping,   0 stopped,   1 zombie

# %Cpu0  :100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

# %Cpu1  :100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

# %Cpu2  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

# %Cpu3  :  0.0 us,  1.7 sy,  0.0 ni, 98.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

到此,相信大家對“如何利用 cgroup 的 cpuset 控制器限制進程的 CPU 使用”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學習!


網(wǎng)站名稱:如何利用cgroup的cpuset控制器限制進程的CPU使用
網(wǎng)站鏈接:http://weahome.cn/article/ipphej.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部