在开发车载Android应用和系统时,我们总会面临着一些挑战,尤其是处理高负载应用。例如,当一款新车型发布后,用户可能会同时运行地图、智能驾驶和爱奇艺等资源密集型应用。在这种情况下,如果用户尝试使用语音唤醒功能,可能会发现语音识别反应迟钝。
通常,开发者会根据日志中显示的信息来优化应用,以解决这些高负载下的异常问题。然而,由于Android系统的高负载环境难以模拟,我们很难在开发阶段提供令人信服的优化结果。
不过,Linux系统中已经存在一个名为Stress
的工具,可以模拟高负载环境。本文将介绍如何将Stress工具移植到Android系统中,并简要演示如何使用它来模拟Android系统的高负载环境,以便我们可以更有效地进行应用优化。
Stress - 简介
Stress
是一个功能强大的Linux压力测试工具,专门设计用于模拟高负载条件下的系统环境。它能够对系统的关键组件,如CPU 、内存 、输入/输出操作 和磁盘驱动器,施加压力,以评估它们在极端负载下的表现。
通过执行stress
命令,用户可以精确地模拟各种资源的消耗模式,从而测试系统和应用在面对高并发任务和复杂运算时的稳定性和性能。这使得Stress
成为了评估系统健壮性和寻找潜在弱点的理想工具。
Stress - 移植到 Android 系统中
关于如何移植,可以参考官方文档:developer.android.com/ndk/guides/... 下面给详细的流程:
- 下载 Stress 源码
下载stress
源码:src.fedoraproject.org/repo/pkgs/s...
这里我下载的是stress-1.0.4.
解压之后,源码目录如下:
- 配置交叉编译环境
由于我们需要将stress
编译成一个可以在Arm-Android环境下运行的程序,所以还需要下载NDK工具链。
下载完成后,将NDK工具链的地址配置到linux的环境变量中。
我的电脑只用来进行交叉编译,所以我将NDK直接配置在环境变量里面。如果你的电脑还要编译其它平台的C程序,完成编译后,记得删除。
这里我编译的环境是deepin OS,如果使用Ubuntu等其它linux环境,环境变量的配置文件名称可能会有所不同。
配置完成后,在命令行中执行source ~/.bashrc
,让环境变量生效,或者重启电脑也可以让环境变量生效。
- 执行交叉编译
bash
./configure --host $TARGET
# $TARGET 就是在环境变量中配置的 aarch64-linux-android
make
完成编译后,可以在src目录下,看到编译好的stress可执行文件
- push到Android系统中
perl
adb push stress /system/bin/
然后就可以在系统中执行stress
的相关指令了。
Stress - 语法与参数
lua
stress [选项] [参数]
-?, --help: 显示帮助信息
--version: 显示版本信息
-v, --verbose: 详细输出
-q, --quiet: 静默输出
-n, --dry-run: 展示原本的输出
-t, --timeout: N秒后退出
--backoff: 开始工作前等待N微秒
-c, --cpu N: 模拟CPU使用个数
-i, --io N: 模拟I/O,将内存缓冲区中的数据立即写入磁盘
-m, --vm N: 模拟N个进程频繁调用/释放内存
--vm-bytes B: 指定每个进程中分配内存的大小(与 -m 使用)
--vm-stride B: touch a byte every B bytes (default is 4096)
--vm hang N 睡眠N秒后释放(默认为无,0为inf)
--vm-keep: 一直占用内存,而不是循环调用/释放(与 -m 使用)
-d, --hdd N: 模拟磁盘写(创建文件,写入内容,删除文件)
--hdd-bytes B: 指定写入文件大小,默认为1GB(与 -d 使用)
常用选项:
-
--cpu <N>
:模拟 CPU 负载,使用 N 个线程。可以简写为-c <N>
。 -
--vm <N>
:模拟内存负载,使用 N 个线程。可以简写为-m <N>
。 -
--io <N>
:模拟 IO 负载,使用 N 个线程。可以简写为-i <N>
。 -
--hdd <N>
:模拟磁盘负载,使用 N 个线程。可以简写为-d <N>
。 -
--timeout <N>
:设置测试运行的时间,单位秒。可以简写为-t <N>
。
Stress - 使用场景
模拟CPU负载
使用 --cpu N
选项,会让stress
生成N个工作进程进行开方运算,借此对CPU产生负载。例如,以下命令将使用 2 个进程模拟 CPU 负载:
css
stress --cpu 2
执行top指令可以看到,stress
运行了两个进程占据200%的CPU。
模拟内存负载
使用 --vm
选项可以模拟内存负载。例如,以下命令将使用 1GB 的内存模拟内存负载:
css
stress --vm 1 --vm-bytes 1G
模拟内存负载有多种可选指令:
--vm-bytes :指定每个进程中分配内存的大小,循环申请/释放(与 -m 使用)
--vm-keep :一直占用内存,而不是循环调用/释放(与 -m 使用)
--vm hang N:申请内存后,睡眠N秒后再释放(默认为无,0为inf)
--vm-stride B: touch a byte every B bytes (default is 4096)
模拟I/O负载
模拟I/O负载,是指将内存缓冲区中的数据写入磁盘。
使用 --io
选项可以模拟 IO 负载。例如,以下命令将使用 4 个线程模拟 IO 负载:
css
stress --io 4
模拟磁盘读写负载
模拟磁盘读写负载,是指模拟磁盘写(创建文件,写入内容,删除文件)
使用 --hdd
选项可以模拟带宽负载。
css
stress --hdd 1 --hdd-bytes 100M
设置测试时间
使用 --timeout
选项可以设置测试运行的时间。例如,以下命令将使用 2 个进程模拟 CPU 负载,并持续运行 60 秒:
css
stress --cpu 2 --timeout 60s
联合使用
以上指令可以联合使用,如下所示:
css
stress --cpu 8 --io 4 --vm 2 --vm-bytes 128M --timeout 10s