本文是对于性能测试的一些漫游和探索。
常见的性能测试命令有一些有关内存,CPU,网速,磁盘,温度,cache等等的指标。
但是我们并不清楚, 收集日志的 2>&1 之类的命令是如何影响性能的,还有用户态和系统态是否与各种排序算法的时间复杂度相关。
这个文章就初步的分析了一些用户态,系统态和时间复杂度的关联,得到一些猜想性质的结论。
由于时间原因,这次分析还没有非常多的理论数据,有时间的话我将继续收集更多信息和数据进行分析。
我们知道内存中的free一般指的是还没有被占用的物理内存,也就是说是空闲的内存,就好像一个人的空闲时间,或者说是一个人脑容量中可以继续活跃的部分,是动态的。
free越小,则表示可以使用的物理内存越小,used是已经在使用中的物理内存,也就是说非常忙碌的内存,当系统非常忙碌的时候,free就会减少。
命令:free -h
如果free的数量持续减少,而used的数量持续增多,当程序不再运行的时候,内存依旧被占据着,则可以初步判定为是内存泄漏。
以下命令也是可以查看内存的
cat /proc/meminfo
用户态与用户进程的关系
用户态是操作系统的一种执行模式,用户进程(如普通应用程序)运行时处于该状态。
系统态(内核态)
系统进程与系统态的区别
Buff 展示了缓冲区高速缓存的大小,而cache一列展示了页缓存大小,选项-m 把结果以MB为单位进行显示。
引用自P327《性能之巅》
查网速
是 Linux 系统中用于实时查看所有网络接口的详细统计信息
查找接收和发送的字节数、包数、错误数等
是 Linux 系统中用于 配置和显示网络接口信息 的核心命令,其功能涵盖接口状态查看、IP 地址设置、启停网卡等操作
查看网络配置, 如果是1000Mb/s:表示网卡协商为千兆速率
【系统态】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。
命令参考自 P406《性能之巅》
检测命令: 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 又恢复了,说明不是内存泄漏,但是我们发现这个命令运行之后内存没有恢复,我觉得这还是有一些内存泄露的问题的。
以下是内存泄漏的判定
在编程和软件开发中,内存泄漏是指程序中不再使用的内存没有被正确释放,导致这部分内存一直占用,进而可能导致内存耗尽,影响程序的性能或稳定性。
【用户态】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等待。
用户进程使用过多是不会造成内存泄露的,因为内存不会变少。
但是系统进程使用过多,有可能造成内存泄漏,也有可能不会有内存泄漏,以下的例子就没有造成内存泄漏。
【系统态】free变小
(系统进程占用的 CPU 时间百分比更多,没有内存泄漏)
而以下是动用 “真气”的命令,运行之后,free 会变小的。
stress -i 1 --hdd 1 --timeout 100
检测命令: vmstat 1
解释
--hdd 1:这个选项用于指定硬盘压力测试的权重。数字1表示硬盘操作的相对权重。这意味着在压力测试中,硬盘I/O将占据一定的比重。
发现运行完成之后free是会恢复的 ,所以没有内存泄漏。(非常明显的恢复)
cat /sys/class/thermal/thermal_zone0/temp
返回值为整数,当前温度-摄氏度是此数值的千分之一(如 44000表示 44°C)
查询有多少个逻辑cpu:
cat /proc/cpuinfo | grep "processor" | wc -l
查询cpu频率命令:
cat /sys/devices/system/cpu/cpu2/cpufreq/scaling_cur_freq
iostat 1
每隔1秒输出一次系统当前的CPU使用率及磁盘I/O性能统计信息
从上图我们可以看到,每秒读取的块数的kb数量367628kB
tps (表示该设备每秒传输的IO请求的数量)数量是539
清空缓存 –引用自 P337《性能之巅》
echo 3 > /proc/sys/vm/drop_caches
清除内存缓存以释放资源之后, 再次运行命令,buff 会有一个递增的趋势