【车载Android】模拟Android系统的高负载环境

在开发车载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
相关推荐
千里马学框架1 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台1 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone1 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc1 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo1 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077001 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼1 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
liangshanbo12151 天前
React 性能优化实战
性能优化·react
AFinalStone1 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen1 天前
属性动画原理与高级动画实现
android·kotlin·canvas