紅帽6實現無滴答 tick less
interrupt-driven
由軟中斷進行驅動
在SMP多CPU架構中,傳統上多CPU對於內存的訪問是總線方式。是總線就會存在資源爭用和一致性問題,而且如果不斷的增加CPU數量,總線的爭用會愈演愈烈,這就體現在4核CPU的跑分性能達不到2核CPU的2倍,甚至1.5倍!理論上來說這種方式實現12core以上的CPU已經沒有太大的意義。
Intel的NUMA解決方案,放棄總線的訪問方式,將CPU劃分到多個Node中,每個node有自己獨立的內存空間。各個node之間通過高速互聯通訊,通訊通道被成爲QuickPath Interconnect即QPI。
numactl控制命令,實現策略控制
-cpunodebind=nodes 將cpu跟某個node綁定,不讓cpu跟訪問其他node
-physcpubind=cpus 將進程和cpu完成綁定
--show顯示當先使用的策略
numastat 顯示命令
-p 查看某個特定進程的內存分配
-s node0 查看node0和全部的,主要用於排序
[root@localhost ~]# numastat 顯示有幾個node
node0
numa_hit 283715 表示cpu到這個內存node(節點)找數據命中多少個
numa_miss 0 沒命中個數,命中過高需要綁定進程到特定cpu
numa_foreign 0 被非本地cpu訪問次數
interleave_hit 14317
local_node 283715
other_node 0
numad 用戶空間級別的守護進程,能夠提供策略,通過觀察cpu進程的狀況,自動把某個進程綁定到特定的cpu上,實現自我優化,自我管理。
CPU affinity:cpu婚親關係
numactl
numad
numastat
teskset:綁定進程至某cpu上
mask:
0x0000 0001 (16進制)
0001 :表示第0號CPU
0x0000 0003
0011: 表示0號和1號CPU
0x0000 0005
0101:表示第0號和2號CPU
0x0000 0007
列如把pid爲101的進程綁定在3號cpu上
0100=4
#taskset -p 0x00000004 101
or
#taskset -p -c 3 101
綁定在0號和1號cpu上
#taskset -p -c 0,1 101
綁定在0-2號和7號cpu上
#taskset -p -c 0-2,7 101
[root@localhost ~]# cat /proc/irq/0/smp_affinity
ffffffff,ffffffff,ffffffff,ffffffff 表示0號中斷可以運行到任何cpu上
# echo "00000000,00000000,00000000,0000001" > /proc/irq/0/smp_affinity
將0號中斷綁定到 0號cpu上
echo CPU_MASK >/proc/irq/<irq number>/smp_affinity
應該將中斷綁定至那些非隔離的CPU上,從而避免那些隔離的cpu處理中斷程序:
查看運行狀態命令
sar -q 1
09:32:17 AM runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15
運行隊列長度
09:32:18 AM 0 96 0.00 0.00 0.00
09:32:19 AM 0 96 0.00 0.00 0.00
top
w
uptime
vmstat 1 5
查看cpu狀態命令
mpstat 1 2 顯示每一顆cpu的平均使用率,-P指定查看哪顆CPU
[root@localhost ~]# mpstat -P 0 1 只顯示0號cpu
%usr用戶空間的, %sys內核空間的,%sysIO等待的,%irq硬處理中斷的,%soft軟中斷的,
%steal被虛擬機偷走的,%guest虛擬機使用的,%idle空閒的
09:35:33 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
09:35:34 AM 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
09:35:35 AM 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
09:35:36 AM 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
mpstat -I CPU 1 顯示cpu對中斷處理的
sar -P ALL 1 2
iostat -c 1 2
[root@localhost ~]# cat /proc/stat
dstat --top-cpu 查找誰最消耗cpu
--top-cputime查找誰消耗cpu時間最長的
--top-io誰消耗IO最多
--top-latency哪個進程是最大延遲
--top-mem 誰用了最多的內存
[root@localhost ~]# dstat --top-latency --top-io --top-mem --top-cputime --top-cpu
[root@localhost ~]# dstat -c cpu使用率
[root@localhost ~]# sar -w 1每秒鐘上下文切換的次數和進程創建的平均次數
CPU域的劃分
[root@localhost ~]# mkdir /cpusets
[root@localhost ~]# vim /etc/fstab
cpusets /cpusets cpuset defaults 0 0
[root@localhost ~]# ls -l /cpusets/
total 0
--w--w--w-. 1 root root 0 Jun 5 10:39 cgroup.event_control
-rw-r--r--. 1 root root 0 Jun 5 10:39 cgroup.procs
-rw-r--r--. 1 root root 0 Jun 5 10:39 cpu_exclusive
-rw-r--r--. 1 root root 0 Jun 5 10:39 cpus
-rw-r--r--. 1 root root 0 Jun 5 10:39 mem_exclusive
-rw-r--r--. 1 root root 0 Jun 5 10:39 mem_hardwall
-rw-r--r--. 1 root root 0 Jun 5 10:39 memory_migrate
-r--r--r--. 1 root root 0 Jun 5 10:39 memory_pressure
-rw-r--r--. 1 root root 0 Jun 5 10:39 memory_pressure_enabled
-rw-r--r--. 1 root root 0 Jun 5 10:39 memory_spread_page
-rw-r--r--. 1 root root 0 Jun 5 10:39 memory_spread_slab
-rw-r--r--. 1 root root 0 Jun 5 10:39 mems
-rw-r--r--. 1 root root 0 Jun 5 10:39 notify_on_release
-rw-r--r--. 1 root root 0 Jun 5 10:39 release_agent
-rw-r--r--. 1 root root 0 Jun 5 10:39 sched_load_balance
-rw-r--r--. 1 root root 0 Jun 5 10:39 sched_relax_domain_level
-rw-r--r--. 1 root root 0 Jun 5 10:39 tasks
[root@localhost cpusets]# cat cpus cpu查看的根域裏包含的cpu
0
[root@localhost cpusets]# cat mems 查看內存根域有多少段
0
[root@localhost cpusets]# cat tasks 查看運行在根域的進程有哪些
創建cpu的子域
[root@localhost cpusets]# mkdir domain1
[root@localhost cpusets]# cd domain1/
[root@localhost domain1]# ls -l
total 0
--w--w--w-. 1 root root 0 Jun 5 10:46 cgroup.event_control
-rw-r--r--. 1 root root 0 Jun 5 10:46 cgroup.procs
-rw-r--r--. 1 root root 0 Jun 5 10:46 cpu_exclusive
-rw-r--r--. 1 root root 0 Jun 5 10:46 cpus
-rw-r--r--. 1 root root 0 Jun 5 10:46 mem_exclusive
-rw-r--r--. 1 root root 0 Jun 5 10:46 mem_hardwall
-rw-r--r--. 1 root root 0 Jun 5 10:46 memory_migrate
-r--r--r--. 1 root root 0 Jun 5 10:46 memory_pressure
-rw-r--r--. 1 root root 0 Jun 5 10:46 memory_spread_page
-rw-r--r--. 1 root root 0 Jun 5 10:46 memory_spread_slab
-rw-r--r--. 1 root root 0 Jun 5 10:46 mems
-rw-r--r--. 1 root root 0 Jun 5 10:46 notify_on_release
-rw-r--r--. 1 root root 0 Jun 5 10:46 sched_load_balance
-rw-r--r--. 1 root root 0 Jun 5 10:46 sched_relax_domain_level
-rw-r--r--. 1 root root 0 Jun 5 10:46 tasks
開始綁定第0顆cpu到子域上
[root@localhost domain1]# echo 0 > cpus
[root@localhost domain1]# cat cpus
0
綁定第0段內存到子域上
[root@localhost domain1]# echo 0 > mems
[root@localhost domain1]# cat mems
0
將某個進程綁定到子域上,這個進程就只能在子域的cpu和內存段運行
[root@localhost domain1]# ps axo pid,cmd
[root@localhost domain1]# echo 16380 > tasks
[root@localhost domain1]# ps -e -o psr,pid,cmd |grep httpd 顯示進程在哪一個cpu上運行
[root@localhost domain1]# watch -n 0.5 `ps -e -o psr,pid,cmd |grep httpd` 壓力測試
[root@localhost domain1]# taskset -p -c 0 1
pid 1's current affinity list: 0 顯示1號進程以前可以運行在0號cpu上
pid 1's new affinity list: 0 現在可以運行在0號cpu上