潇湘夜雨移动版

主页 > 系统 >

cpu性能查看和优化

1.Linux优先级
1.1优先级类型
实时优先级(RTPRIO): 1-99,数字越小,优先级越低
静态优先级(PRI):100-139,数据越小,优先级越高   -20,19:100,139
0:120
实时优先级比静态优先级高
 
nice值:调整静态优先级
查看系统进程优先级:
[root@youxiang ~]# ps -e -o class,rtprio,pri,nice,cmd
CLS RTPRIO PRI  NI CMD
TS       -   19   0 /sbin/init
TS       -   19   0 [kthreadd]
FF      99 139   - [migration/0]
TS       -   19   0 [ksoftirqd/0]
FF      99 139   - [stopper/0]
FF      99 139   - [watchdog/0]
TS       -   23  -4 /sbin/udevd -d
TS       -   23  -4 auditd
TS       -   19   0 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)                         
TS       -   19   0 php-fpm: pool www                                                                 
TS       -   19   0 php-fpm: pool www                                                                 
注意:加[ ]的进程表示系统进程
 
1.2手动调整优先级:
1>静态优先级调整
100-139: nice
nice N COMMAND #启动进程时指定优先级
renice -n # PID #已启动的进程指定优先级
示例:
[root@youxiang ~]# renice -n -5 1678
1678: old priority 0, new priority -5
[root@youxiang ~]# ps -e -o class,rtprio,pri,nice,cmd | grep php
TS       -  24  -5 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)
chrt -p [prio] PID #加-p参数可以调整静态优先级
2>调整实时优先级
1-99: 
指定已启动的进程优先级:
chrt -f -p [prio] PID 
chrt -r -p [prio] PID
指定进程启动的优先级:
chrt -r -p [prio] COMMAND
chrt -f -p [prio] COMMAND
注意:实时优先级有两种类别,要指定-f和-r参数
ps -e -o class,rtprio,pri,nice,cmd
 
 
 
 
2.NUMA
2.1 numa介绍
非统一内存访问(NUMA)是一种用于多处理器的电脑记忆体设计,内存访问时间
取决于处理器的内存位置。 在NUMA下,处理器访问它自己的本地存储器的速度比
非本地存储器(存储器的地方到另一个处理器之间共享的处理器或存储器)快一些。
 
NUMA中,虽然内存直接attach在CPU上,但是由于内存被平均分配在了各个die上。
只有当CPU访问自身直接attach内存对应的物理地址时,才会有较短的响应时间
(后称Local Access)。而如果需要访问其他CPU attach的内存的数据时,就需要
通过inter-connect通道访问,响应时间就相比之前变慢了(后称Remote Access)。
相关命令:
numastat
[root@youxiang ~]# numastat #查看numa的内存分配
  node0
numa_hit               443680040
numa_miss                      0
numa_foreign                   0
interleave_hit             22902
local_node             443680040
other_node                     0
 
numactl
[root@youxiang ~]# numactl --hardware
available: 1 nodes (0)
node 0 cpus: 0
node 0 size: 1023 MB
node 0 free: 72 MB
node distances:
node   0 
 0:  10 
 
2.2 numa的问题
在numa条件下,CPU访问自己Chip上所插的内存时速度快,而访问其他CPU所关联的
内存(下文称Remote Access)的速度相较慢三倍左右,而Linux内核默认使用CPU亲和
的内存分配策略,使内存页尽可能的和调用线程处在同一个Core/Chip中,由于内存页没
有动态调整策略,使得大部分内存页都集中在CPU 0上,又因为Reclaim默认策略优先淘
汰/Swap本Chip上的内存,使得大量有用内存被换出,当被换出页被访问时问题就以数据
库响应时间飙高甚至阻塞的形式出现了,在内存使用率高的服务器中numa还可能会导致
swap使用率增高,例如mysql服务器中,一般要关闭NUMA。
这里补充下关于NUMA的几种方法:
1) BIOS中关闭NUMA设置
2) 在操作系统kernel层面关于numa,例如:
/etc/grub.conf的kernel行最后添加: numa=off
3)Oracle数据库层面关闭:
_enable_NUMA_optimization=false  (11g中参数为_enable_NUMA_support)
 
 
3.CPU affinity: CPU姻亲关系
 
3.1 进程和cpu绑定
taskset: 绑定进程至某CPU上
mask:
0x0000 0001
cpu编号:
0001: 0号cpu
0011:0和1号cpu
0101: 0和2
0111:0-2号cpu
 
# taskset -p mask pid
 
taskset -p 0x00000004 101 #将101进程绑定到第三号cpu
注意:用-p参数绑定cpu要将二进制编号转化为十六进制,如:0100=0x00000004
taskset -p -c 0-2,7 101 #将101进程绑定到0、1、2、7号cpu
 
应该将中断绑定至那些非隔离的CPU上,从而避免那些隔离的CPU处理中断程序;
echo CPU_MASK > /proc/irq/<irq number>/smp_affinity
 
 
4.sar命令
sar -w
查看上下文切换的平均次数,以及进程创建的平均值;
sar -q #10分钟一个周期的cpu负载
[root@youxiang ~]# sar -q 1 #实时查看当前cpu的使用率
Linux 2.6.32-573.el6.x86_64 (youxiang.com) 2016年10月19日 _x86_64_ (1 CPU)
 
08时32分46秒   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15
08时32分47秒         0       157      0.12      0.17      0.11
08时32分48秒         0       161      0.12      0.17      0.11
08时32分49秒         0       161      0.12      0.17      0.11
08时32分50秒         0       161      0.12      0.17      0.11
08时32分51秒         0       163      0.12      0.17      0.11
08时32分52秒         0       160      0.11      0.16      0.11
08时32分53秒         0       161      0.11      0.16      0.11
 
[root@youxiang ~]# sar -b #查看磁盘io的负载
Linux 2.6.32-573.el6.x86_64 (youxiang.com) 2016年10月19日 _x86_64_ (1 CPU)
 
00时00分01秒       tps      rtps      wtps   bread/s   bwrtn/s
00时10分01秒      6.70      0.00      6.70      0.00    175.91
00时20分01秒      6.76      0.00      6.76      0.00    176.39
00时30分01秒      6.82      0.00      6.82      0.00    176.21
00时40分01秒      6.79      0.00      6.79      0.00    176.38
00时50分01秒      6.86      0.00      6.86      0.00    180.01
 
5.perf 
Perf Event 是一款随 Linux 内核代码一同发布和维护的性能诊断工具,由内核社区维护和发展。
Perf 不仅可以用于应用程序的性能统计分析,也可以应用于内核代码的性能统计和分析。得益
于其优秀的体系结构设计,越来越多的新功能被加入 Perf,使其已经成为一个多功能的性能统计工具集 。
perf stat
Task-clock-msecs:CPU 利用率,该值高,说明程序的多数时间花费在 CPU 计算上而非 IO。
Context-switches:进程切换次数,记录了程序运行过程中发生了多少次进程切换,频繁的进程切换是应该避免的。
Cache-misses:程序运行过程中总体的 cache 利用情况,如果该值过高,说明程序的 cache 利用不好
CPU-migrations:表示进程 t1 运行过程中发生了多少次 CPU 迁移,即被调度器从一个 CPU 转移到另外一个 CPU 上运行。
Cycles:处理器时钟,一条机器指令可能需要多个 cycles,
Instructions: 机器指令数目。
IPC:是 Instructions/Cycles 的比值,该值越大越好,说明程序充分利用了处理器的特性。
Cache-references: cache 命中的次数
Cache-misses: cache 失效的次数。
通过指定 -e 选项,您可以改变 perf stat 的缺省事件 ( 关于事件,在上一小节已经说明,可以通过 perf list 来查看 )。假如您已经有很多的调优经验,可能会使用 -e 选项来查看您所感兴趣的特殊的事件。
 
 
perf Top
 
使用 perf stat 的时候,往往您已经有一个调优的目标。也有些时候,您只是发现系统性能无端下降,并不清楚究竟哪个进程成为了贪吃的 hog。此时需要一个类似 top 的命令,列出所有值得怀疑的进程,从中找到需要进一步审查的家伙。类似法制节目中办案民警常常做的那样,通过查看监控录像从茫茫人海中找到行为古怪的那些人,而不是到大街上抓住每一个人来审问。
Perf top 用于实时显示当前系统的性能统计信息。该命令主要用来观察整个系统当前的状态,比如可以通过查看该命令的输出来查看当前系统最耗时的内核函数或某个用户进程。
 
 
使用 perf record, 解读 report
 
使用 top 和 stat 之后,您可能已经大致有数了。要进一步分析,便需要一些粒度更细的信息。比如说您已经断定目标程序计算量较大,也许是因为有些代码写的不够精简。那么面对长长的代码文件,究竟哪几行代码需要进一步修改呢?这便需要使用 perf record 记录单个函数级别的统计信息,并使用 perf report 来显示统计结果。 (责任编辑:liangzh)