如何1分钟内对 Linux 性能快速分析(113资讯网)

如何1分钟内对 Linux 性能快速分析(113资讯网),第1张

当你在IDC主机商购买一台系统为 Linux 服务器之后,我想大家第一时间就是对主机进行一个性能分析,这里我跟大家分享几个命令,能让大家在一分钟以内对自己的性能有一个大致的鸟解?

uptime

dmesg | tail

vmstat 1

mpstat -P ALL 1

pidstat 1

iostat -xz 1

free -m

sar -n DEV 1

sar -n TCP,ETCP 1

top

这10个命令到底是什么意思,我为大家一一解释一下:

1.uptime

# uptime

03:16:26 up 21:31, 1 user, load average: 10.02, 06.43, 09.02

在上面的例子中,平均负载显示是在不断增加的,1 分钟的值是 10,相比 15 分钟的值 09 来说是增加了。这个数字这么大就意味着有事情发生了.

2. dmesg | tail

# dmesg | tail

[  14.102501] ISO 9660 Extensions: RRIP_1991A

[  15.900216] ISO 9660 Extensions: Microsoft Joliet Level 3

[  15.900234] ISO 9660 Extensions: RRIP_1991A

[  17.030540] EXT4-fs (vda1): resizing filesystem from 5242619 to 13106939 blocks

[  17.151434] random: crng init done

[  17.151436] random: 7 urandom warning(s) missed due to ratelimiting

[  18.314268] EXT4-fs (vda1): resized filesystem to 13106939

[  20.394666] new mount options do not match the existing superblock, will be ignored

[  38.405804] ISO 9660 Extensions: Microsoft Joliet Level 3

[  38.407599] ISO 9660 Extensions: RRIP_1991A

这里展示的是最近 10 条系统消息日志,如果系统消息没有就不会展示。主要是看由于性能问题导致的错误。

3. vmstat 1

# vmstat 1

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 324644 141184 1270628    0    0    10    40  207  431  1  1 99  0  0

0  0      0 324388 141184 1270628    0    0    0    0  130  280  1  1 98  0  0

0  0      0 324388 141184 1270628    0    0    0    0  89  169  0  0 100  0  0

0  0      0 324420 141184 1270628    0    0    0    0  118  225  1  0 99  0  0

0  0      0 324420 141184 1270628    0    0    0    32  125  254  0  0 99  1  0

1  1      0 324420 141184 1270628    0    0    0    68  96  171  0  0 96  4  0

0  0      0 324452 141184 1270628    0    0    0  184  127  166  0  1 96  3  0

^C

r: CPU 上的等待运行的可运行进程数。这个指标提供了判断 CPU 饱和度的数据,因为它不包含 I/O 等待的进程。可解释为:“r” 的值比 CPU 数大的时候就是饱和的。

free:空闲内存,单位是 k。如果这个数比较大,就说明你还有充足的空闲内存。“free -m” 和下面第 7 个命令,可以更详细的分析空闲内存的状态。

si,so:交换进来和交换出去的数据量,如果这两个值为非 0 值,那么就说明没有内存了。

us,sy,id,wa,st:这些是 CPU 时间的分解,是所有 CPU 的平均值。它们是用户时间,系统时间(内核),空闲,等待 I/O 时间,和被偷的时间(这里主要指其它的客户,或者使用 Xen,这些客户有自己独立的 *** 作域)。

4. mpstat -P ALL 1

# mpstat -P ALL 1

Linux 4.15.0-88-generic (VM-0-17-ubuntu) 06/15/2020 _x86_64_ (1 CPU)

03:33:26 AM  CPU    %usr  %nice    %sys %iowait    %irq  %soft  %steal  %guest  %gnice  %idle

03:33:27 AM  all    0.00    0.00    0.00    1.00    0.00    0.00    0.00    0.00    0.00  99.00

03:33:27 AM    0    0.00    0.00    0.00    1.00    0.00    0.00    0.00    0.00    0.00  99.00

这个命令打印各个 CPU 的时间统计,可以看出整体 CPU 的使用是不是均衡的。由于我使用的是1H2G主机看不出区别!

5. pidstat 1

# pidstat 1

Linux 4.15.0-88-generic (VM-0-17-ubuntu) 06/15/2020 _x86_64_ (1 CPU)

03:34:47 AM  UID      PID    %usr %system  %guest  %wait    %CPU  CPU  Command

03:34:48 AM    0      1120    1.00    0.00    0.00    0.00    1.00    0  sshd

pidstat 命令为每个 CPU 统计信息功能。由于我使用的是1H2G主机看不出区别!

6. iostat -xz 1

# iostat -xz 1

Linux 4.15.0-88-generic (VM-0-17-ubuntu) 06/15/2020 _x86_64_ (1 CPU)

avg-cpu:  %user  %nice %system %iowait  %steal  %idle

          0.67    0.01    0.52    0.29    0.00  98.52

Device            r/s    w/s    rkB/s    wkB/s  rrqm/s  wrqm/s  %rrqm  %wrqm r_await w_await aqu-sz rareq-sz wareq-sz  svctm  %util

loop0            0.00    0.00      0.00      0.00    0.00    0.00  0.00  0.00    0.22    0.00  0.00    9.64    0.00  0.00  0.00

scd0            0.02    0.00      0.48      0.00    0.00    0.00  0.00  0.00    0.21    0.00  0.00    27.72    0.00  0.19  0.00

vda              0.64    4.07      9.15    40.59    0.00    1.99  0.00  32.85    3.58    2.31  0.01    14.31    9.96  0.24  0.11

avg-cpu:  %user  %nice %system %iowait  %steal  %idle

          0.00    0.00    0.00    0.00    0.00  100.00

Device            r/s    w/s    rkB/s    wkB/s  rrqm/s  wrqm/s  %rrqm  %wrqm r_await w_await aqu-sz rareq-sz wareq-sz  svctm  %util

r/s, w/s, rkB/s, wkB/s:这些表示设备上每秒钟的读写次数和读写的字节数(单位是k字节)。这些可以看出设备的负载情况。性能问题可能就是简单的因为大量的文件加载请求。

await:I/O 等待的平均时间(单位是毫秒)。这是应用程序所等待的时间,包含了等待队列中的时间和被调度服务的时间。过大的平均等待时间就预示着设备超负荷了或者说设备有问题了。

avgqu-sz:设备上请求的平均数。数值大于 1 可能表示设备饱和了(虽然设备通常都是可以支持并行请求的,特别是在背后挂了多个磁盘的虚拟设备)。

%util:设备利用率。是使用率的百分数,展示每秒钟设备工作的时间。这个数值大于 60% 则会导致性能很低(可以在 await 中看),当然这也取决于设备特点。这个数值接近 100% 则表示设备饱和了。

7. free -m/h

ubuntu@VM-0-17-ubuntu:~# free -m

              total        used        free      shared  buff/cache  available

Mem:          1833        137        313          5        1381        1506

Swap:            0          0          0

ubuntu@VM-0-17-ubuntu:~$ free -h

              total        used        free      shared  buff/cache  available

Mem:          1.8G        139M        311M        5.8M        1.3G        1.5G

Swap:            0B          0B          0B

这个命令我相信大家都熟悉,buffers:用于块设备 I/O 缓冲的缓存,cached:用于文件系统的页缓存。

8. sar -n DEV 1

ubuntu@VM-0-17-ubuntu:~# sar -n DEV 1

Linux 4.15.0-88-generic (VM-0-17-ubuntu) 06/15/2020 _x86_64_ (1 CPU)

03:43:35 AM    IFACE  rxpck/s  txpck/s    rxkB/s    txkB/s  rxcmp/s  txcmp/s  rxmcst/s  %ifutil

03:43:36 AM      eth0    11.00    10.00      0.79      1.06      0.00      0.00      0.00      0.00

03:43:36 AM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

使用这个工具是可以检测网络接口的吞吐:rxkB/s 和 txkB/s,作为收发数据负载的度量,也是检测是否达到收发极限。在上面这个例子中,eth0 接收数据达到 0.79 kb 字节/秒,发送数据达到1.06 字节/秒。

9. sar -n TCP,ETCP 1

ubuntu@VM-0-17-ubuntu:~# sar -n TCP,ETCP 1

Linux 4.15.0-88-generic (VM-0-17-ubuntu) 06/15/2020 _x86_64_ (1 CPU)

03:49:56 AM  active/s passive/s    iseg/s    oseg/s

03:49:57 AM      0.00      0.00      5.05      3.03

03:49:56 AM  atmptf/s  estres/s retrans/s isegerr/s  orsts/s

03:49:57 AM      0.00      0.00      0.00      0.00      0.00

这是对 TCP 关键指标的统计,它包含了以下内容:

active/s:每秒本地发起的 TCP 连接数(例如通过 connect() 发起的连接)。

passive/s:每秒远程发起的连接数(例如通过 accept() 接受的连接)。

retrans/s:每秒TCP重传数。

10. top

ubuntu@VM-0-17-ubuntu:~# top

top - 03:53:20 up 1 day,  1:41,  1 user,  load average: 0.01, 0.04, 0.00

Tasks:  89 total,  1 running,  52 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 :  1877076 total,  317436 free,  143420 used,  1416220 buff/cache

KiB Swap:        0 total,        0 free,        0 used.  1540856 avail Mem

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

3730 root      20  0  105688  6812  5840 S  0.3  0.4  0:00.01 sshd                                                                                         

7546 root      20  0  644608  14924  6776 S  0.3  0.8  2:48.99 YDService                                                                                   

    1 root      20  0  159892  9260  6796 S  0.0  0.5  0:06.45 systemd                                                                                     

    2 root      20  0      0      0      0 S  0.0  0.0  0:00.00 kthreadd                                                                                     

    4 root      0 -20      0      0      0 I  0.0  0.0  0:00.00 kworker/0:0H                                                                                 

    6 root      0 -20      0      0      0 I  0.0  0.0  0:00.00 mm_percpu_wq                                                                                 

    7 root      20  0      0      0      0 S  0.0  0.0  0:04.29 ksoftirqd/0                                                                                 

    8 root      20  0      0      0      0 I  0.0  0.0  0:08.85 rcu_sched                                                                                   

    9 root      20  0      0      0      0 I  0.0  0.0  0:00.00 rcu_bh                                                                                       

  10 root      rt  0      0      0      0 S  0.0  0.0  0:00.00 migration/0                                                                                 

  11 root      rt  0      0      0      0 S  0.0  0.0  0:00.16 watchdog/0                                                                                   

  12 root      20  0      0      0      0 S  0.0  0.0  0:00.00 cpuhp/0                                                                                     

  13 root      20  0      0      0      0 S  0.0  0.0  0:00.00 kdevtmpfs                                                                                   

top 命令包含了很多我们前面提到的指标。这个命令可以很容易看出指标的变化表示负载的变化,这个看起来和前面的命令有很大不同。

top 的一个缺陷也比较明显,很难看出变化趋势,其它像 vmstat 和 pidstat 这样的工具就会很清晰,它们是以滚动的方式输出统计信息。所以如果你在看到有问题的信息时没有及时的暂停下来(Ctrl-S 是暂停, Ctrl-Q 是继续),那么这些有用的信息就会被清屏。

文章原文: https://www.113p.cn/129.html  (来都来了,就去我博客看下!!)

高级分析手段如OProfile、gprof。

OProfile可以帮助用户识别诸如模块的占用时间、循环的展开、高速缓存的使用率低、低效的类型转换和冗余 *** 作、错误预测转移等问题。它收集有关处理器事件的信息,其中包括TLB的故障、停机、存储器访问以及缓存命中和未命中的指令的攫取数量。

OProfile支持两种采样方式:基于事件的采样(Event Based)和基于时间的采样(Time Based)。基于事件的采样是OProfile只记录特定事件(比如L2缓存未命中)的发生次数,当达到用户设定的定值时Oprofile就记录一下(采一个样)。这种方式需要CPU内部有性能计数器(Performace Counter)。基于时间的采样是OProfile借助OS时钟中断的机制,在每个时钟中断,OProfile都会记录一次(采一次样)。引入它的目的在于,提供对没有性能计数器的CPU的支持,其精度相对于基于事件的采样要低,因为要借助OS时钟中断的支持,对于禁用中断的代码,OProfile不能对其进行分析。

OProfile在Linux上分两部分,一个是内核模块( oprofile.ko),另一个是用户空间的守护进程( oprofiled)。前者负责访问性能计数器或者注册基于时间采样的函数,并将采样值置于内核的缓冲区内。后者在后台运行,负责从内核空间收集数据,写入文件。其运行步骤如下。

1)初始化opcontrol--init

2)配置opcontrol--setup--event=...

3)启动opcontrol--start

4)运行待分析的程序xxx

5)取出数据

opcontrol--dump

6)分析结果opreport-1./xxx

用GNU gprof可以打印出程序运行中各个函数消耗的时间,以帮助程序员找出众多函数中耗时最多的函数还可产生程序运行时的函数调用关系,包括调用次数,以帮助程序员分析程序的运行流程。GNU gprof的实现原理:在编译和链接程序的时候〈使用-pg编译和链接选项),gcc在应用程序的每个函数中都加入名为mcount (_mcount或_mcount,依赖于编译器或 *** 作系统)的函数,也就是说应用程序里的每一个函数都会调用mcount,而mcount会在内存中保存一张函数调用图,并通过函数调用堆栈的形式查找子函数和父函数的地址。这张调用图也保存了所有与函数相关的调用时间、调用次数等的所有信息。

在上文中,我们已经详细介绍 linux 三剑客的基本使用,接下来我们看看具体在性能测试领域的运用,本文主要介绍的是在 Tomcat 和 Nginx access日志的统计分析。

server.xml 使用配置方式,%D-请求时间,%F-响应时间

字段说明如下:

日志样例:

使用默认 combined 的经典格式上扩展response_time&upstream_response_time

nginx.conf 使用配置方式:

字段说明如下:

日志示例:

为了能理解 AWK 程序,我们下面概述其基本知识。

模式( pattern ) 用于匹配输入中的每行文本。对于匹配上的每行文本,awk 都执行对应的 动作( action )。模式和动作之间使用花括号隔开。awk 顺序扫描每一行文本,并使用 记录分隔符(一般是换行符)将读到的每一行作为 记录,使用 域分隔符( 一般是空格符或制表符 ) 将一行文本分割为多个 域, 每个域分别可以使用 2, … 表示。1 表示第一个域,表示第二个域,n 表示第 n 个域。 $0 表示整个记录。模式或动作都可以不指定,缺省模式的情况下,将匹配所有行。缺省动作的情况下,将执行动作 {print},即打印整个记录。

此处使用Nginx access.log 举例,Tomcat 日志自己举一反三。 使用 awk 分解出Nginx access日志中的信息

以此类推…… 当我们使用默认的域分割符时,我们可以从日志中解析出下面不同类型的信息:

我们不难发现,仅使用默认的域分隔符,不方便解析出请求行、引用页和浏览器类型等其他信息,因为这些信息之中包含不确定个数的空格。 因此,我们需要把域分隔符修改为 “ ,就能够轻松读出这些信息。

注意:这里为了避免 Linux Shell 误解 “ 为字符串开始,我们使用了反斜杠,转义了 “ 。 现在,我们已经掌握了 awk 的基本知识,以及它是怎样解析日志的。

此处使用Nginx access.log 举例,Tomcat 日志自己举一反三。

如果我们想知道那些类型的浏览器访问过网站,并按出现的次数倒序排列,我可以使用下面的命令:

此命令行首先解析出浏览器域,然后使用管道将输出作为第一个 sort 命令的输入。第一个 sort 命令主要是为了方便 uniq 命令统计出不同浏览器出现的次数。最后一个 sort 命令将把之前的统计结果倒序排列并输出。

我们可以使用下面的命令行,统计服务器返回的状态码,发现系统可能存在的问题。

正常情况下,状态码 200 或 30x 应该是出现次数最多的。40x 一般表示客户端访问问题。50x 一般表示服务器端问题。 下面是一些常见的状态码:

HTTP 协议状态码定义可以参阅: https://www.w3.org/Protocols/rfc2616/rfc2616.html

查找并显示所有状态码为 404 的请求

统计所有状态码为 404 的请求

现在我们假设某个请求 ( 例如 : URI: /path/to/notfound ) 产生了大量的 404 错误,我们可以通过下面的命令找到这个请求是来自于哪一个引用页,和来自于什么浏览器。

有时候会发现其他网站出于某种原因,在他们的网站上使用保存在自己网站上的图片。如果您想知道究竟是谁未经授权使用自己网站上的图片,我们可以使用下面的命令:

注意:使用前,将 www.example.com 修改为自己网站的域名。

统计共有多少个不同的 IP 访问:

统计每一个 IP 访问了多少个页面:

将每个 IP 访问的页面数进行从小到大排序:

统计 2018 年 8 月 31 日 14 时内有多少 IP 访问 :

统计访问最多的前十个 IP 地址

查看某一个 IP访问了哪些页面:

统计某个 IP 的详细访问情况,按访问频率排序

列出传输大小最大的几个文件

列出输出大于 204800 byte ( 200kb) 的页面以及对应页面发生次数

列出访问最频的页面(TOP100)

列出访问最频的页面([排除php页面】(TOP100)

列出页面访问次数超过100次的页面

列出最近1000条记录,访问量最高的页面

统计每分钟的请求数,top100的时间点(精确到分钟)

统计每小时的请求数,top100的时间点(精确到小时)

统计每秒的请求数,top100的时间点(精确到秒)

统计当天的 pv

说明:

可以使用下面的命令统计出所有响应时间超过 3 秒的日志记录。

注意:NF 是当前记录中域的个数。$NF 即最后一个域。

列出php页面请求时间超过3秒的页面,并统计其出现的次数,显示前100条

列出相应时间超过 5 秒的请求,显示前20条

统计蜘蛛抓取次数

统计蜘蛛抓取404的次数

通过本文的介绍,我相信同学们一定会发现 linux三剑客强大之处。在命令行中,它还能够接受,和执行外部的 AWK 程序文件,可以对文本信息进行非常复杂的处理,可以说“只有想不到的,没有它做不到的”。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/6219884.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-18
下一篇 2023-03-18

发表评论

登录后才能评论

评论列表(0条)

保存