Linux 性能测试实操指南:命令 + 负载模拟 + 内存泄漏判定
本文是对于性能测试的一些漫游和探索。
常见的性能测试命令有一些有关内存,CPU,网速,磁盘,温度,cache等等的指标。
但是我们并不清楚, 收集日志的 2>&1 之类的命令是如何影响性能的,还有用户态和系统态是否与各种排序算法的时间复杂度相关。
这个文章就初步的分析了一些用户态,系统态和时间复杂度的关联,得到一些猜想性质的结论。
由于时间原因,这次分析还没有非常多的理论数据,有时间的话我将继续收集更多信息和数据进行分析。
(1) 内存的使用情况,以及内存泄漏的知识
我们知道内存中的free一般指的是还没有被占用的物理内存,也就是说是空闲的内存,就好像一个人的空闲时间,或者说是一个人脑容量中可以继续活跃的部分,是动态的。
free越小,则表示可以使用的物理内存越小,used是已经在使用中的物理内存,也就是说非常忙碌的内存,当系统非常忙碌的时候,free就会减少。
命令: free -h

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

(2) 有关CPU的性能测试
命令:top

-
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的思想

Buff 展示了缓冲区高速缓存的大小,而cache一列展示了页缓存大小,选项-m 把结果以MB为单位进行显示。
(4) 有关网速的测试
查网速
-
命令:cat /proc/net/dev
是 Linux 系统中用于实时查看所有网络接口的详细统计信息
查找接收和发送的字节数、包数、错误数等

-
命令:ifconfig
是 Linux 系统中用于 配置和显示网络接口信息 的核心命令,其功能涵盖接口状态查看、IP 地址设置、启停网卡等操作
-
命令: sudo ethtool 网卡的名称 | grep Speed
查看网络配置, 如果是1000Mb/s:表示网卡协商为千兆速率


(5) 磁盘的测试
-
命令: df -h
主要用于查看磁盘空间容量

(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

分析:
从上图我们可以看到
-
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个,容易导致系统不稳定

我们看到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将占据一定的比重。

发现运行完成之后free是会恢复的 ,所以没有内存泄漏。(非常明显的恢复)
(7) 系统温度的测试
cat /sys/class/thermal/thermal_zone0/temp
返回值为整数,当前温度-摄氏度是此数值的千分之一(如 44000表示 44°C)

(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

每隔1秒输出一次系统当前的CPU使用率及磁盘I/O性能统计信息
从上图我们可以看到,每秒读取的块数的kb数量367628kB
tps (表示该设备每秒传输的IO请求的数量)数量是539
(10) 清空内存和缓存的情况
echo 3 > /proc/sys/vm/drop_caches
清除内存缓存以释放资源之后, 再次运行命令,buff 会有一个递增的趋势


浙公网安备 33010602011771号