某个应用使cpu使用率100%
--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%的更多相关文章
- 【SQL Server】SQL Server占用CPU使用率100%的解决方法
原文:[SQL Server]SQL Server占用CPU使用率100%的解决方法 近日,帮一个客户解决了服务器CPU占用率高达100%的问题. 以前做的一个某污水处理厂自控系统项目,客户反映其自控 ...
- linux内核3.6版本及以下的bug引发的故障--cpu使用率100%
现象: 旗舰店运价库cpu使用率100%,load升高,导致后续的请求失败. 重启服务器,cpu.load恢复正常. 触发条件: (1)linux内核3. ...
- CPU 使用率 100% 怎么办
CPU 使用率 100% 怎么办 独家号 码上实战 作者 flyhero原文链接 工作中遇到CPU使用率100%,不要慌,一起来找出原因并fix掉它. 记住这里大致流程,当线上突然遇到时,也不必手足无 ...
- 记java应用linux服务单个CPU使用率100%分析
之前在做项目的过程中,项目完成后在linux服务器上做性能测试,当服务跑起来的时候发现cpu使用率很奇怪,java应用把单个cpu跑满了,其他cpu利用率0%. 刚开始遇到这问题的时候我第一时间反应使 ...
- 为什么logstash进程的CPU使用率100%?
机器上有个进程cpu使用率很高,近100%了, Tasks: 120 total, 2 running, 118 sleeping, 0 stopped, 0 zombie%Cpu(s): 99.0 ...
- SQLSERVER进程CPU使用率100%
解决SQLSERVER2008 CPU使用率99%: 1.dbcc checkdb 重建索引 2.檢查有沒有死鎖 -- sp_lock SELECT request_session_id spid , ...
- 提高CPU使用率100%
直接上脚本: #!/bin/bash while true do echo 2^2^20 | bc & >/dev/null done 查看CPU使用率用top命令即可 释放CPU: p ...
- Linux:CPU使用率100%排查方法
Linux作为一个多任务操作系统,将每个CPU的时间划分为很短的时间片,再通过调度器轮流分配给各个任务使用,因此造成多任务同时运行的错觉. CPU使用率 Linux作为一个多任务操作系统,将每个CPU ...
- java cpu 使用率100%
--宝典开始 top :查看 进程 ,选CPU使用率高的 获取进程ID,pid top -Hp pid:查看线程,选CPU使用率高的 获取线程ID,threadid printf "%X\n ...
随机推荐
- Eclipse常用插件安装_PropertiesEditor
properties文件在项目中多用做i18n国际化支持的配置文件,在properties文件中出现的中文信息都要转换为Unicode文本,一般的做法都是使用JDK自带的native2ascii工具进 ...
- easyui控件使用例子
1.easyui之dataGrid分页加载数据例子 注意:1)分页表格通过url获得数据会提交page,rows两个参数:后台需要获取这两个参数并且由此得到 int pageSize=rows/pag ...
- linux命令:mv命令
mv命令是move的缩写,可以用来移动文件或者将文件改名(move (rename) files),是Linux系统下常用的命令,经常用来备份文件或者目录. 1.命令格式: mv [选项] 源文件或目 ...
- UVA 11827 水
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- 关于接口自动化的那些事 - 基于 Python
网络请求模拟小技巧 在学习了一段时间的Python语言后,咱也大概对Python的语法和逻辑有了一定的积累,接下来,可以为接口自动化测试开始尝试做一些比较简单的准备工作啦~跟着我一起来来来~ 扩展库r ...
- js抽象工厂模式
抽象工厂模式,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂允许客户使用抽象的接口来创建一组相关产品,而不需要知道或关心实际生产出的具体产品是什么.这样客户就可以从具体 ...
- java之 Timer 类的简单使用案例
(如果您看到本文章务必看结尾!) 第一次用Timer类,记录一下个人理解. 场景:做苹果内容结果验证时,根据苹果支付凭证去苹果官方服务器验证是否支付成功.但因为苹果服务器比较慢,第 ...
- websphere6.1升级
1.到IBM websphere官方网站下载相应版本的更新包,如6.1.0-WS-WASSDK-WinX32-FP0000021.pak和6.1.0-WS-WAS-WinX32-FP0000021.p ...
- MySQL 添加、查看字段注释
语法: 创建表时的COMMENT内容,要查看这些内容,使用命令: show full fields from '表名称'; 查看tb_usr表字段注释: 创建新表的脚本中, 可在字段定义脚本中添加co ...
- Jquery中.ajax和.post详解
之前写过一篇<.NET MVC 异步提交和返回参数> ,里面有一些ajax的内容,但是不深入,这次详细剖析下jquery中$.ajax的用法. 首先,上代码: jquery-1.5.1 $ ...