linux 使cpu使用率升高_关于linux系统CPU篇---gt;CPU使用率升高
1.CPU使用率为单位时间内CPU使用情况的统计,以百分比的方式展示。
LINUX作为一个多任务操作系统,将每个CPU的时间划分为很短的时间片,再通过调度器轮流分配给各个任务使用,因此造成多任务同时运行的错觉
2.如何查看CPU使用率?
TOP和PS是最常用的性能分析工具。TOP显示了系统总体的CPU和内存使用情况,以及各个进程的资源使用情况
PS则只显示了每个进程的资源使用情况
pidstat是专门分析每个进程的CPU使用情况的工具
TOP输出:
# 默认每 3 秒刷新一次
$ top
top - 11:58:59 up 9 days, 22:47, 1 user, load average: 0.03, 0.02, 0.00
Tasks: 123 total, 1 running, 72 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.3 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 8169348 total, 5606884 free, 334640 used, 2227824 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 7497908 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 78088 9288 6696 S 0.0 0.1 0:16.83 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.05 kthreadd
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H
TOP默认显示的是所有CPU的平均值,这时候按下1,就可以切换到每个CPU的使用率了
下面的pidstat命令,就间隔1秒,展示了进程的5组CPU使用率,包括:
%usr用户态CPU使用率
%system 系统CPU使用率
%guest 运行虚拟机CPU使用率
%wait 等待IO CPU使用率
%cpu 总的CPU使用率
最后的average部分,还计算了5组数据的平均值
pidstat输出:
# 每隔 1 秒输出一组数据,共输出 5 组
$ pidstat 1 5
15:56:02 UID PID %usr %system %guest %wait %CPU CPU Command
15:56:03 0 15006 0.00 0.99 0.00 0.00 0.99 1 dockerd
...
Average: UID PID %usr %system %guest %wait %CPU CPU Command
Average: 0 15006 0.00 0.99 0.00 0.00 0.99 - dockerd
3.CPU使用率过高怎么办?
使用top,ps,pidstat等工具,能够轻松找到占用CPU使用率较高(100%)的进程,接下来,你可能想知道占用CPU的是哪个函数呢,找到它,才能更有效,更针对性的进行性能优化。
那么那种工具最适合在第一时间分析进程的CPU问题呢,推荐的是perf。perf是linux2.6.31以后内置的性能分析工具,包含了perf top ,perf record,perf report
第一种:perf top,类似于top,它能够实时显示占用CPU时钟最多的函数或者指令,因此可以用来查找热点函数,使用界面如下:
$ perf top
Samples: 833 of event 'cpu-clock', Event count (approx.): 97742399
Overhead Shared Object Symbol
7.28% perf [.] 0x00000000001f78a4
4.72% [kernel] [k] vsnprintf
4.32% [kernel] [k] module_get_kallsym
3.65% [kernel] [k] _raw_spin_unlock_irqrestore
...
输出结果中,第一行包含三个数据,分别是采样数,事件类型和事件总数量,输出中可以看到perf采集了833个CPU时钟事件,而总事件数则为97742399
如果输出结果中,采样数(Samples)只有10几个,那下面的排序和百分比就没什么实际参考价值
Overhead:该符号的性能事件,在所有采样中的比例,用百分比来展示
Shared:该函数或指令所在的动态共享对象(Dynamic Shared Object),如内核,进程名,动态连接库名,内核模块名等
Object:动态共享对象的类型。比如[.]表示用户空间的可执行程序,或者动态链接库,而[k]则表示内核空间
Symbol:是符号名,也就是函数名。当函数名未知时,用十六进制地址表示
从上面的输出中可以看到,占用CPU最多的是perf工具自身,不过它的比例也只有7.28%,说明系统并没有CPU性能问题。
第二种常见用法:也就是perf record和perf report
perf record 提供了保存数据的功能,保存后的数据,可以用perf report 解析展示
4.案例分析:
(1).使用两台linux虚拟机,其中一台用作web服务器,模拟性能问题。需要安装docker,nginx,perf,sysstat等工具
另外一台用作客户端,需要安装ab,curl
(2).在第一台虚拟机中执行下面命令运行nginx和php应用:
docker run --name nginx -p 10000:80 -itd feisky/nginx
docker run --name phpfpm -itd --network container:nginx feisky/php-fpm
(3).在第二台虚拟机(客户端)执行curl 命令,确认nginx已经正常启动:
# 192.168.0.10 是第一台虚拟机的 IP 地址
$ curl http://192.168.0.10:10000/
It works!
(4).测试nginx服务的性能:
# 并发 10 个请求测试 Nginx 性能,总共测试 100 个请求
$ ab -c 10 -n 100 http://192.168.0.10:10000/
This is ApacheBench, Version 2.3
Copyright 1996 Adam Twiss, Zeus Technology Ltd,
...
Requests per second: 11.63 [#/sec] (mean)
Time per request: 859.942 [ms] (mean)
...
从ab的结果输出中,发现nginx能承受的每秒平均请求数只有11.63.性能比较差
(5)继续执行ab,将请求数增加到10000,这样在第一个终端使用性能分析工具时,nginx压力还是继续
ab -c 10 -n 10000 http://192.168.0.10:10000/
(6).回到第一个终端运行top命令,并按下数字1,切换到每个CPU的使用率:
$ top
...
%Cpu0 : 98.7 us, 1.3 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 99.3 us, 0.7 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
...
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
21514 daemon 20 0 336696 16384 8712 R 41.9 0.2 0:06.00 php-fpm
21513 daemon 20 0 336696 13244 5572 R 40.2 0.2 0:06.08 php-fpm
21515 daemon 20 0 336696 16384 8712 R 40.2 0.2 0:05.67 php-fpm
21512 daemon 20 0 336696 13244 5572 R 39.9 0.2 0:05.87 php-fpm
21516 daemon 20 0 336696 16384 8712 R 35.9 0.2 0:05.61 php-fpm
发现占用CPU最多的是PHP-fpm进程
(7).怎么知道是php-fpm的那个函数导致了CPU使用率升高呢,我们来用perf分析一下。在第一个终端运行下面的perf命令
# -g 开启调用关系分析,-p 指定 php-fpm 的进程号 21515
$ perf top -g -p 21515
(8).按方向键切换到php-fpm,再按下会车键展开php-fpm的调用关下,发现调用关系最终到了sqrt和add_function
(9).拷贝出nginx应用的源码,看看是不是调用了这两个函数:
# 从容器 phpfpm 中将 PHP 源码拷贝出来
$ docker cp phpfpm:/app .
# 使用 grep 查找函数调用
$ grep sqrt -r app/ # 找到了 sqrt 调用
app/index.php: $x += sqrt($x);
$ grep add_function -r app/ # 没找到 add_function 调用,这其实是 PHP 内置函数
原来只有sqrt函数在ap/idex.php文件中调用了。看看这个文件的源码:
$ cat app/index.php
// test only.
$x = 0.0001;
for ($i = 0; $i <= 1000000; $i++) {
$x += sqrt($x);
}
echo "It works!"
发现原来是测试代码没删就直接发布应用了。
(10).优化:
# 停止原来的应用
$ docker rm -f nginx phpfpm
# 运行优化后的应用
$ docker run --name nginx -p 10000:80 -itd feisky/nginx:cpu-fix
$ docker run --name phpfpm -itd --network container:nginx feisky/php-fpm:cpu-fix
(11).重新在第二台虚拟机中测试nginx性能:
$ ab -c 10 -n 10000 http://10.240.0.5:10000/
...
Complete requests: 10000
Failed requests: 0
Total transferred: 1720000 bytes
HTML transferred: 90000 bytes
Requests per second: 2237.04 [#/sec] (mean)
Time per request: 4.470 [ms] (mean)
Time per request: 0.447 [ms] (mean, across all concurrent requests)
Transfer rate: 375.75 [Kbytes/sec] received
...
从这里可以发现,现在每秒的请求数,已经从原来的11变成了2237
总结:
CPU使用率是最直观和最常用的系统性能指标,更是我们在排查系统性能问题时。通常会关注的第一个指标。所以我们要熟悉它的含义,尤其要弄清楚用户(user%)、NIce(%nice)、系统(%system),等待IO(%iowait),中断(%irq),软中断(%softirq)
这几种不同的CPU使用率。
(1).用户和Nice CPU高,说明用户进程占用了较多的CPU,所以应该着重排查进程的性能问题
(2).系统CPU高,说明内核态占用了较多的CPU,所以应该着重排查内核线程或系统调用的性能问题
(3).IO等待CPU高,说明等待IO的时间比较长,应该着重排查系统存储是不是出现了IO问题
(4).软中断和硬中断高,说明软中断或硬中断处理程序占用了较多的CPU,所以应该着重排查内核中的中断服务程序
碰到CPU使用率升高的问题,可以借助TOP,pidstat等工具,确认引发CPU性能问题的来源,再使用perf等工具,排查出引起性能问题的具体函数
标签:php,perf,0.0,nginx,linux,使用率,CPU
来源: https://www.cnblogs.com/maxwellsky/p/10658523.html
linux 使cpu使用率升高_关于linux系统CPU篇---gt;CPU使用率升高相关推荐
- linux平均负载什么意思_在Linux中什么是平均负载?
linux平均负载什么意思 Load Average in Linux is a metric that is used by Linux users to keep track of system ...
- linux运维工程师培训课程_《Linux运维工程师必学技能》完整版视频课程专题(1.0)...
高性能负载均衡集群HAProxy实战视频课程 13节 4小时7分钟 课程目标: 欢迎大家加入 51CTO学院Linux交流群575837909,与喜欢学习Linux小伙伴们做朋友,一起为梦想增值.高性 ...
- linux mysql 文件夹权限_找到linux文件夹
FineReport关于Linux下字体乱码终极解决方案 1:在windows下找到系统使用到的字体,这里以楷体举例 •到c盘的windows文件夹的Fonts文件夹里面存放了windows中用到的所 ...
- linux内核锁死怎么解决_解决Linux内核中的2038年问题
linux内核锁死怎么解决 由于时间在Linux中的表示方式,带符号的32位数字无法支持20:38(UTC)3:14:07之后的时间. 2038年 (Y2038或Y2K38)问题是关于时间数据类型表示 ...
- arm linux udp 自发自收_嵌入式linux编程开发必备知识
嵌入式linux是嵌入式开发必不可少的一份子,在科技高速发展的今天,嵌入式已然已经成为了最热门的技术之一了.对于想要学习好嵌入式的学员来说,现在学习好linux是很有必要的,因为这个是嵌入式的核心.那 ...
- linux QT 结束当前进程_嵌入式linux编程开发必备知识
嵌入式linux是嵌入式开发必不可少的一份子,在科技高速发展的今天,嵌入式已然已经成为了最热门的技术之一了.对于想要学习好嵌入式的学员来说,现在学习好linux是很有必要的,因为这个是嵌入式的核心.那 ...
- linux扩展磁盘空间命令_在Linux上监视磁盘空间– SQL Server DBA的有用命令
linux扩展磁盘空间命令 In this article, we will explore the different Linux commands related to the disk spac ...
- linux:使用yum安装_首次使用Linux:30个安装案例
linux:使用yum安装 Linux内核在8月25日(星期六)再大一岁.26年前,创建者和BDFL Linus Torvalds可能已经感觉到Linux只能满足一个人的需求. 但是今天我们知道,它改 ...
- linux设置nexus开机自启动_在linux中使用nexus搭建maven私服
首先介绍下为什么要搭建maven私服,简单点说就是就是把项目工程中的Jar包放在一个服务器上,每次Jar包的修改都能去私服上面Down到本地.可以对整个项目组的人形成一个统一的管理. 2.下载完之后就 ...
- 宝塔Linux面板公司,宝塔面板_宝塔Linux面板-九州数码,一站式云安全服务平台
安装方法 1. 九州数码云服务器提供预装好宝塔面板的系统模板,可直接安装使用: 2. 若您需要单独安装宝塔面板,请按照以下流程操作: 使用SSH链接工具(查看),如宝塔远程桌面助手链接到您的linux ...
最新文章
- paddle一体安装
- 面试官:BigDecimal一定不会丢失精度吗?
- 《大数据时代》----重要理念摘抄
- 反击CobaltStrike
- Go的GAPATH详解
- ARM Linux 如何--注册和触发--软中断
- AA.Dapper升级了
- oracle 会话 lock,相克军_Oracle体系_随堂笔记014-锁 latch,lock
- JDBC编程可能遇到的错误:java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or ..
- Oracle listener
- c语言 int a 5,在C语言中,有如下的写法:int a = 5; int *pa; pa = (a + 1);
- 你还在为Springboot服务吞吐量而烦扰吗?如何提升本文告诉你
- 学好英语网html首页制作,首页英语
- 中兴新支点操作系统_中兴新支点操作系统下载
- spring mvc 扫描与注解
- 2019西安交大计算机专业研究生分数线,2019西安交通大学研究生分数线汇总(含2016-2019历年复试)...
- web前端html5+css3学习笔记(2)
- 买的香港云服务器怎么用?云服务器使用教程
- pandas 的基本使用
- 示波器探头校准-调节补偿电容
热门文章
- spring map使用annotation泛型注入问题分析
- SQL开发中容易忽视的一些小地方( 三)
- 获得Web目录URL
- 常用的服务器系统,常用的服务器操作系统
- jedis jedispool Redistemplate
- 文本怎么换成html,编辑html格式文本可改成txt格式(可以替换或更换某文本)新手...
- 百度蜘蛛网站分两个服务器,SEOer需要将百度蜘蛛抓取时间降低到1秒以下
- 定期定量采购_?采购计划员必备:各种物料采购计划与订单制定的技巧与方法...
- php_self nginx,nginx中的PATH_INFO为什么会影响$_SERVIER['PHP_SELF']
- python xpath定位打印元素_python基础教程:8种selenium元素定位的实现