如何確保正在執行的程序的獨占 CPU 可用性?
起初,這個問題似乎有點愚蠢/令人困惑,因為作業系統負責管理程序執行。
但是,我想測量有多少程序是 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