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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/427977.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件测试之逻辑覆盖测试理论总结(白话文)

1.语句覆盖 语句覆盖就是所有可执行的语句都可以得到一次执行。注意可执行那三个字就可以&#xff0c;因为可能有的判定条件比较狗&#xff0c;它下面的分支的语句无论如何都不会执行。 例如这随手就能写出一个: if(x>100&&x<100) {x100; }当然实际上一般不会有…

datatables 的导出button自定义

1.dom 方式 $(#myTable).DataTable( {dom: Bfrtip,buttons: [copy, excel, pdf] } ); 2.手动插入 var table $(#example).DataTable( {buttons: [copy, excel, pdf] } );table.buttons().container().appendTo( $(.col-sm-6:eq(0), table.table().container() ) ); $(#myTable…

excel显著性检验_#如何用excel做anova分析#用excel做显著性分析

如何用Excel做方差分析&#xff1f;&#xff1f;方差分析的步骤&#xff1a;(1)分别计算行与列平方和。行平方与组差相似&#xff0c;是每值与总体均值的离差平方和&#xff0c;列平方和是每列的均值与总体均值的离差平方和。(2)总的平方和的计算与单因素方差分析一样&#xff…

软件测试之控制流图以及环形复杂度独立路径求解问题

首先需要明确的是&#xff0c;控制流图并不等于流程图&#xff0c;可以理解为控制流图的出现是为了后续的环形复杂度的计算和写出独立路径和配以相应的测试用例。 所以控制流图是核心&#xff0c;画图的时候务必谨慎再谨慎&#xff0c;要不然可能你后面的全部崩盘。 控制流图考…

MS Code 使用 TFVC 插件时遇到的问题

使用 TFVC 插件&#xff0c; 在 singin 时提示 &#xff1a; “It appears you have configured a non-English version of the TF executable. Please ensure an English version is properly configured.” 这是 Code 的问题&#xff0c; 官方解释&#xff1a; https://gith…

server的自增主键返回函数 sql_SQL自增主键函数

自动生成编码的主键函数比如CRM00001CRM00002CRM00003create table IntKey(KeyChar char(10))gocreate function GetKey()returns char(10)asbegindeclare KeyValue intdeclare KeyReturn varchar(20)set KeyValue cast(isnull((select max(KeyChar) from IntKey),0) as int) …

软件测试之黑盒测试-等价类划分法

首先&#xff0c;明确等价类分为有效等价类和无效等价类两种&#xff0c;一般无效等价类都是根据有效等价类写出来的。为了严谨&#xff0c;在白话文之前还是附个定义吧&#xff0c;以免误人子弟。 说白了&#xff0c;有效等价类就是有效输入数据的集合&#xff0c;无效等价类…

PM2.5环境检测系统的设计与分析

PM2.5环境检测系统的设计与分析 摘要&#xff1a; 大气颗粒物污染对人类健康和生态环境造成了很大的影响&#xff0c;这让人们逐渐重视起对细颗粒物PM2.5检测技术的研究。本文阐述了PM2.5浓度检测的五种方法&#xff0c;在对上述各方法分析总结的基础上针对日常生活中PM2.5污染…

关于C和C++中for循环对于中间逗号的判定

for&#xff08;&#xff1b;A,B,;&#xff09; 虽然学了好久C语言了&#xff0c;但是自己还真是一直没有注意过for循环中间有逗号表达式的时候判定&#xff0c;之前一直都是以为A和B同时满足了才会进行执行。学编译原理&#xff0c;深入理解一些语言的结构的时候才发现了这一点…

c语言中的取模运算符_C语言除法算法和取模运算的实现(多种算法,多种思路)...

对计算机来说&#xff0c;除法与求模是整数算术运算中最复杂的运算。相对其他运算(如加法与减法)来说&#xff0c;这两种算法的执行速度非常慢。例如&#xff0c;ARM 硬件上不支持除法指令&#xff0c;编译器调用 C 库函数来实现除法运算。直接利用 C 库函数中的标准整数除法程…

【CF603E】Pastoral Oddities cdq分治+并查集

【CF603E】Pastoral Oddities 题意&#xff1a;有n个点&#xff0c;依次加入m条边权为$l_i$的无向边&#xff0c;每次加入后询问&#xff1a;当前图是否存在一个生成子图&#xff0c;满足所有点的度数都是奇数。如果有&#xff0c;输出这个生成子图中边权最大的边的权值最小可能…

关于C/C++中函数参数传递的规则

f&#xff08;A,B,C&#xff09;&#xff1b; 在编译程序中&#xff0c;对函数参数传递的处理是由右向左进行的。 因此&#xff0c;先传递的是最右边的参数的值。这个结论在日常使用的时候其实也很难发现有什么具体的区别&#xff0c;但是在编译原理中或者一些偏向于理论的考试…

sql如何遍历几百万的表_SQL Server遍历表中记录的2种方法(使用表变量和游标)

SQL Server遍历表一般都要用到游标&#xff0c;SQL Server中可以很容易的用游标实现循环&#xff0c;实现SQL Server遍历表中记录。本文将介绍利用使用表变量和游标实现数据库中表的遍历。表变量来实现表的遍历以下代码中&#xff0c;代码块之间的差异已经用灰色的背景标记。DE…

SQL的主键和外键

SQL的主键和外键的作用 SQL的主键和外键的作用&#xff1a; 外键取值规则&#xff1a;空值或参照的主键值。 (1)插入非空值时&#xff0c;如果主键表中没有这个值&#xff0c;则不能插入。 (2)更新时&#xff0c;不能改为主键表中没有的值。 (3)删除主键表记录时&#xff0c;你…

win 11bitlocker恢复密匙一般情况的解决方式(这里指的是你现在使用的微软账户一直没有变更过)

本来没有打算写这一篇解决帖子的&#xff0c;但是最近好多微博的友友都在私我询问解决方法&#xff0c;孩子虽然很热心&#xff0c;但是真的回复不过来了&#xff0c;打字太累了&#xff0c;这里给大家简单指个路&#xff0c;希望能够对大家有所帮助。 当时出现这个问题的时候…

java类验证和装载顺序_java中类的加载顺序介绍(ClassLoader)

转自&#xff1a;http://blog.csdn.net/eff666/article/details/522034061、ClassNotFoundExcetpion我们在开发中&#xff0c;经常可以遇见java.lang.ClassNotFoundExcetpion这个异常&#xff0c;今天我就来总结一下这个问题。对于这个异常&#xff0c;它实质涉及到了java技术体…

[转]ASP.NET MVC4中@model使用多个类型实例的方法

本文转自&#xff1a;http://blog.csdn.net/hulihui/article/details/48199897 有时需要在ASP.NET MVC4的视图的model中使用多个类型的实例&#xff0c;.NET Framework 4.0版本引入的System.Tuple类可以轻松满足这个需求。 假设Person和Product是两个类型&#xff0c;如下是控制…

软件测试之黑盒测试-边界值分析法(理论白话学习/期中期末备考)

这里简单进行一下知识体系的梳理。 文章目录前言一、边界值分析是什么&#xff1f;二、因果图1.分析规格说明中给出的原因&#xff0c;结果和是否可能存在中间态。2.标约束&#xff0c;画图三、画判定表并画出对应的测试用例表。总结前言 主要从三个方面谈一下简单应用 边界值…

window下搭建Python3.7+selenium3.1.1+pycharm环境

1.安装Python3.7 1.1 下载 Python并安装 Python3.5 &#xff08;勾选上 Add Python3.7 to PATH&#xff09; 点击 Install Now&#xff0c;安装完成后将python路径加入环境变量Path 如D:\python35\Python35;D:\python35\Python35\Scripts; 1.2 安装完成之后&#xff0c;winr…

软件测试之单元测试之Junit测试使用前准备

Junit测试只能说是算的上软件测试这门课中首次出现需要实操进行测试的工具了。 可以理解为前面的黑盒测试&#xff0c;白盒测试是为了理解一种测试思想&#xff0c;根据测试思想能够进行设计测试样例&#xff0c;到了Junit单元测试这里&#xff0c;就成了利用工具进行具体的测…