Linux性能分析

性能分析的目的是为了找出系统瓶颈和优化方案,以提高系统的运行效率和性能。

性能分析包括了系统监测、性能测试、性能诊断、优化和评估等环节,需要使用一系列工具和技术来实现,如采样分析、跟踪分析、统计分析、模拟分析等。性能分析在计算机系统的开发、测试和维护过程中起着重要作用。

性能分析的基本原理

image.png

性能分为硬件性能和软件性能。

  1. 首先从系统级查看资源的使用情况,如vmstat,找到资源瓶颈;
  2. 如果软件无异常,但硬件达到瓶颈则需要更换更高级的硬件;
  3. 如果软件异常,则需要进行进程级定位,首先使用top定位到所有进程中最耗资源的进程;
  4. 然后使用psstat,perf,strace,time等工具查看进程的瓶颈;
  5. 优化性能瓶颈,注意,性能瓶颈有时会有很多个,不止是一个。

进程级的分析指标就是延时,看哪个过程消耗的时间多,这部分主要靠perf来定位。

性能指标

内存不足

  • free memory急剧减少,回收buffer和cacher也无济于事;
  • 大量使用交换分区(swpd)
  • 页面交换(swap)频繁
  • 读写磁盘数量(io)增多
  • 缺页中断(in)增多
  • 上下文切换(cs)次数增多
  • 等待IO的进程数(b)增多
  • 大量CPU时间用于等待IO(wa)

当系统内存不足时,性能指标可能表现为以下几种情况:

页面交换率(Swap Rate):表示在一段时间内系统进行页面交换的次数。页面交换是指将数据从内存移到磁盘,以释放内存空间。如果页面交换率过高,就意味着系统正在频繁地进行内存和磁盘之间的数据传输,这会极大地降低系统的性能。

页面缺失率(Page Fault Rate):表示在一段时间内发生了多少次页面缺失。页面缺失是指在访问虚拟内存时发现需要的页面不在内存中,从而触发操作系统将页面从磁盘加载到内存中的过程。页面缺失率越高,就意味着系统需要频繁地进行磁盘读写操作,这会影响系统的性能。

内存使用率(Memory Utilization):表示当前内存使用量占总内存的比例。当内存使用率接近或达到 100% 时,系统会变得缓慢并容易出现问题。

内存泄漏(Memory Leak):表示应用程序在使用内存时出现的问题,导致系统中的内存不断增加,直到系统崩溃或应用程序崩溃。内存泄漏是一种常见的性能问题,通常需要通过分析应用程序代码来解决。

IO瓶颈

  • 读写IO,bi bo增多超过2000
  • cpu等待时间用于 IO等待,wa增加 超过20
  • sy 系统调用时间长,IO操作频繁会导致增加 >30%
  • wa io等待时间长
    • iowait% <20% 良好
    • iowait% <35% 一般
    • iowait% >50%
  • 进一步使用iostat观察

IO瓶颈通常表现为系统中的磁盘IO操作变慢或被卡住,因此对应的应用程序也会变得响应迟缓,甚至出现卡死的情况。具体表现包括:

IO等待时间增加:在使用工具进行性能分析时,可以观察到磁盘IO等待时间增加,例如iostat命令中的await、svctm指标。
磁盘IO使用率高:如果磁盘IO使用率接近100%,则表示系统磁盘IO操作饱和,可能会影响系统的响应时间。
系统负载高:IO操作的等待会导致系统的负载变高,如果磁盘IO操作一直处于高负载状态,说明系统存在IO瓶颈。
应用程序响应迟缓:由于磁盘IO操作变慢,对应的应用程序也会变得响应迟缓,可能会导致程序运行时间过长,用户体验变差,甚至无法响应。

CPU瓶颈

  • 反应为CPU队列长度
  • 一段时间内,CPU正在处理和等待CPU处理的进程数之和,直接反应了CPU的使用和申请情况。
  • 理想的load average:$(nproc)*0.7
  • 超过这个值就说明已经是CPU瓶颈了

CPU瓶颈的表现通常是:

系统负载高:CPU负载高,导致系统的平均负载高,应用响应时间变慢。
进程的CPU使用率高:一个或多个进程的CPU使用率高,而其他进程的CPU使用率较低。
上下文切换率高:由于进程数量过多,操作系统需要频繁地进行上下文切换,导致CPU资源浪费。
等待CPU时间长:进程需要等待CPU的时间长,可能导致进程响应时间变慢,甚至出现卡死的情况。
CPU饱和:CPU资源被占满,无法满足更多的处理需求。

系统级分析

# 查看进程的CPU消耗排序
top
vmstat 1 -Sm

# 查看内存消耗排序
top
按 m

# 查看每个核的状态
mpstat -P ALL 1 

进程级分析

单进程状态查看

# 查看进程的启动命令
ps aux | grep <pid>

# 查看进程的系统调用
strace <x.exe>

# 查看进程的CPU使用率变化
pidstat 1 -p <pid>

# 查看进程的磁盘IO变化
pidstat 1 -d -p <pid>

# 查看进程的网络IO变化
pidstat 1 -w -p <pid>

# 查看进程打开的文件
lsof -p <pid>

# 查看进程消耗的时间
time <a.out>

火焰图

一、查看perf报告:

  1. 下载FlameGraph:
git clone https://github.com/brendangregg/FlameGraph.git
  1. 收集系统/进程报告:
# 收集所有进程报告,一秒99次,收集60秒
perf record -F 99 -a -g -- sleep 60

# 收集指定pid的报告,一秒99次,收集60秒
sudo perf record -F 99 -p <pid> -g -- sleep 60
  1. 以火焰图形式查看
sudo perf script | ./FlameGraph/stackcollapse-perf.pl | ./FlameGraph/flamegraph.pl > output.svg
<browser> output.svg

使用浏览器打开svg火焰图,还可以进行交互。

二、查看dtrace报告:
todo.

查看网络信息

todo.

调优

CPU平均负载高

当CPU的平均负载高时,可能会出现系统响应变慢、应用程序响应时间延长等情况,需要进行调优。

分析负载高的原因:

使用系统工具(如tophtopdstatsar等)分析哪些进程占用了CPU时间、内存、磁盘等资源,并查看系统日志以了解系统的状态。

调优方法:

调整进程优先级:可以使用nice命令或renice命令调整进程优先级,减少CPU资源占用。同时,可以考虑使用CPU限制工具(如cgroups)限制进程占用的CPU资源。

使用多核CPU:如果系统CPU资源充足,可以考虑使用多核CPU,将负载分散到多个CPU上。

优化应用程序:对于占用大量CPU资源的应用程序,可以通过代码优化、算法优化等方式减少其CPU资源占用。

增加硬件资源:如果CPU资源仍然不足,可以考虑增加硬件资源(如更多的CPU、更大的内存、更快的磁盘等)来满足系统的需求。

调整系统参数:可以调整系统内核参数(如文件句柄数、最大进程数等)以提高系统性能。

内存消耗大

使用topfree -g等命令查看剩余内存和页交换情况;

当剩余内存不足或页频繁交换时,可以尝试以下几个方面进行调优:

增加物理内存:如果物理内存不足,可以考虑增加物理内存,这是最有效的方式。

减少内存消耗:可以通过优化程序代码、关闭不必要的服务、减少运行进程等方式来减少内存消耗。

调整内存分配策略:可以通过调整内存分配策略来优化内存使用效率,比如减小每个进程的内存使用限制,减少内存碎片等。

使用交换空间:当物理内存不足时,可以使用交换空间来扩展内存空间。不过,由于交换空间的性能较差,因此不建议长期使用。

使用内存压缩技术:一些现代操作系统支持内存压缩技术,可以将不常用的内存页进行压缩,以释放更多的内存空间。

使用更高效的算法和数据结构:在程序开发过程中,可以尽量使用更高效的算法和数据结构来减少内存占用,提高程序性能。

使用SSD提高交换速度。

工具详解

htop

sudo apt install htop
htop

vmstat

每秒输出一次结果,其中,-Sm代表以M为单位显示。

vmstat 1 -Sm

image.png
:::tip{title=“选项说明”}
r表示运行队列中的进程数量,运行队列是指在队列中,但还没有获得CPU资源;

b表示不可中断睡眠状态的进程数量,如等待磁盘IO或网络IO,这种状态下,磁盘不会响应任何中断信号;

swapd已使用的交换空间大小;

free空闲内存大小;

buffIO缓冲区所使用的大小;

cacheCPU缓冲区所使用的的大小;

si每秒从磁盘交换到内存的数据大小;

so每秒从内存交换到磁盘的数据大小;

bi每秒从磁盘读取的数据数量;

bo每秒向磁盘写入的数据大小;

in每秒中断次数;

cs每秒系统调用次数;

us用户空间的CPU使用率百分比;

sy系统空间的CPU使用率百分比;

id空闲的CPU百分比;

wa等待输入输出的CPU时间百分比;

st虚拟机上的CPU时间百分比。
:::

top

top相当于任务管理器或资源管理器,默认情况下,top显示的是CPU占用最高的进程的列表。

top

top命令

:::tip{title=“参数说明”}
top - 17:17:23 up 3:30, 1 user, load average: 0.39, 0.58, 0.46
第1行主要关注平均负载,三个数值分别代表过去1分钟,5分钟和15分钟的平均任务数;
当任务数大于CPU的核数,就会出现等待状态;
通常认为,平均负载小于CPU核数的1-2倍比较正常,超过这个范围可能导致系统响应变慢。

Tasks: 364 total, 2 running, 350 sleeping, 0 stopped, 12 zombie
第2行代表任务总数统计。

%Cpu(s): 0.4 us, 1.1 sy, 0.0 ni, 98.4 id, 0.0 wa, 0.0 hi, 0.1 si, 0.0 st
第3行代表CPU状态,在top状态下,按1会显示所有CPU信息。
各参数含义见 vmstat 章节。

MiB Mem : 15652.5 total, 6941.4 free, 2870.7 used, 5840.4 buff/cache
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 12049.0 avail Mem
第4行和第5行代表内存信息。
:::

perf

todo.

dtrace

todo.

netstat

netstat是一个用于查看网络连接状态的命令行工具。它可以列出网络连接、路由表、网络接口等信息。通过netstat,用户可以监控网络连接情况,识别网络问题,其常用选项如下:

:::tip{title=“选项”}
-a:显示所有的TCP和UDP连接

-t:仅显示TCP连接

-u:仅显示UDP连接

-n:以数字形式显示IP地址和端口号

-p:显示建立连接的程序名或进程ID

-l:仅显示监听状态的连接

-r:显示路由表信息

-s:显示网络统计数据,如TCP、UDP等的统计信息

-c:持续输出,直到按下Ctrl+C结束
:::

ip

ip 命令是一个 Linux 系统下用于管理网络接口的命令行工具,提供了一些常见的网络管理功能。它的功能比 ifconfig 更强大,取代了 ifconfig 命令的一些部分功能。

:::tip{title=“选项”}
ip addr:显示网络接口的 IP 地址、MAC 地址和状态等信息

ip link:显示网络接口的状态、设备类型等信息

ip route:显示路由表信息

ip -s link:显示网络接口的统计信息
:::

tcpdump

todo.

wireshark

todo.

sar

todo.

基准测试

todo.

btop

全盘性能监控。

术语

内存相关术语
VIRT,进程的虚拟内存,包括已映射的和未映射的内存等

RES,进程映射到物理内存的部分

SHR ,进程使用的共享库大小

内存硬件 ,主存,总线,CPU缓存和MMU(内存管理单元)

OOM ,内存耗尽

主存 , 物理内存

虚拟内存 , 用页表维护的映射项之一

页表 , 是虚拟内存和物理内存的映射表

页 , 是内存交换的基本单元,一般是4k

参考链接

性能之巅

Linux 内存占用分析的几个方法,你知道几个?

阮一峰-如何读懂火焰图?

FlameGraph

系统级性能分析工具perf的介绍与使用

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

多弗朗强哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值