1. 程式人生 > >CPU負載觀察及調優方法

CPU負載觀察及調優方法

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和全部的,主要用於排序

[[email protected] ~]# 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


[[email protected] ~]# 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

[[email protected] ~]# 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

[[email protected] ~]# cat /proc/stat

dstat --top-cpu 查找誰最消耗cpu

--top-cputime查找誰消耗cpu時間最長的

--top-io誰消耗IO最多

--top-latency哪個進程是最大延遲

--top-mem 誰用了最多的內存

[[email protected] ~]# dstat --top-latency --top-io --top-mem --top-cputime --top-cpu

[[email protected] ~]# dstat -c cpu使用率

[[email protected] ~]# sar -w 1每秒鐘上下文切換的次數和進程創建的平均次數


CPU域的劃分


[[email protected] ~]# mkdir /cpusets
[[email protected] ~]# vim /etc/fstab

cpusets /cpusets cpuset defaults 0 0

[[email protected] ~]# 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
[[email protected] cpusets]# cat cpus cpu查看的根域裏包含的cpu
0
[[email protected] cpusets]# cat mems 查看內存根域有多少段
0
[[email protected] cpusets]# cat tasks 查看運行在根域的進程有哪些

創建cpu的子域

[[email protected] cpusets]# mkdir domain1
[[email protected] cpusets]# cd domain1/
[[email protected] 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到子域上

[[email protected] domain1]# echo 0 > cpus
[[email protected] domain1]# cat cpus
0
綁定第0段內存到子域上

[[email protected] domain1]# echo 0 > mems
[[email protected] domain1]# cat mems
0

將某個進程綁定到子域上,這個進程就只能在子域的cpu和內存段運行

[[email protected] domain1]# ps axo pid,cmd
[[email protected] domain1]# echo 16380 > tasks

[[email protected] domain1]# ps -e -o psr,pid,cmd |grep httpd 顯示進程在哪一個cpu上運行
[[email protected] domain1]# watch -n 0.5 `ps -e -o psr,pid,cmd |grep httpd` 壓力測試

[[email protected] 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上






本文出自 “運維成長路” 博客,謝絕轉載!

CPU負載觀察及調優方法