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上

时间: 2024-10-16 11:38:19

CPU负载观察及调优方法的相关文章

Web app 的性能瓶颈与性能调优方法

1. web app 性能测试工具使用 2. mysql 性能分析与调优方法

MySQL数据库参数调优方法

怎么配置MySQL服务器,但考虑到服务器硬件配置的不同,具体应用的差别,那些文章的做法只能作为初步设置参考,我们需要根据自己的情况进行配置优化,好的做法是MySQL服务器稳定运行了一段时间后运行,根据服务器的”状态”进行优化. 注:参数的调整可以通过修改 /etc/my.cnf 文件并重启 MySQL 实现.这是一个比较谨慎的工作,你可以根据你自己主机的硬件情况(特别是内存大小)进一步修改. mysql> show global status;  可以列出MySQL服务器运行各种状态值,另外,查

JVM垃圾回收机制总结(7) :调优方法

JVM调优工具 Jconsole,jProfile,VisualVM Jconsole : jdk自带,功能简单,但是可以在系统有一定负荷的情况下使用.对垃圾回收算法有很详细的跟踪.详细说明参考这里 JProfiler :商业软件,需要付费.功能强大.详细说明参考这里 VisualVM :JDK自带,功能强大,与JProfiler类似.推荐. 如何调优 观察内存释放情况.集合类检查.对象树 上面这些调优工具都提供了强大的功能,但是总的来说一般分为以下几类功能 堆信息查看 可查看堆空间大小分配(年

JVM调优总结-调优方法

转:http://pengjiaheng.javaeye.com/blog/552456 JVM调优工具 Jconsole,jProfile,VisualVM Jconsole : jdk自带,功能简单,但是可以在系统有一定负荷的情况下使用.对垃圾回收算法有很详细的跟踪.详细说明参考这里 JProfiler:商业软件,需要付费.功能强大.详细说明参考这里 VisualVM:JDK自带,功能强大,与JProfiler类似.推荐. 如何调优 观察内存释放情况.集合类检查.对象树 上面这些调优工具都提

java虚拟机学习-JVM调优总结-调优方法(12)

JVM调优工具 Jconsole,jProfile,VisualVM Jconsole : jdk自带,功能简单,但是可以在系统有一定负荷的情况下使用.对垃圾回收算法有很详细的跟踪.详细说明参考这里 JProfiler:商业软件,需要付费.功能强大.详细说明参考这里 VisualVM:JDK自带,功能强大,与JProfiler类似.推荐. 如何调优 观察内存释放情况.集合类检查.对象树 上面这些调优工具都提供了强大的功能,但是总的来说一般分为以下几类功能 堆信息查看 可查看堆空间大小分配(年轻代

性能测试常见瓶颈分析及调优方法

在性能测试过程中,最重要的一部分就是性能瓶颈定位与调优.而引发性能瓶颈的原因是多种多样的,在之前的博客:常见的性能测试缺陷有进行介绍. 这篇博客,来聊聊性能测试过程中的一些注意事项,以及常见的一些性能缺陷表现及如何进行定位分析并且调优... 一.注意事项 1.断言 在压测时,为了判断发送的请求是否成功,一般会通过对请求添加断言来实现.使用断言时,建议遵循如下规范: ①.断言内容尽量以status/code.msg/message来判断(当然前提是接口设计遵循Restful规范) Jmeter示例

HTTP长连接200万尝试及调优方法

转自:http://www.linuxde.net/2011/10/1230.html 对于一个server,我们一般考虑他所能支撑的qps,但有那么一种应用, 我们需要关注的是它能支撑的连接数个数,而并非qps,当然qps也是我们需要考虑的性能点之一.这种应用常见于消息推送系统,也称为comet应用,比如聊天室或即时消息推送系统等.comet应用具体可见我之前的介绍,在此不多讲.对于这类系统,因为很多消息需要到产生时才推送给客户端,所以当没有消息产生时,就需要hold住客户端的连接,这样,当有

【Hibernate 8】Hibernate的调优方法:抓取策略

在上一篇博客中,介绍了Hibernate的缓存机制.合理的配置缓存,可以极大程度上优化Hibernate的性能.这篇博客,介绍另外一个调优方式:抓取策略. 一.什么是抓取策略 抓取策略(fetching strategy):当应用程序需要在关联关系间进行导航的时候,Hibernate如何获取关联对象的策略.抓取策略可以在O / R映射的元数据中声明,也可以在特定的HQL或条件查询(Criteria Query)中重载声明. 二.Hibernate的抓取策略 在Hibernate中,主要包括四种抓

JVM的GC机制及JVM的调优方法

内存管理和垃圾回收是JVM非常关键的点,对Java性能的剖析而言,了解内存管理和垃圾回收的基本策略非常重要. 1.在程序运行过程当中,会创建大量的对象,这些对象,大部分是短周期的对象,小部分是长周期的对象,对于短周期的对象,需要频繁地进行垃圾回收以保证无用对 象尽早被释放掉,对于长周期对象,则不需要频率垃圾回收以确保无谓地垃圾扫描检测.为解决这种矛盾,Sun JVM的内存管理采用分代的策略. 1)年轻代(Young Gen):年轻代主要存放新创建的对象,内存大小相对会比较小,垃圾回收会比较频繁.