CPU負載觀察及調優方法

紅帽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上






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章