系统和网络的实时性评估
1. 系统实时性
1.1 使用 cyclictest
测试系统实时性
使用方法可参考:https://www.cnblogs.com/klb561/p/9123457.html
1.1.1 工具介绍
cyclictest
是 Linux
下用于测试实时系统性能的工具,它通过创建指定数量的实时线程,并测量这些线程的运行周期来评估系统的实时性能。
1.1.2 测试步骤
(1) 安装 cyclictest
工具(如果需要)。
# ubuntu 系统下安装 cyclictest
sudo apt-get install rt-tests
(2) cyclictest
的使用及参数简介。
常用参数简介:
参数 | 完整参数 | 参数含义 |
---|---|---|
-a | --affinity | 设置测试线程的亲核性,或设置线程的 cpuset |
-i | --interval=INTV | 线程睡眠的时间,默认是 1000us,即实时线程 1000us 被唤醒一次 |
-l | --loops=LOOPS | 循环次数,默认次数是0(无数次),cyclictest 运行的时间等于interval×loops;比如: -i 1000 -l 1000000 ,总的循环时间为 1000*1000000=1000000000 us =1000s |
-m | --mlockall | 将当前和接下来的内存通过mlock锁定,防止发生swap影响测试 |
-n | --nanosleep | 使用精度更高的纳秒睡眠 api:clock_nanosleep |
-p | --priority=PRIO | 指定实时线程的优先级 |
-c | --clock=CLOCK | 选择时钟类型。默认是=0 0代表 CLOCK_MONOTONIC 1代表CLOCK_REALTIME |
-h | --histogram=US | 测试完成后输出一个直方图,并输出延时小于US的次数统计。 |
-q | --quiet | 测试结束后再输出结果 |
-b | --breaktrace=USEC | 当出现大于 USEC 的延时后,立即退出测试 |
-t | --threads=NUM | 指定总线程数,若不指定,线程数等于 max_cpus; 若不使用-t参数,则线程数为1。 |
使用推荐参数执行 cyclictest 命令:
# 运行一个优先级为99,测试间隔为1000微秒,循环10000次的测试
sudo cyclictest -t1 -p 99 -n -i 1000 -l 10000
(3)观察测试结果,包括最小值、平均值和最大值等性能指标。
输出结果含义:
例如:
T: 0 ( 5592) P:99 I:1000 C: 10000 Min: 2 Act: 15 Avg: 15 Max: 195
输出含义:
- T: 0 序号为0的线程
- P: 0 线程优先级为99
- C: 10000 计数器。线程的时间间隔每达到一次,计数器加1
- I: 1000 时间间隔为1000微秒(us)
- Min: 最小延时(us)
- Act: 最近一次的延时(us)
- Avg:平均延时(us)
- Max: 最大延时(us)
表明当前机器上的系统最小延时为2,平均为15,最大的为 195。
1.1.3 测试结果分析
根据测试结果,对比标准值,分析系统的实时性能是否满足预期要求。
为了 ARCS 软件能够正常运行,经比较不同系统下的测试结果,针对各项性能指标提供以下标准值:
Min: 14 Avg: 32 Max: 2335
只有当前被测试系统的测试结果小于该标准值(主要参考 Avg)时,表示当前系统的实时性符合要求,可用;
1.2 使用 stress
测试系统性能
1.2.1 工具介绍
stress
是一个 linux 的压力测试工具,专门用于对设备的 CPU、IO、内存、负载、磁盘等进行压测。
1.2.2 测试步骤
(1) 安装 stress
工具(如果需要)。
# ubuntu 系统下安装 `stress`
sudo apt-get install stress
# ubuntu 系统下安装 `sysstat`
sudo apt-get install sysstat
(2) stress
的使用及参数简介。
常用参数简介:
参数 | 完整参数 | 参数含义 |
---|---|---|
-h | --help | 显示帮助信息 |
-v | --version | 显示软件版本信息 |
-t | --timeout secs | 指定运行多少秒 |
-c | --cpu forks | 产生多个处理sqrt()函数的CPU进程 |
-m | --vm forks --vm-bytes bytes --vm-hang |
产生多个处理 malloc() 内存分配函数的进程,后接进程数量指定内存的byte数,默认值是1 表示 malloc 分配的内存多少时间后在free()释放掉 |
-i | --io forks | 产生多个处理sync()函数的磁盘I/O进程 |
-d | --hdd --hdd-bytes bytes |
写进程,写入固定大小,通过 mkstemp() 函数写入当前目录指定写的byte数,默认 1G |
-q | --quiet | 程序在运行的过程中不输出信息 |
使用推荐参数执行 stress
命令:
# 测试CPU负荷: 增加4个cpu进程,处理sqrt()函数函数,以提高系统CPU负荷
sudo stress –c 4
# 内存测试: 新增4个io进程,10个内存分配进程,每次分配大小1G,分配后不释放,测试100S
sudo stress –i 4 –vm 10 –vm-bytes 1G –vm-hang 100 –timeout 100s
# 磁盘I/O测试: 新增1个写进程,每次写3G文件块
sudo stress –d 1 --hdd-bytes 3G
(3)监控被测试机的性能。
在 stress 测试运行期间,通过 Linux 系统的内置工具(如top、iostat等)来查看性能表现,如CPU使用率、内存占用、磁盘I/O等。
使用 top 命令监控整体使用情况
输出结果含义:
例如:
top - 10:29:57 up 1:48, 1 user, load average: 0.93, 0.48, 0.44
Tasks: 354 total, 1 running, 270 sleeping, 0 stopped, 0 zombie
%Cpu(s): 1.5 us, 0.6 sy, 0.0 ni, 97.7 id, 0.0 wa, 0.0 hi, 0.3 si, 0.0 st
KiB Mem : 8140564 total, 3525812 free, 2053556 used, 2561196 buff/cache
KiB Swap: 8384508 total, 8384508 free, 0 used. 5851856 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1424 root 20 0 519060 111020 47312 S 3.7 1.4 0:42.58 Xorg
1450 root 20 0 1046116 200556 36940 S 2.3 2.5 3:18.02 node
3284 root 20 0 1585248 117920 78212 S 2.3 1.4 0:35.78 compiz
load average
: 当前系统负载的平均值,后面的3个值分别为1分钟、5分钟、15分钟前进程的平均数。一般认为这个数超过CPU数目时,表示CPU比较吃力地负载当前系统所包含的进程。
表示 CPU 的几个参数:
us:用户空间占用 CPU 百分比
sy:内核空间占用 CPU 百分比
ni:用户进程空间内改变过优先级的进程占用 CPU 百分比
id:空闲 CPU 百分比
wa:等待输入输出的 CPU 时间百分比
输入 top 后,按大写P,以 CPU 占用大小排序,按 M,以内存占用大小排序
使用 iostat 命令查看 I/O读写负载情况
用 sudo iostat –x 1 10
命令查看:
输出结果含义:
例如:
[root@localhost ~]# sudo iostat –x 1 10
Linux 4.14.195-rt94 (aubo) 2024年05月17日 _x86_64_ (4 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
11.76 0.01 1.33 0.09 0.00 86.80
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
loop0 0.00 0.00 0.00 0.00 0.00 0.00 2.00 0.00 1.00 1.00 0.00 0.00 0.00
sda 3.98 2.03 16.33 0.93 285.76 28.50 36.42 0.02 0.97 0.78 4.34 0.41 0.71
dm-0 0.00 0.00 20.25 2.95 279.25 28.50 26.53 0.03 1.48 1.01 4.75 0.30 0.70
dm-1 0.00 0.00 0.01 0.00 0.16 0.00 51.91 0.00 0.27 0.27 0.00 0.27 0.00
Linux 4.14.195-rt94
是内核的版本号,aubo
则是主机的名字, 2024年05月17日
当前的日期, _x86_64_
是CPU的架构, (4 CPU)显示了当前系统的CPU的数量。
CPU 属性值说明:
- %user:CPU 处在用户模式下的时间百分比。
- %nice:CPU 处在带NICE值的用户模式下的时间百分比。
- %system:CPU 处在系统模式下的时间百分比。
- %iowait:CPU 等待输入输出完成时间的百分比。
- %steal:管理程序维护另一个虚拟处理器时,虚拟 CPU 的无意识等待时间百分比。
- %idle:CPU 空闲时间百分比。
1.2.3 测试结果评估
先用 top 命令查看,wa 的值标识 I/O 等待所占用的 CPU 时间的百分比,高于 30% 时表示 I/O 压力高。 load average
超过CPU数目时,表示 CPU 比较吃力地负载当前系统所包含的进程,可以根据%CPU
查看是那个进程占用 cpu 比较高,根据 %MEM
查看是那个进程使用内存比较高。
再用 iostat
命令查看,如果 %util 接近 100%,说明产生的 I/O 请求太多,I/0 系统已经满负荷,该磁盘可能存在瓶颈,%idle
小于70%,表示 I/0 压力比较大。%iowait
高表示 IO 存在瓶颈;如果 await
值持续增加,那么可能存在其他系统瓶颈,如 CPU 或内存不足。
2. 网络实时性
2.1 使用 ping
测试通讯实时性
使用方法可参考:https://www.cnblogs.com/gao-qiang/archive/2012/10/05/2712365.html
2.1.1 工具介绍
ping
是常用的网络诊断工具,用于测试网络连接的可达性和实时性。它通过发送 ICMP
回显请求并等待响应来测量网络延迟。
2.1.2 测试步骤
(1) 打开终端或命令提示符。
(2) ping 的使用及参数简介。
命令格式:
ping [-aAbBdDfhLnOqrRUvV] [-c count] [-i interval] [-I interface]
[-m mark] [-M pmtudisc_option] [-l preload] [-p pattern] [-Q tos]
[-s packetsize] [-S sndbuf] [-t ttl] [-T timestamp_option]
[-w deadline] [-W timeout] [hop1 ...] destination
参数简介:
- -d 使用Socket的SO_DEBUG功能。
-f 极限检测。大量且快速地送网络封包给一台机器,看它的回应。
-n 只输出数值。
- -q 不显示任何传送封包的信息,只显示最后的结果。
- -r 忽略普通的Routing Table,直接将数据包送到远端主机上。通常是查看本机的网络接口是否有问题。
- -R 记录路由过程。
- -v 详细显示指令的执行过程。
- -c 数目:在发送指定数目的包后停止。
- -i 秒数:设定间隔几秒送一个网络封包给一台机器,预设值是一秒送一次。
- -I网络界面:使用指定的网络界面送出数据包。
- -p 范本样式:设置填满数据包的范本样式。
- -s 字节数:指定发送的数据字节数,预设值是56,加上8字节的ICMP头,一共是64ICMP数据字节。
- -t 存活数值:设置存活数值TTL的大小。
使用推荐参数执行 ping
命令:
# 向测试机每隔 1ms 发送一次,共发送100个长度为 1024byte 的数据包
ping -i 0.001 -s 1024 -c 100 192.168.120.206
(3)观察 ping
命令的输出结果,包括响应时间、丢包率等指标。
输出结果含义:
例如:
ping -i 0.001 -s 1024 -c 100 192.168.11.112
PING 192.168.11.112 (192.168.11.112) 1024(1052) bytes of data.
1032 bytes from 192.168.11.112: icmp_seq=1 ttl=128 time=3.17 ms
1032 bytes from 192.168.11.112: icmp_seq=2 ttl=128 time=2.45 ms
1032 bytes from 192.168.11.112: icmp_seq=3 ttl=128 time=2.59 ms
1032 bytes from 192.168.11.112: icmp_seq=4 ttl=128 time=2.50 ms
...
1032 bytes from 192.168.11.112: icmp_seq=99 ttl=128 time=2.37 ms
1032 bytes from 192.168.11.112: icmp_seq=100 ttl=128 time=2.52 ms
--- 192.168.11.112 ping statistics ---
100 packets transmitted, 100 received, 0% packet loss, time 429ms
rtt min/avg/max/mdev = 1.373/2.813/13.869/2.093 ms
输出含义:
ping
命令每隔 1ms 发送一次,一共发送100个长度为 1024byte 的数据包 ,下面的1032 bytes from 192.168.11.112: icmp_seq=99 ttl=128 time=2.37 ms
,表示本地主机已收到从被测试的机器上返回的信息,TTL 为 128,最下面为统计数据,表示收到了(Receieved)100个,共丢失了(Lost)0个(即没有丢失),发送时间最小为 1.373 毫秒,最大 13.869 毫秒,平均时间为 2.813 毫秒。
2.1.3 测试结果分析
根据测试结果,对比标准值,分析网络的实时性能是否满足预期要求。
为了 ARCS 软件能够正常运行,经比较不同系统下的测试结果,针对各项性能指标提供以下标准值:
无线环境(无线局域网)
min=2.373 avg=4.813 max=26.869 ms
有线环境(网线直连)
min=0.397 avg=0.476 max=0.997 ms
只有当前系统测试的结果小于该标准值(主要参考 avg)时,表示当前网络的实时性符合要求,可用;
2.2 使用 iperf 测试网络带宽
使用方法可参考:https://www.cnblogs.com/qiynet/p/10767962.html
2.2.1 工具介绍
iperf
是一个网络性能测试工具。Iperf 可以测试 TCP 和 UDP 带宽质量。Iperf 可以测量最大 TCP 带宽,
具有多种参数和 UDP 特性。Iperf 可以报告带宽,延迟抖动和数据包丢失。
2.2.2 测试步骤
(1) 安装 iperf
工具(如果需要)。
使用 iperf
工具测带宽,分为服务端与客户端,测试机(客户端)和被测试机(服务端)都要安装 iperf
工具。
# ubuntu 系统下安装 iperf
sudo apt-get install iperf
(2) iperf
的使用及参数简介。
常用参数简介:
- -s 以server模式启动;
- -c host 以client模式启动,host是server端地址;
通用参数:
- -f [kmKM] 分别表示以 Kbits, Mbits, KBytes, MBytes 显示报告,默认以 Mbits 为单位;
- -i sec 以秒为单位显示报告间隔;
- -l 缓冲区大小,默认是 8KB;
- -m 显示 tcp 最大 mtu 值 ;
- -o 将报告和错误信息输出到文件;
- -p 指定服务器端使用的端口或客户端所连接的端口 ;
- -u 使用 udp 协议;
- -w 指定 TCP 窗口大小,默认是 8KB;
- -B 绑定一个主机地址或接口(当主机有多个地址或接口时使用该参数);
- -C 兼容旧版本(当 server 端和 client 端版本不一样时使用);
- -M 设定 TCP 数据包的最大mtu值;
- -N 设定 TCP 不延时;
- -V 传输 ipv6 数据包;
server 专用参数:
- -D 以服务方式运行;
- -R 停止 iperf 服务;
client 端专用参数:
- -d 同时进行双向传输测试;
- -n 指定传输的字节数;
- -r 单独进行双向传输测试;
- -t 测试时间,默认20秒;
- -F 指定需要传输的文件;
- -T 指定 ttl 值;
使用推荐参数执行 ping
命令:
# 被测试机 ip:192.168.10.222
iperf -s
# 测试机
iperf -c 192.168.10.222 -t 60 -d
(3) 观察 iperf
命令的输出结果;
输出结果含义:
例如:
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
[ ID] Interval Transfer Bandwidth
[ 4] 0.0-60.0 sec 112 MBytes 94.1 Mbits/sec
表明这台机器的网络上下行带宽都接近 94Mbits/sec
。
2.2.3 测试结果分析
根据测试结果,对比标准值,分析网络的带宽性能是否满足预期要求。
为了 ARCS 软件能够正常运行,经比较不同系统下的测试结果,针对各项性能指标提供以下标准值:
无线网络带宽: 60Mbits/sec 有线网络代码: 90Mbits/sec
只有当前系统测试的结果网络带宽大于标准值时,表示当前网络的性能符合要求,可用;
2.3 使用 Netperf
和 sockperf
工具测试网络性能
使用方法参见:网络性能测试最佳实践
2.3.1 Netperf 测试网络带宽
(1) 分别连接测试机和辅助测试机。
(2) 分别在测试机和辅助测试机上执行以下命令,下载Netperf。
wget https://benchmark-packages.oss-cn-qingdao.aliyuncs.com/netperf-2.7.0.tar.gz
(3) 分别在测试机和辅助测试机上执行以下命令,安装Netperf和sar监控工具。
执行以下命令,解压Netperf包。
sudo apt-get install -y gcc autoconf automake libtool sysstat
tar -zxvf netperf-2.7.0.tar.gz
(4) 执行以下命令,查询 gcc 版本号; 要求测试机和辅助测试机安装的gcc版本低于或等于10版本。
gcc -v 2>&1
(5) 执行以下命令,安装 Netperf 和 sar 监控工具。
cd netperf
sudo ./configure
sudo make && sudo make install
(6) 在测试机上执行以下命令,启动 64 个 netserver 服务。
#!/bin/bash
for j in `seq 64`; do
netserver -p $[16000+j] > server_$[16000+j].netperf > /dev/null 2>&1 &
done
(7) 在测试机上执行以下命令,查询测试机的私网 IP 地址。
ifconfig || ip addr
在测试机上执行以下命令,测试网络带宽。
sar -n DEV 1
在测试结果中查看 rxkB/s
列的数据值,rxkB/s
表示该测试机每秒钟接收的数据包的大小,单位为千字节(KB)。与带宽(kbps)转换关系为:带宽(kbps)= 千字节数(rxkB/s)* 8
。
示例如下图所示:
2.3.2 sockperf 测试网络时延
(1) 分别远程连接测试机和辅助测试机。
(2) 分别在测试机和辅助测试机上执行以下命令,安装sockperf。
sudo apt-get install -y autoconf automake libtool gcc-c++
cd /opt
sudo wget https://github.com/Mellanox/sockperf/archive/refs/tags/3.8.tar.gz
sudo tar -zxf 3.8.tar.gz
cd sockperf-3.8/
sudo ./autogen.sh
sudo ./configure
sudo make -j `cat /proc/cpuinfo| grep process | wc -l`
sudo make install
(3) 在测试机上执行以下命令,查询测试机的私网 IP 地址。
ifconfig || ip addr
image.png
(4) 在测试机上执行以下命令,启动服务。
sockperf sr --tcp --daemonize
(5) 在辅助测试机上执行以下命令,向测试机输入流量。
cd
# <测试机私网IP地址>需替换为上一步查询的实际测试机的私网IP地址。
sockperf pp -i <测试机私网IP地址> --tcp -t 30 -m 14 --full-log=result.json
(6) 查看结果数据,示例如下图所示。
输出结果含义:
以avg-latency开头的结果数据表示平均时延,单位为us。
以percentile 99.000开头的结果数据表示99分位时延,单位为us。
例如:
表明当前被测试机的时延约为 66 us;
2.3.3 测试结果分析
根据测试结果,对比标准值,分析网络的性能是否满足预期要求。
为了 ARCS 软件能够正常运行,经比较不同系统下的测试结果,针对各项性能指标提供以下标准值:
网络带宽:rxkB/s = 4600 网络时延:avg-latency = 70 us
只有当前系统测试的结果网络带宽大于标准值,网络时延小于标准值时,表示当前网络的实时性符合要求,可用;
备注: 使用
Netperf
和sockperf
工具测试的结果比ping
更精确;
3. 应用示例
3.1 环境说明
此次测试在无线局域网中进行;
3.2 测试步骤
1. 使用 cyclictest
测试系统实时性
sudo cyclictest -p 99 -i 1000 -l 10000
结果分析:
测试数据等于标准值(Min: 14 Avg: 32 Max: 2335
),该被测试机的系统实时性满足要求;
2. 使用 ping
测试通讯实时性和带宽
结果分析:
测试数据小于标准值(min=2.373 avg=4.813 max=26.869 ms
),该被测试机的网络实时性满足要求;
3 . 使用 iperf 测试带宽
结果分析:
测试数据大于标准值(60Mbits/sec),该被测试机的网络带宽满足要求;
4. 使用 Netperf
和 sockperf
测试
(1) 测试网络带宽
(2) 测试网络时延
查看结果数据,如下图所示:
结果分析:
测试数据中,网络带宽约等于标准值(4600 rxkB/s),网络时延约等于标准值(70 us),该被测试机的网络带宽和网络时延均满足要求;