--CPU使用率

Linux是一个多任务的操作系统,将每个cpu的时间划分为很短的时间片,再通过调度器轮流分配给各个任务使用,因此造成多任务同时运行的错觉

为了维护cpu时间,linux通过事先定义的节拍率(内核中表示为HZ),触发时间中断,并使用全局变量jiffies记录了开机以来的节拍数

[root@rac2 ~]# grep 'CONFIG_HZ=' /boot/config-$(uname -r) #默认值

CONFIG_HZ=1000

Linux通过/proc虚拟文件系统,向用户空间提供了系统内部状态的信息,而/proc/stat就提供了系统的cpu和任务统计信息。只关注cpu的话。

[root@rac2 ~]# cat /proc/stat |grep ^cpu

cpu  754068 26 321049 32751985 349040 51226 32180 0 0

cpu0 398928 11 184461 16311267 198855 49476 17588 0 0

cpu1 355140 14 136588 16440717 150185 1750 14591 0 0

第一列是cpu的编号,如cpu0,cpu1,第一行没有编号的cpu,表示的所有cpu的累加。

其他列则表示不同场景下cpu的累加,单位是USER_HZ,10ms

解读重要指标

--user(us),代表用户态cpu时间。不包括下面的nice时间,但包括guest时间

--nice(ni),代表低优先级用户态cpu时间,也就是进程的nice值被调整为1-19之间时的cpu时间,nice的取值范围-20-19,数值越大,优先级反而越低。

--system(sys),内核态cpu时间

--idle(id),代表空闲时间,不包括等待IO的时间(iowait)

--iowait(wa),等待io的cpu时间

--irq(hi),处理硬中断的cpu时间

--softirq(si),处理软中断的cpu时间

--steal(st),当系统运行在虚拟机中的时候,被其他虚拟机占用的cpu时间

--guest(guest),通过虚拟化运行其他操作系统时,也就是虚拟机的cpu时间

--guest_nice(gnice),代表以低优先级运行虚拟机的实际

事实上,为了计算cpu使用率,性能工具一般都会取间隔一段时间(比如3秒)的两次值,作差后,再计算出这段时间内的平均cpu使用率。

要查看cpu使用率,就必须先读取/proc/stat 和/proc/[pid]/stat这两个文件,然后再安装上面的公式计算出来?

当然不是,各种各样的性能分析工具已经计算好了,不过要注意的是,性能分析工具给出的是间隔一段时间的平均cpu使用率,所以要注意间隔时间的设置,特别是多个工具对比分析时,一定要保证相同的时间间隔。

--怎么查看cpu使用率

使用top和ps工具

--top显示了系统总体的cpu和内存使用情况,以及各个进程的资源使用情况

--ps则是显示了每个进程的资源使用情况

#默认每隔3秒刷新一次

[root@rac2 ~]# top

top - 06:18:35 up 2 days,  5:03,  2 users,  load average: 0.08, 0.14, 0.08

Tasks: 233 total,   1 running, 232 sleeping,   0 stopped,   0 zombie

Cpu(s):  1.2%us,  0.5%sy,  0.0%ni, 97.1%id,  0.9%wa,  0.2%hi,  0.2%si,  0.0%st

Mem:   3088656k total,  2956404k used,   132252k free,    69208k buffers

Swap:  3096568k total,   203548k used,  2893020k free,  1056600k cached

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND

2659 grid      -2   0 1306m  14m  12m S  1.3  0.5  37:06.99 oracle

4388 oracle    -2   0 1467m  16m  14m S  1.0  0.6  38:34.12 oracle

2436 grid      RT   0 1088m 111m  54m S  0.7  3.7   3:41.91 ocssd.bin

2570 root      RT  -5  563m 151m  63m S  0.7  5.0  30:36.42 ologgerd

2711 root      20   0 1180m  60m  18m S  0.7  2.0  13:23.94 crsd.bin

4529 oracle    20   0 1474m 122m 114m S  0.7  4.0   1:23.54 oracle

11 root      20   0     0    0    0 S  0.3  0.0  16:18.60 events/0

2021 root      20   0 1146m  43m  14m S  0.3  1.4   8:07.94 ohasd.bin

2382 root      20   0 1118m  40m  13m S  0.3  1.4   4:18.61 orarootagent.bi

2607 root      20   0  752m  25m  10m S  0.3  0.8   5:02.89 octssd.bin

2628 grid      20   0 1093m  29m  12m S  0.3  1.0   5:24.73 evmd.bin

2671 grid      20   0 1314m  24m  15m S  0.3  0.8   3:25.34 oracle

2675 grid      -2   0 1321m  27m  14m S  0.3  0.9   7:28.67 oracle

4404 oracle    20   0 1479m  30m  20m S  0.3  1.0   3:21.32 oracle

1 root      20   0 19356 1184  920 S  0.0  0.0   0:01.71 init

第三行%cpu就是系统的cpu使用率

每一个进程都有一个%cpu使用率,表示进程的cpu使用率,它是用户态和内核态cpu使用率的总和,包括进程用户空间使用的cpu、通过系统调用执行的内核空间cpu、以及在就绪队列等待运行的cpu。在虚拟化环境汇总,它还包括了运行虚拟机时占用的cpu。

这里可以发现,top没有细分进程的用户态cpu和内核态cpu,可以使用pidstat

--用户态cpu使用率(%usr)

--内核态cpu使用率(%system)

--运行虚拟机cpu使用率(%guest)

--等待cpu使用率(%wait)

--以及总的cpu使用率(%CPU)

最后的average部分,还计算了5组数据的平均值

[root@rac2 ~]# pidstat 1 5

Linux 2.6.32-431.el6.x86_64 (rac2) 12/12/2018 _x86_64_ (2 CPU)

06:34:54 AM       PID    %usr %system  %guest    %CPU   CPU  Command

06:34:55 AM      2382    0.99    0.00    0.00    0.99     1  orarootagent.bi

06:34:55 AM      2570    0.99    0.00    0.00    0.99     0  ologgerd

06:34:55 AM      2628    0.99    0.00    0.00    0.99     1  evmd.bin

06:34:55 AM      2659    0.99    0.99    0.00    1.98     0  oracle

06:34:55 AM      4388    0.00    0.99    0.00    0.99     0  oracle

。。。

Average:          PID    %usr %system  %guest    %CPU   CPU  Command

Average:           11    0.00    0.60    0.00    0.60     -  events/0

Average:         1434    0.20    0.00    0.00    0.20     -  java

Average:         2379    0.20    0.20    0.00    0.40     -  gipcd.bin

Average:         2395    0.40    0.60    0.00    1.00     -  osysmond.bin

Average:         2570    0.80    0.40    0.00    1.20     -  ologgerd

Average:         2607    0.20    0.00    0.00    0.20     -  octssd.bin

Average:         2659    0.20    1.00    0.00    1.20     -  oracle

Average:         2669    0.20    0.00    0.00    0.20     -  oracle

CPU使用率过高怎么办

通过top、ps、pidstat等工具,可以找到cpu使用率较高(比如100%)的进程。接下来,你可能又想知道,占用cpu的到底是代码里的哪个函数呢?找到它,才能更高效、更针对的优化。

推荐工具perf,是linux2.6.31以后内置的性能分析工具,它以性能事件采样为基础,不仅可以分析系统的各种事件和内核性能,还可以用来分析指定应用程序的性能问题。

[root@mysqlhq ~]# yum install perf -y

[root@mysqlhq ~]# ps -ef|grep mysql

[root@mysqlhq ~]# perf top -p 4122

Samples: 746  of event 'cpu-clock', Event count (approx.): 75362059

Overhead  Shared Object       Symbol

43.43%  [kernel]            [k] find_get_pages

10.55%  [kernel]            [k] radix_tree_next_chunk

1.87%  mysqld              [.] lfind

1.75%  libc-2.17.so        [.] __memcpy_ssse3_back

1.67%  mysqld              [.] MYSQLparse

1.27%  [kernel]            [k] mpt_put_msg_frame

0.97%  mysqld              [.] my_hash_sort_utf8

0.77%  [kernel]            [k] finish_task_switch

0.74%  mysqld              [.] Protocol::net_store_data

0.74%  [kernel]            [k] _raw_spin_unlock_irqrestore

0.67%  mysqld              [.] mtr_commit

0.62%  mysqld              [.] alloc_root

0.62%  mysqld              [.] close_thread_table

0.61%  [kernel]            [k] system_call_after_swapgs

0.60%  mysqld              [.] Protocol::store_string_aux

0.59%  mysqld              [.] page_cur_search_with_match

0.55%  mysqld              [.] buf_page_get_gen

0.48%  [kernel]            [k] fget_light

0.46%  mysqld              [.] my_strcasecmp_utf8

0.45%  [kernel]            [k] xlog_space_left

0.44%  mysqld              [.] btr_cur_search_to_nth_level

0.43%  mysqld              [.] show_status_array

0.42%  mysqld              [.] sync_array_print_long_waits

0.42%  [kernel]            [k] kmem_cache_alloc

0.40%  libc-2.17.so        [.] __memcmp_sse4_1

0.40%  mysqld              [.] THD::enter_stage

0.37%  mysqld              [.] Item_cond::fix_fields

0.35%  [kernel]            [k] do_sys_poll

0.34%  libc-2.17.so        [.] malloc

0.34%  mysqld              [.] btr_search_guess_on_hash

第一行包含3个数据,分别是采样数据Samples,事件类型event和事件总数 Event count,比如这个例子中,perf总共采集了476个cpu时钟事件,而总事件数是75362059

--Overhead,是该符号的性能事件所在所有采样中的比例,用百分比来表示

--Shared,是该函数或指令所在的动态共享对象(Dynamic Shared Object),如内核、进程名、动态链接库名、内核模块名等。

--Object,是动态共享对象的类型,比如[.]表示用户空间的可执行程序、或者动态链接库,而[k]则表示内核空间

--Symbol 是符号名,也就是函数名,当函数名未知时,用十六进制的地址来表示

[root@mysqlhq ~]# perf top

Samples: 1K of event 'cpu-clock', Event count (approx.): 189946503

Overhead  Shared Object               Symbol

9.06%  [kernel]                    [k] find_get_pages

3.46%  [kernel]                    [k] __do_softirq

3.27%  [kernel]                    [k] _raw_spin_unlock_irqrestore

2.83%  [kernel]                    [k] finish_task_switch

2.83%  [kernel]                    [k] radix_tree_next_chunk

1.74%  perf                        [.] __symbols__insert

1.64%  [kernel]                    [k] clear_page

1.49%  [kernel]                    [k] kallsyms_expand_symbol.constprop.1

1.16%  libc-2.17.so                [.] __memcpy_ssse3_back

1.16%  libslang.so.2.2.4           [.] SLsmg_write_

第二种常见用法,就是perf recodr和perf report,perf top虽然实时展示了系统的性能信息,但它的缺点是不保存信息,也就无法用于离线或者后续的分析。

[root@mysqlhq ~]# perf record #ctrl+c终止

[root@mysqlhq ~]# perf record

^C[ perf record: Woken up 11 times to write data ]

[ perf record: Captured and wrote 3.328 MB perf.data (53866 samples) ]

[root@mysqlhq ~]# perf report --sort comm,dso,symbol | head -100

no symbols found in /usr/bin/cut, maybe install a debug package?

no symbols found in /usr/sbin/rngd, maybe install a debug package?

Failed to open /tmp/perf-2276.map, continuing without symbols

# To display the perf.data header info, please use --header/--header-only options.

#

#

# Total Lost Samples: 0

#

# Samples: 53K of event 'cpu-clock'

# Event count (approx.): 13466500000

#

# Overhead  Command        Shared Object                  Symbol

# ........  .............  .............................  ..............................................

#

98.21%  swapper        [kernel.kallsyms]              [k] native_safe_halt

0.25%  mysqld         [kernel.kallsyms]              [k] find_get_pages

0.06%  mysqld         [kernel.kallsyms]              [k] radix_tree_next_chunk

0.05%  swapper        [kernel.kallsyms]              [k] _raw_spin_unlock_irqrestore

0.04%  swapper        [kernel.kallsyms]              [k] __do_softirq

0.02%  mysql          libc-2.17.so                   [.] __strncmp_sse42

0.02%  swapper        [kernel.kallsyms]              [k] tick_nohz_idle_exit

0.02%  swapper        [kernel.kallsyms]              [k] rcu_process_callbacks

0.02%  swapper        [kernel.kallsyms]              [k] run_timer_softirq

0.02%  sh             [kernel.kallsyms]              [k] __do_page_fault

0.02%  rcu_sched      [kernel.kallsyms]              [k] finish_task_switch

--案例

利用[root@mysqlhq ~]# perf top -p 4122 (mysql进程号),找出具体的函数

[root@mysqlhq ~]# ps -ef|grep mysql

[root@mysqlhq ~]# perf top -p 4122

Samples: 746  of event 'cpu-clock', Event count (approx.): 75362059

Overhead  Shared Object       Symbol

43.43%  [kernel]            [k] find_get_pages

10.55%  [kernel]            [k] radix_tree_next_chunk

1.87%  mysqld              [.] lfind

1.75%  libc-2.17.so        [.] __memcpy_ssse3_back

1.67%  mysqld              [.] MYSQLparse

1.27%  [kernel]            [k] mpt_put_msg_frame

0.97%  mysqld              [.] my_hash_sort_utf8

0.77%  [kernel]            [k] finish_task_switch

0.74%  mysqld              [.] Protocol::net_store_data

0.74%  [kernel]            [k] _raw_spin_unlock_irqrestore

0.67%  mysqld              [.] mtr_commit

0.62%  mysqld              [.] alloc_root

0.62%  mysqld              [.] close_thread_table

0.61%  [kernel]            [k] system_call_after_swapgs

0.60%  mysqld              [.] Protocol::store_string_aux

0.59%  mysqld              [.] page_cur_search_with_match

0.55%  mysqld              [.] buf_page_get_gen

0.48%  [kernel]            [k] fget_light

0.46%  mysqld              [.] my_strcasecmp_utf8

0.45%  [kernel]            [k] xlog_space_left

0.44%  mysqld              [.] btr_cur_search_to_nth_level

0.43%  mysqld              [.] show_status_array

0.42%  mysqld              [.] sync_array_print_long_waits

0.42%  [kernel]            [k] kmem_cache_alloc

0.40%  libc-2.17.so        [.] __memcmp_sse4_1

0.40%  mysqld              [.] THD::enter_stage

0.37%  mysqld              [.] Item_cond::fix_fields

0.35%  [kernel]            [k] do_sys_poll

0.34%  libc-2.17.so        [.] malloc

0.34%  mysqld              [.] btr_search_guess_on_hash

--小结

CPU使用率是最直观和最常用的系统性能指标,更是我们在排查性能问题时,通常会关注的第一个指标,所以我们要熟悉它的含义,弄清楚几种不同的cpu使用率。

--用户(%user),nice(%nice),系统(%system),等待io(%iowait),中断(%irq),软中断(%softirq)

比如说:

--用户cpu和nice cpu高,说明用户态进程占用了较多的cpu,所以应该这重排查进程的性能问题

--系统cpu高,说明内核态占用了较多的cpu,所以应该着重排查内核线程或者系统调用的问题

--io等待cpu高,说明等待io的时间比较长,应该重点排查系统存储是不是出现了问题

--软中断和硬中断高,说明软、硬中断的处理程序占用了较多的cpu,应排查内核中的中断服务程序。

某个应用使cpu使用率100%的更多相关文章

  1. 【SQL Server】SQL Server占用CPU使用率100%的解决方法

    原文:[SQL Server]SQL Server占用CPU使用率100%的解决方法 近日,帮一个客户解决了服务器CPU占用率高达100%的问题. 以前做的一个某污水处理厂自控系统项目,客户反映其自控 ...

  2. linux内核3.6版本及以下的bug引发的故障--cpu使用率100%

    现象:         旗舰店运价库cpu使用率100%,load升高,导致后续的请求失败.         重启服务器,cpu.load恢复正常. 触发条件:        (1)linux内核3. ...

  3. CPU 使用率 100% 怎么办

    CPU 使用率 100% 怎么办 独家号 码上实战 作者 flyhero原文链接 工作中遇到CPU使用率100%,不要慌,一起来找出原因并fix掉它. 记住这里大致流程,当线上突然遇到时,也不必手足无 ...

  4. 记java应用linux服务单个CPU使用率100%分析

    之前在做项目的过程中,项目完成后在linux服务器上做性能测试,当服务跑起来的时候发现cpu使用率很奇怪,java应用把单个cpu跑满了,其他cpu利用率0%. 刚开始遇到这问题的时候我第一时间反应使 ...

  5. 为什么logstash进程的CPU使用率100%?

    机器上有个进程cpu使用率很高,近100%了, Tasks: 120 total, 2 running, 118 sleeping, 0 stopped, 0 zombie%Cpu(s): 99.0 ...

  6. SQLSERVER进程CPU使用率100%

    解决SQLSERVER2008 CPU使用率99%: 1.dbcc checkdb 重建索引 2.檢查有沒有死鎖 -- sp_lock SELECT request_session_id spid , ...

  7. 提高CPU使用率100%

    直接上脚本: #!/bin/bash while true do echo 2^2^20 | bc & >/dev/null done 查看CPU使用率用top命令即可 释放CPU: p ...

  8. Linux:CPU使用率100%排查方法

    Linux作为一个多任务操作系统,将每个CPU的时间划分为很短的时间片,再通过调度器轮流分配给各个任务使用,因此造成多任务同时运行的错觉. CPU使用率 Linux作为一个多任务操作系统,将每个CPU ...

  9. java cpu 使用率100%

    --宝典开始 top :查看 进程 ,选CPU使用率高的 获取进程ID,pid top -Hp pid:查看线程,选CPU使用率高的 获取线程ID,threadid printf "%X\n ...

随机推荐

  1. Ubuntu或Linux搭建网站环境常见问题详解

    本屌丝常见的问题已经全部记录如下,如大家有其他问题欢迎随时跟我进行交流. 1.无法进行软件源安装  提示信息:Package has no installation candidate 具体信息如下: ...

  2. 搭建TXManager分布式事务协调者

    事务分组id 缓存到redis 需要配置连接到自己的 redis地址 启动后:

  3. EF与手写Model的区别以及联系

    1.在数据库表名上,EF是随意的,但是如果是Model的话,就应该在建立数据库的时候考虑到讲数据库表名变为复数,如Movie.cs 数据库应该为Movies

  4. myEclipse 2014 破解教程

    因为经常在不同电脑里安装配置下载myEclipse,所以干脆记录下来,一直找度娘也是很麻烦的. 此教程仅对myEclipse2014 有效. 破解工具:https://pan.baidu.com/s/ ...

  5. Educational Codeforces Round 15 A, B , C 暴力 , map , 二分

    A. Maximum Increase time limit per test 1 second memory limit per test 256 megabytes input standard ...

  6. 6.0动态加载权限用PermissionGen

    ndroid 6.0 新增加了运行时的动态添加权限,在此介绍一个第三方库,PermissionGen,可以很方便简洁的增加 6.0权限 首先给大家上  PermissionGen 库地址:https: ...

  7. Ubuntu 中查看内核版本和系统版本的四个命令

    一.查看内核版本:cat /proc/version 二.查看内核版本:uname -a 三.查看系统版本:lsb_release -a 四.查看发行版类型:cat /etc/issue

  8. SQL授权语句(MySQL基本语句)

    看他们网上的,写得都是千篇一律,同时,好多也写得不是很好,下面是我自己总结的有关mysql的使用细节,也是我在学习过程中的一些记录吧,希望对你有点帮助,后面有关存储过程等相关操作还没有总结好,下次总结 ...

  9. UML类图(二)----------类与类之间的关系之关联(聚合与组合)

    类与类之间的关系: 在软件系统中,类并不是孤立存在的,类与类之间存在各种关系,对于不同类型的关系,UML提供了不同的表示方式.       1. 关联关系 关联(Association)关系是类与类之 ...

  10. python中sort()方法的cmp参数

    <python基础编程>里有讲到一段高级排序: “如果希望元素能按照特定的方式进行排序(而不是sort函数默认的方式,即根据python的默认排序规则按升序排列元素,第5章内对此进行讲解) ...