分析CPU性能

top命令提供了监控CPU性能的基本功能, 如果需要更加深入的挖掘CPU的性能问题, top所提供的信息不足以做到. 由于大多数人认为CPU性能是体现服务器性能的主要因素, 所以在遇到性能问题时, 通常会首先查看CPU的性能来分析服务器的性能问题. 但事实上, 很多情况不是这样的,性能问题可能是由跟CPU相关的其他因素引起的, 比如CPU等待I/O资源.对于下面两个task:

Task 1:

dd if=/dev/urandom of=/dev/null

Task 2:

#!/bin/bash

COUNTER=0

while true

do

dd if=/dev/urandom of=/root/file.$COUNTER bs=1M count=1

COUNTER=$(( COUNTER + 1 ))

[ COUNTER = 1000 ] && exit

done

执行Task 1和Task 2后, sy都会增高, 但是执行Task 2时, wa也会增高, 这说明Task 1和Task 2都会使sy增高, 但是Task 2有时需要等待I/O资源, 所以wa也会增高.

理解CPU性能

为了监控CPU到底在做什么, 需要深入理解Linux内核是怎样工作的, 其中一个重要的组件是运行时队列(run queue), 每个CPU核有一个运行时队列, 在CPU为进程提供服务时, 进程需要首先进入运行时队列等待CPU分配CPU时间. 运行队列里包括可运行的进程(runnable process)和被阻挡的进程(blocked process). Linux的scheduler根据进程的优先级决定哪个runnable process运行, blocked process不会竞争CPU时间. top命令的load arverage是所有runnable process和blocked process的负载的总体概述. 如果需要查看哪些进程处于runnable和blocked状态, 可以通过vmstat来查看, 如:

[root@rdhl ~]# vmstat

procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----

r b swpd free buff cache si so bi bo in cs us sy id wa st

1 0 0 3747904 15492 27980 0 0 767 3 28 17 0 1 98 1 0

上下文切换和中断

在多任务操作系统中, Linux内核不断在不同进程之间进行上下文切换, 这种上下文切换需要CPU保存旧进程的上下文信息以及检索上下文信息给新进程, 因此上下文切换对CPU的性能代价是很高的. 减少上下文切换带来的性能问题最好的方法是减少上下文切换的次数, 在多核CPU架构中可以实现, 但是需要确保进程被锁定在指定CPU核上来阻止上下文切换. Linux进程调度器并不是进程发生上下文切换的唯一原因, 另一个导致上下文切换发生的原因是硬件中断(hardware interrupts). 进程调度器使用时钟中断(timer interrupt)保证每个进程能获取公平的CPU时间. 正常情况下上下文切换的次数应该小于时钟中断的次数, 如果发现上下文切换次数比时钟中断次数多, 这种负载可能是由系统需要处理很多I/O或者长时间高强度系统调用引起. 因此了解时钟中断和上下文切换的关系对找到引起系统性能问题的原因提供线索. 使用vmstat -s可以查看系统上下文切换和时钟中断次数, 这对查看高数量的上下文切换和IOWAIT的组合非常有帮助, 通过这可以判定系统试着做大量的写操作, 但是不能. 如下是vmstat -s的输出例子:

[root@rdhl ~]# vmstat -s

3924700 total memory

218964 used memory

32152 active memory

43332 inactive memory

3705736 free memory

22400 buffer memory

31492 swap cache

4063224 total swap

0 used swap

4063224 free swap

7643 non-nice user cpu ticks

0 nice user cpu ticks

1390112 system cpu ticks

15353492 idle cpu ticks

110105 IO-wait cpu ticks

0 IRQ cpu ticks

185 softirq cpu ticks

0 stolen cpu ticks

84007231 pages paged in

333713 pages paged out

0 pages swapped in

0 pages swapped out

16203245 interrupts

2121904 CPU context switches

1395818922 boot time

5780 forks

另一个查看CPU性能的指标是中断数, 中断数可以从/proc/interrupts查看,/pro/interrupts包含每种类型的中断被处理的次数. 如果中断数很高, 那表示Linux内核花很多时间处理中断而导致只有少部分时间处理其他进程.

[root@rdhl ~]# cat /proc/interrupts

CPU0 CPU1

0: 142 0 IO-APIC-edge timer

1: 7 1 IO-APIC-edge i8042

3: 1 0 IO-APIC-edge

4: 1 0 IO-APIC-edge

7: 0 0 IO-APIC-edge parport0

8: 0 0 IO-APIC-edge rtc0

9: 0 0 IO-APIC-fasteoi acpi

12: 108 2 IO-APIC-edge i8042

14: 0 0 IO-APIC-edge ata_piix

15: 107 1 IO-APIC-edge ata_piix

24: 0 0 PCI-MSI-edge pciehp

25: 0 0 PCI-MSI-edge pciehp

26: 0 0 PCI-MSI-edge pciehp

27: 0 0 PCI-MSI-edge pciehp

28: 0 0 PCI-MSI-edge pciehp

29: 0 0 PCI-MSI-edge pciehp

30: 0 0 PCI-MSI-edge pciehp

31: 0 0 PCI-MSI-edge pciehp

32: 0 0 PCI-MSI-edge pciehp

33: 0 0 PCI-MSI-edge pciehp

34: 0 0 PCI-MSI-edge pciehp

35: 0 0 PCI-MSI-edge pciehp

36: 0 0 PCI-MSI-edge pciehp

37: 0 0 PCI-MSI-edge pciehp

38: 0 0 PCI-MSI-edge pciehp

39: 0 0 PCI-MSI-edge pciehp

40: 0 0 PCI-MSI-edge pciehp

41: 0 0 PCI-MSI-edge pciehp

42: 0 0 PCI-MSI-edge pciehp

43: 0 0 PCI-MSI-edge pciehp

44: 0 0 PCI-MSI-edge pciehp

45: 0 0 PCI-MSI-edge pciehp

46: 0 0 PCI-MSI-edge pciehp

47: 0 0 PCI-MSI-edge pciehp

48: 0 0 PCI-MSI-edge pciehp

49: 0 0 PCI-MSI-edge pciehp

50: 0 0 PCI-MSI-edge pciehp

51: 0 0 PCI-MSI-edge pciehp

52: 0 0 PCI-MSI-edge pciehp

53: 0 0 PCI-MSI-edge pciehp

54: 0 0 PCI-MSI-edge pciehp

55: 0 0 PCI-MSI-edge pciehp

56: 1468 667997 PCI-MSI-edge vmw_pvscsi

57: 367182 0 PCI-MSI-edge eth0-rxtx-0

58: 13 115039 PCI-MSI-edge eth0-rxtx-1

59: 0 0 PCI-MSI-edge eth0-event-2

NMI: 0 0 Non-maskable interrupts

LOC: 13249018 2561591 Local timer interrupts

SPU: 0 0 Spurious interrupts

PMI: 0 0 Performance monitoring interrupts

IWI: 0 0 IRQ work interrupts

RES: 35986 18866 Rescheduling interrupts

CAL: 298172 228 Function call interrupts

TLB: 1052 2847 TLB shootdowns

TRM: 0 0 Thermal event interrupts

THR: 0 0 Threshold APIC interrupts

MCE: 0 0 Machine check exceptions

MCP: 285 285 Machine check polls

ERR: 0

MIS: 0

使用vmstat

虽然top能监控CPU的大部分信息, 但是不能提供更加详细的CPU信息, 而vmstat可以堪当此任. vmstat有两种使用方式, 一种是sample mode, 在这种方式中, vmstat每个一段时间获取当前系统信息, 如每隔3秒执行一次, vmstat 3. 另一种是加-s选项, 在这种方式中, vmstat获取从系统启动后的系统统计信息, 除了CPU信息, 也包含memory, I/O, swap等.

cs

上下文切换次数.

us

CPU花在用户空间的时间百分比.

sy

CPU花在系统空间的时间百分比.

id

CPU空闲百分比.

wa

CPU等待I/O的时间百分比.

linux cpu监控方案,Linux性能优化和监控系列(二)分析CPU性能相关推荐

  1. 鲲鹏性能优化十板斧(二)——CPU与内存子系统性能调优

    1.1 CPU与内存子系统性能调优简介 调优思路 性能优化的思路如下: l   如果CPU的利用率不高,说明资源没有充分利用,可以通过工具(如strace)查看应用程序阻塞在哪里,一般为磁盘,网络或应 ...

  2. 【java 性能优化实战】1 理论分析:性能优化,有哪些衡量指标、性能优化的技术手段

    指标是我们衡量很多事物,以及做出行为决策的重要参考.例如在生活中,当你打算买汽车时,会关注很多指标,比如动力性.燃油经济性.制动性.操纵稳定性.平顺性.通过性.排放与噪声等,而这些指标也都有相关的测试 ...

  3. 查看linux内存优化,Linux性能优化和监控系列(三) 分析Memory使用状况

    Linux性能优化和监控系列(三) 分析Mem 分析Memory使用状况 内存是影响服务器性能的一个主要因素, 当进程已经驻留内存或者系能够分配给进程足够的内存给它, CPU能顺利自如的运行. 如果发 ...

  4. 抖音Android岗面试性能优化篇之Rhea(新一代全能型性能分析工具)【速看】

    写在前面的话 性能优化这个知识点是很多大厂面试中都会问到的问题,尤其是想要面试抖音的Android岗的朋友. 用户交互响应的耗时,作为 Android 用户日常感知最深的一项性能指标,在日常开发中有着 ...

  5. C++应用程序性能优化(三)——C++语言特性性能分析

    C++应用程序性能优化(三)--C++语言特性性能分析 一.C++语言特性性能分析简介 通常大多数开发人员认为,汇编语言和C语言比较适合编写对性能要求非常高的程序,C++语言主要适用于编写复杂度非常高 ...

  6. 《C++应用程序性能优化::第二章C++语言特性的性能分析》学习和理解

    <C++应用程序性能优化::第二章C++语言特性的性能分析>学习和理解 说明:<C++应用程序性能优化> 作者:冯宏华等 2007年版.最近出了新版,看了目录,在前面增加了一章 ...

  7. Linux性能优化实战: 套路篇-分析性能问题的一般步骤(55)

    一.上节回顾 上一节,我们一起学习了,应用程序监控的基本思路,先简单回顾一下.应用程序的监控,可以分为指标监控和日志监控两大块. 指标监控,主要是对一定时间段内的性能指标进行测量,然后再通过时间序列的 ...

  8. 前端面试超全整理3(webpack性能优化及监控)

    21.Webpack 性能优化 核心概念 Entry :入口 output:出口 Plugins: 插件,执行范围更广的任务.插件的范围包括,从打包优化和压缩,一直到重新定义环境中的变量 Loader ...

  9. 【转】渲染性能优化:如何平衡GPU和CPU

    本节主要讲一下虚幻渲染之前,都发生了什么. 渲染流程: 首先,虚幻的渲染由三个线程共同完成.分别是CPU线程,DRAW线程,和GPU线程. CPU线程:顾名思义,运行在CPU上,用于计算游戏中的所有逻 ...

最新文章

  1. Linux Socket编程(不限Linux)
  2. 实践自定义UI—RLF...(RelativeLayout LinearLayout FrameLayout....)
  3. CNN 卷积神经网络(卷积、池化)长度、宽度、深度计算
  4. python基础之if、while、for语句
  5. MySQL innosetup_使用Inno Setup 打包jdk、mysql、tomcat、webapp等为一个exe安装包
  6. oracle数据库实例,数据库的理解
  7. Python标准库参考-sched
  8. ie浏览器打字不显示文字框命令
  9. SQL重复记录处理(查找,过滤,删除)
  10. airpin linux电脑,AirPinPcSender
  11. 复现KM3D:Monocular 3D Detection with Geometric Constraints Embedding and Semi-supervised Training
  12. 使用TIMESTAMPDIFF计算两个时间戳之间的时间间隔需要注意的细节
  13. Rails 中的 RJS 模板
  14. 1003 Emergency (25 point(s))
  15. web-sso 系统集成 单点登录
  16. Redis 源码解读之 Rehash 的调用时机
  17. Android 中触摸事件与点击事件分析
  18. 蚂蚁金服首席架构师何昌华:开源 SQLFlow 是牛刀初试,实时大数据系统才是未来基石...
  19. js高级jQuery框架easyUI框架
  20. 用 iOS 系统自动化解救钉钉打卡族

热门文章

  1. 如何操作别人计算机,如何远程控制别人的电脑【图解】
  2. java ascii码转字符_一文让你读懂JAVA.IO、字符编码、
  3. python模块安装
  4. 烟花散尽漫说无(參考资料)
  5. [myeclipse] 官方中文网站
  6. [原]敏捷开发-项目启动
  7. 【面试刷题复习】更新中 2021.8.30
  8. android 发送显示广播,如何查看Android系统当前发送了什么广播
  9. 初始化与赋值哪个效率高?
  10. got、plt表介绍