Debian

如何確保正在執行的程序的獨占 CPU 可用性?

  • March 1, 2022

起初,這個問題似乎有點愚蠢/令人困惑,因為作業系統負責管理程序執行。

但是,我想測量有多少程序是 CPU/IO 綁定的,我覺得我的作業系統干擾了我的實驗,例如,調度的作業系統程序。

以以下情況為例:我執行了兩次程序 A 並從工具“時間”(時間列以秒為單位)得到以下輸出:

+---+-------+---------+-----------+---------+
|Run|Process|User Time|System Time|Wall time|
+---+-------+---------+-----------+---------+
|1  |A      |196.3    |5.12       |148.86   |
|2  |A      |190.79   |4.93       |475.46   |
+---+-------+---------+-----------+---------+

正如我們所看到的,儘管使用者時間和系統時間相似,但兩者的經過時間發生了巨大變化(差異約 5 分鐘)。感覺就像我的環境中的某些東西引起了某種爭用。

我想停止所有可能的後台程序/服務,以避免在我的實驗過程中出現任何噪音,但我認為自己是一個新手/中級 unix 使用者,我不知道如何保證這一點。

我正在使用帶有Ubuntu 14.04 LTS 64 位****的 Linux 4.4.0-45-generic 。

我非常感謝您的幫助。如果你們需要任何遺漏的資訊,我會及時編輯我的文章。

中央處理器資訊

$ grep proc /proc/cpuinfo | wc -l
8
$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                8
On-line CPU(s) list:   0-7
Thread(s) per core:    2
Core(s) per socket:    4
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 60
Stepping:              3
CPU MHz:               4002.609
BogoMIPS:              7183.60
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              8192K
NUMA node0 CPU(s):     0-7

您有一個核心選項配置,其中作業系統不會使用 CPU,它被稱為isolcpus.

isolcpus — 將 CPU 與核心調度程序隔離開來。

概要 isolcpus= cpu_number

$$ , cpu_number ,… $$ 說明 從通用核心 SMP 平衡和調度程序算法中刪除由 cpu_number 值定義的指定 CPU。將程序移入或移出“隔離”CPU 的唯一方法是通過 CPU 關聯繫統呼叫。cpu_number 從 0 開始,因此最大值比系統上的 CPU 數量少 1。

我將要描述的這個配置是如何設置的,它可以比測試有更多的用途。

例如,Meru 在其基於 Linux 的 AP 控制器中使用了這項技術,以防止網路流量干擾作業系統的內部工作,即 I/O 操作。

我也在一個非常繁忙的 Web 前端中使用它,原因完全相同:我從生活經驗中發現,由於我對伺服器的品味,我經常失去控制;必須強制重新啟動它,直到我在它自己的專用 CPU 上分離前端守護程序。

由於您有 8 個 CPU,因此您可以使用以下命令的輸出進行檢查:

$ grep -c proc /proc/cpuinfo
8

或者

$ lscpu | grep '^CPU.s'
CPU(s):                8

將文件中的 Debian/Ubuntu 添加/etc/default/grub到選項中GRUB_CMDLINE_LINUX

GRUB_CMDLINE_LINUX="isolcpus=7"

(它是 7,因為它從 0 開始,你有 8 個核心)

然後執行,

sudo update-grub

這是告訴核心不要使用您的核心之一。

重新啟動系統。

然後開始你的過程。

啟動後,您可以立即更改為第 8 個 CPU(7,因為 0 是第一個),並確保您是唯一使用該 CPU 的人。

為此,請使用以下命令:

taskset -cp 7 PID_number

taskset - 檢索或設置程序的 CPU 親和性

概要

   taskset [options] [mask | list ] [pid | command [arg]...]

描述

taskset 用於在給定 PID 的情況下設置或檢索正在執行的程序的 CPU 親和性,或啟動具有給定 CPU 親和性的新命令。CPU 親和性是一種調度程序屬性,它將程序“綁定”到系統上的一組給定 CPU。Linux 調度程序將遵循給定的 CPU 親和性,並且該程序不會在任何其他 CPU 上執行。請注意,Linux 調度程序還支持自然 CPU 親和性:出於性能原因,調度程序會嘗試將程序保持在同一個 CPU 上,只要可行。因此,強制特定的 CPU 親和性僅在某些應用程序中有用。

有關它的更多資訊,請參閱:isolcpus、numactl 和任務集

同樣使用ps -eF您應該在 PSR 列中看到正在使用的處理器。

我有一個 CPU 2 和 3 隔離的伺服器,實際上,可以看到它與預期的使用者空間ps -e中的唯一程序是.pound

# ps -eo psr,command | tr -s " " | grep "^ [2|3]"
2 [cpuhp/2]
2 [watchdog/2]
2 [migration/2]
2 [ksoftirqd/2]
2 [kworker/2:0]
2 [kworker/2:0H]
3 [cpuhp/3]
3 [watchdog/3]
3 [migration/3]
3 [ksoftirqd/3]
3 [kworker/3:0]
3 [kworker/3:0H]
2 [kworker/2:1]
3 [kworker/3:1]
3 [kworker/3:1H]
3 /usr/sbin/pound

如果將其與非隔離 CPU 進行比較,它們會執行更多的東西(幻燈片下方的視窗):

# ps -eo psr,command | tr -s " " | grep "^ [0|1]"
0 init [2]
0 [kthreadd]
0 [ksoftirqd/0]
0 [kworker/0:0H]
0 [rcu_sched]
0 [rcu_bh]
0 [migration/0]
0 [lru-add-drain]
0 [watchdog/0]
0 [cpuhp/0]
1 [cpuhp/1]
1 [watchdog/1]
1 [migration/1]
1 [ksoftirqd/1]
1 [kworker/1:0]
1 [kworker/1:0H]
1 [kdevtmpfs]
0 [netns]
0 [khungtaskd]
0 [oom_reaper]
1 [writeback]
0 [kcompactd0]
0 [ksmd]
1 [khugepaged]
0 [crypto]
1 [kintegrityd]
0 [bioset]
1 [kblockd]
1 [devfreq_wq]
0 [watchdogd]
0 [kswapd0]
0 [vmstat]
1 [kthrotld]
0 [kworker/0:1]
0 [deferwq]
0 [scsi_eh_0]
0 [scsi_tmf_0]
1 [vmw_pvscsi_wq_0]
0 [bioset]
1 [jbd2/sda1-8]
1 [ext4-rsv-conver]
0 [kworker/0:1H]
1 [kworker/1:1H]
1 [bioset]
0 [bioset]
1 [bioset]
1 [bioset]
1 [bioset]
1 [bioset]
1 [bioset]
1 [bioset]
0 [jbd2/sda3-8]
1 [ext4-rsv-conver]
1 /usr/sbin/rsyslogd
0 /usr/sbin/irqbalance --pid=/var/run/irqbalance.pid
1 /usr/sbin/cron
0 /usr/sbin/sshd
1 /usr/sbin/snmpd -Lf /dev/null -u snmp -g snmp -I -smux -p /var/run/snmpd.pid
1 /sbin/getty 38400 tty1
1 /lib/systemd/systemd-udevd --daemon
0 /usr/sbin/xinetd -pidfile /run/xinetd.pid -stayalive
1 [kworker/1:2]
0 [kworker/u128:1]
0 [kworker/0:2]
0 [bioset]
1 [xfsalloc]
1 [xfs_mru_cache]
1 [jfsIO]
1 [jfsCommit]
0 [jfsCommit]
0 [jfsCommit]
0 [jfsCommit]
0 [jfsSync]
1 [bioset]
0 /usr/bin/monit -c /etc/monit/monitrc
1 /usr/sbin/pound
0 sshd: rui [priv]
0 sshd: rui@pts/0,pts/1
1 -bash
1 -bash
1 -bash
1 [kworker/u128:0]
1 -bash
0 sudo su
1 su
1 bash
0 bash
0 logger -t cmdline root[/home/rui] 
1 ps -eo psr,command
0 tr -s 
0 grep ^ [0|1]
0 /usr/bin/vmtoolsd

引用自:https://unix.stackexchange.com/questions/326579