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


    在开发车载Android应用和系统时,我们总会面临着一些挑战,尤其是处理高负载应用。例如,当一款新车型发布后,用户可能会同时运行地图、智能驾驶和爱奇艺等资源密集型应用。在这种情况下,如果用户尝试使用语音唤醒功能,可能会发现语音识别反应迟钝。

    通常,开发者会根据日志中显示的信息来优化应用,以解决这些高负载下的异常问题。然而,由于Android系统的高负载环境难以模拟,我们很难在开发阶段提供令人信服的优化结果。

    不过,Linux系统中已经存在一个名为Stress的工具,可以模拟高负载环境。本文将介绍如何将Stress工具移植到Android系统中,并简要演示如何使用它来模拟Android系统的高负载环境,以便我们可以更有效地进行应用优化。

    Stress - 简介

    Stress是一个功能强大的Linux压力测试工具,专门设计用于模拟高负载条件下的系统环境。它能够对系统的关键组件,如CPU内存输入/输出操作磁盘驱动器,施加压力,以评估它们在极端负载下的表现。

    通过执行stress命令,可以精确地模拟各种资源的消耗模式,从而测试系统和应用在面对高并发任务和复杂运算时的稳定性和性能。这使得Stress成为了评估系统健壮性和寻找潜在弱点的理想工具。

    Stress - 移植到 Android 系统中

    关于如何移植三方Native库,可以参考官方文档:https://developer.android.com/ndk/guides/other_build_systems?hl=zh-cn

    下面是详细的流程:

    第一步,下载 Stress 源码

    下载stress源码:https://src.fedoraproject.org/repo/pkgs/stress/ 这里我下载的版本是stress-1.0.4。

    解压之后,源码目录如下:

    第二步,配置交叉编译环境

    由于我们需要将stress编译成一个可以在Arm-Android环境下运行的程序,所以还需要下载NDK工具链。

    下载完成后,将NDK工具链的地址配置到linux的环境变量中。

    #配置NDK工具链地址
    export NDK=/data/home/link/Android/Sdk/ndk/27.0.11718014
    export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
    # Only choose one of these, depending on your device...
    export TARGET=aarch64-linux-android
    # Set this to your minSdkVersion.
    export API=21
    # Configure and build.
    export AR=$TOOLCHAIN/bin/llvm-ar
    export CC=$TOOLCHAIN/bin/$TARGET$API-clang
    export AS=$CC
    export CXX=$TOOLCHAIN/bin/$TARGET$API-clang++
    export LD=$TOOLCHAIN/bin/ld
    export RANLIB=$TOOLCHAIN/bin/llvm-ranlib
    export STRIP=$TOOLCHAIN/bin/llvm-strip
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    image.png

    我的电脑只用来进行交叉编译,所以我将NDK直接配置在环境变量里面。如果你的电脑还要编译其它平台的Native程序,完成编译后,记得删除配置的环境变量。

    我编译的环境是deepin OS,如果使用Ubuntu等其它linux环境,环境变量的配置文件名称可能会有所不同。

    配置完成后,在命令行中执行source ~/.bashrc,让环境变量生效,或者重启电脑也可以让环境变量生效。

    第三步,执行交叉编译

     # 配置编译的目标环境
     ./configure --host $TARGET
     
     make
    
    • 1
    • 2
    • 3
    • 4

    $TARGET 是一个常量,我们已经在环境变量中配置过了,也就是aarch64-linux-android
    。等待编译完成后,可以在src目录下,找到编译好的可执行文件。

    第四步,放入Android系统中

    执行push指令,将可执行文件放入Android系统中。

    注意,我们需要在开发板上获取系统的root、remount权限。

    adb root
    adb remount
    adb push stress /system/bin/
    
    • 1
    • 2
    • 3

    然后就可以在系统中执行stress的相关指令了。

    Stress - 语法与参数

    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 使用)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    常用选项:

    • --cpu :模拟 CPU 负载,使用 N 个线程。可以简写为 -c
    • --vm :模拟内存负载,使用 N 个线程。可以简写为 -m
    • --io :模拟 IO 负载,使用 N 个线程。可以简写为 -i
    • --hdd :模拟磁盘负载,使用 N 个线程。可以简写为 -d
    • --timeout :设置测试运行的时间,单位秒。可以简写为 -t

    Stress - 使用场景

    模拟CPU负载

    使用 --cpu N 选项,会让stress生成N个工作进程进行开方运算,借此对CPU产生负载。例如,以下命令将使用 2 个进程模拟 CPU 负载:

    stress --cpu 2
    
    • 1

    执行top指令可以看到,stress运行了两个进程占据200%的CPU。

    模拟内存负载

    使用 --vm 选项可以模拟内存负载。例如,以下命令将使用 1GB 的内存模拟内存负载:

    stress --vm 1 --vm-bytes 1G
    
    • 1

    模拟内存负载有多种可选指令:

    –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 负载:

    stress --io 4
    
    • 1

    模拟磁盘读写负载

    模拟磁盘读写负载,是指模拟磁盘写(创建文件,写入内容,删除文件)

    使用 --hdd 选项可以模拟带宽负载。

    stress --hdd 1 --hdd-bytes 100M
    
    • 1

    设置测试时间

    使用 --timeout 选项可以设置测试运行的时间。例如,以下命令将使用 2 个进程模拟 CPU 负载,并持续运行 60 秒:

    stress --cpu 2 --timeout 60s
    
    • 1

    联合使用

    以上指令可以联合使用,如下所示:

    stress --cpu 8 --io 4 --vm 2 --vm-bytes 128M --timeout 10s
    
    • 1

    总结

    如果你不想自己编译stress,可以在我的github上下载我编译好的可执行文件,下载地址:https://github.com/linxu-link/CarAndroidCourse/tree/master/other/stress

    以上就是本篇的所有内容,希望对你有所帮助。

  • 相关阅读:
    设计模式(十)----结构型模式之适配器模式
    联想r9000p 关闭背面光
    【DevPress】V2.2.1版本发布,增加专栏内容管理
    淘宝/天猫API:item_videolist-按分类搜索淘宝直播接口
    16-数据结构-图的存储结构
    官方盘点 .NET 7 新功能
    Databend 特性系列(1)|Databend 数据生命周期
    Intel RealSense D435i与IMU标定用于vins-fusion
    《BEV LaneDet:Fast Lane Detection on BEV Ground》论文笔记
    jetson设置
  • 原文地址:https://blog.csdn.net/linkwj/article/details/138077412