Linux 性能测试实操指南:命令 + 负载模拟 + 内存泄漏判定

本文是对于性能测试的一些漫游和探索。

常见的性能测试命令有一些有关内存,CPU,网速,磁盘,温度,cache等等的指标。

但是我们并不清楚, 收集日志的 2>&1 之类的命令是如何影响性能的,还有用户态和系统态是否与各种排序算法的时间复杂度相关。

这个文章就初步的分析了一些用户态,系统态和时间复杂度的关联,得到一些猜想性质的结论。

由于时间原因,这次分析还没有非常多的理论数据,有时间的话我将继续收集更多信息和数据进行分析。

(1) 内存的使用情况,以及内存泄漏的知识

 

我们知道内存中的free一般指的是还没有被占用的物理内存,也就是说是空闲的内存,就好像一个人的空闲时间,或者说是一个人脑容量中可以继续活跃的部分,是动态的。

free越小,则表示可以使用的物理内存越小,used是已经在使用中的物理内存,也就是说非常忙碌的内存,当系统非常忙碌的时候,free就会减少。

命令: free -h

 

044480217de6958b785d061ae90e2a12

如果free的数量持续减少,而used的数量持续增多,当程序不再运行的时候,内存依旧被占据着,则可以初步判定为是内存泄漏。

以下命令也是可以查看内存的

cat /proc/meminfo

image

 (2) 有关CPU的性能测试

命令:top

image

 

  • us 用户空间(User)进程占用CPU的时间百分比

用户态与用户进程的关系

用户态是操作系统的一种执行模式,用户进程(如普通应用程序)运行时处于该状态。

  • sy 内核(System)占用CPU的时间百分比,就好比我们常常说的一个人是不是内核很稳定,sy数值越大可以想象为内核越稳定(这是作者自己的想象)

系统态(内核态)

  • 定义‌:CPU执行系统程序(如内核代码、驱动程序、中断处理程序等)时的状态,拥有访问所有硬件资源的权限。 ‌

  • 功能‌:负责资源管理(如进程调度、内存分配)、设备控制(如硬盘读写、网络通信)等核心任务。

系统进程与系统态的区别

  • 定义‌:系统运行的程序实例,如操作系统自身或用户启动的应用程序。 ‌

  • 状态‌:可能处于用户态(普通程序)或内核态(如执行系统级操作时)。

    • ni 改变过优先级进程占用CPU百分比

    • id 空闲CPU占比

    • wa io等待占用CPU占比

    • hi 硬件中断占用CPU时间

    • si 软件中断占用CPU时间

    • PID 进程id

    • User 进程所有者

    • PR 动态优先级(Linux值),‌数值越小优先级越高

    • NI  进程的静态Nice值,负值为高优先级,正值为低优先级

    • %CPU 进程占用CPU百分比

    • %MEM 进程占用物理内存百分比

    • Time 进程的CPU时间的总计

    • Command 进程的名称

(3) 内存中,有关Buff,cache的思想

db42a80c15accc2c00772adea0bf0d27

 Buff 展示了缓冲区高速缓存的大小,而cache一列展示了页缓存大小,选项-m 把结果以MB为单位进行显示。

(4) 有关网速的测试

查网速

  • 命令:cat /proc/net/dev

是 Linux 系统中用于实时查看所有网络接口的详细统计信息‌ 

查找接收和发送的字节数、包数、错误数等

aaf446f78fef543f338064fe983bb72b

  • 命令:ifconfig

是 Linux 系统中用于 ‌配置和显示网络接口信息‌ 的核心命令,其功能涵盖接口状态查看、IP 地址设置、启停网卡等操作

  • 命令: sudo ethtool 网卡的名称 | grep Speed

查看网络配置, 如果是1000Mb/s‌:表示网卡协商为千兆速率

image

image


(5) 磁盘的测试

  • 命令: df -h

主要用于查看磁盘空间容量

image

(6) 负载的模拟

【系统态】free变小

(系统进程占用的 CPU 时间百分比更多, 含有内存泄漏)

sudo dd if=/dev/sda2 of=/dev/null bs=1024k count=2000

该命令使用 dd 工具从 /dev/sda2 设备读取数据,每次读取 1024KB 的数据块,总共读取 2000 个数据块,然后将这些数据写入 /dev/null 设备。

/dev/null 是一个特殊的设备文件,它会丢弃所有写入其中的数据,因此这个命令实际上不会在 /dev/null 中创建任何输出文件。

命令参数解释

  • if=/dev/sda2:指定输入文件为 /dev/sda2 设备。

  • of=/dev/null:指定输出文件为 /dev/null 设备。

  • bs=1024k:设置块大小为 1024KB。

  • count=2000:指定读取和写入的块数为 2000。

检测命令: vmstat 1

image

 

分析:

从上图我们可以看到

 

  • id:空闲CPU百分比明显减少,从100 变为了87左右

  • Sy 明显增大,既是内核空间占用CPU百分比也是系统进程占用的 CPU 时间百分比

  • Us 不变,保持0,us是用户空间未改变优先级的进程占用cpu的百分比

  • cs和in都增大到了1000左右

  • cs和in分别代表每秒上下文切换次数和每秒中断次数

  • bi 明显增大,bi列表示从块设备(如硬盘)读取的数据块数,单位是块/秒‌‌(磁盘IO)

  • bo‌ 表示每秒写入到块设备的数据块数(磁盘IO)

  • wa 表示IO等待的时间

  • free 变小,free是可用物理内存的大小

free 变小的时候我们可以想象为 “内核稳定”,因为sy增大而us不变,因此我们可以想象为这种情况是内核稳定。(此为作者想象)

如果程序运行之后free 又恢复了,说明不是内存泄漏,但是我们发现这个命令运行之后内存没有恢复,我觉得这还是有一些内存泄露的问题的。

以下是内存泄漏的判定

在编程和软件开发中,内存泄漏是指程序中不再使用的内存没有被正确释放,导致这部分内存一直占用,进而可能导致内存耗尽,影响程序的性能或稳定性。

命令 2 :

【用户态】free不变的压力测试 

(用户进程使用时间变多)

测试当cpu数量过多时候的压力测试情况

stress -c 10 --timeout 100 

以上使用了10个cpu核心,但是实际上的cpu只有4个,容易导致系统不稳定

image

我们看到us增大,sy 不变, cs 和in增加,但是free不变,这说明此时内核空间(sy)并没有使用,就不用动用”真气”, 也就是说 free 不变。(以上是作者的想象)

我们可以看到r的数值变大, 而r代表的是进程等待的数量。

bi,bo和wa 几乎为0,说明没有IO的交换和IO等待。

用户进程使用过多是不会造成内存泄露的,因为内存不会变少。

但是系统进程使用过多,有可能造成内存泄漏,也有可能不会有内存泄漏,以下的例子就没有造成内存泄漏。

命令 3 :

【系统态】free变小 

(系统进程占用的 CPU 时间百分比更多,没有内存泄漏)

而以下是动用 “真气”的命令,运行之后,free 会变小的。

stress -i 1 --hdd 1 --timeout 100

检测命令: vmstat 1

解释

--hdd 1:这个选项用于指定硬盘压力测试的权重。数字1表示硬盘操作的相对权重。这意味着在压力测试中,硬盘I/O将占据一定的比重。

image

 发现运行完成之后free是会恢复的 ,所以没有内存泄漏。(非常明显的恢复)

(7) 系统温度的测试

cat /sys/class/thermal/thermal_zone0/temp

返回值为整数,当前温度-摄氏度是此数值的千分之一‌(如 44000表示 44°C)

2baf782025ff6eb0a61f61de47d5762e

(8) 查CPU 数量和频率

查询有多少个逻辑cpu:

cat /proc/cpuinfo | grep "processor" | wc -l

查询cpu频率命令:

cat /sys/devices/system/cpu/cpu2/cpufreq/scaling_cur_freq

(9) 查看磁盘IO性能的统计命令

 

iostat 1

image

每隔1秒输出一次系统当前的CPU使用率及磁盘I/O性能统计信息

从上图我们可以看到,每秒读取的块数的kb数量367628kB

tps (表示该设备每秒传输的IO请求的数量)数量是539

(10) 清空内存和缓存的情况

 

echo 3 > /proc/sys/vm/drop_caches

清除内存缓存以释放资源之后, 再次运行命令,buff 会有一个递增的趋势

image

 

posted @ 2026-01-08 10:02  溺水的小金鱼  阅读(2)  评论(0)    收藏  举报