Files
LDD-LinuxDeviceDrivers/android/OPPO.md
T

10 KiB

title, date, author, tags, categories, thumbnail, blogexcerpt
title date author tags categories thumbnail blogexcerpt
OPPO ANDROID 优化 2021-02-15 00:32 gatieme
linux
tools
技术积累
ANDROID

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可, 转载请注明出处, 谢谢合作

知识共享许可协议

因本人技术水平和知识面有限, 内容如有纰漏或者需要修正的地方, 欢迎大家指正, 鄙人在此谢谢啦

转载请务必注明出处, 谢谢, 不胜感激


日期 作者 GitHub CSDN BLOG
2021-02-15 成坚-gatieme AderXCoding/system/tools/fzf 使用模糊搜索神器 FZF 来提升办公体验 Using FZF to Improve Productivit

2 OPPO

--------------- 重要功能和时间点 ---------------**

下文将按此目录分析 Linux 内核中 MM 的重要功能和引入版本:

--------------- 正文 ---------------**

1 SCHED


1.1 OPPO oplus_scheduler


feature sysfs interface
oplus_scheduler OPLUS_SCHEDASSIST_PROC_DIR
slide_boost OPLUS_SLIDEBOOST_PROC_DIR
sched_assist OPLUS_SCHEDASSIST_PROC_DIR

1.1.1 Sched Assist


OPPO 通过 global_sched_assist_scene 进行场景标记和感知. 然后通过 sched_assist_scene() 获取到当前所属的场景.

CONFIG 描述 源代码路径 代表手机 芯片平台
CONFIG_OPLUS_FEATURE_SCHED_ASSIST
CONFIG_OPLUS_FEATURE_SCHED_SPREAD nr-balance to spread tasks kernel/sched/oem_sched/oem_fair
vendor/oplus/kernel/oplus_performance_5.10/misc/sched_assist
kernel/oplus_perf_sched/sched_assist
OPPO FindX5 Pro Snapdragon 8 Gen 1, QCOM-5.10, ColorOS 12.1 PFEM10_11_A.18

1.1.1.1 SCHED_ASSIST


1.1.1.2 SCHED_SPREAD


CONFIG_OPLUS_FEATURE_SCHED_SPREAD 实现了一个仅通过 nr_running 数量来进行分级选核和负载均衡的策略, 无需跟踪 TASK 和 RQ 的实际负载信息, 因此更快速, overhead 更低.

PS. 这种算法我们之前在服务器场景也曾经尝试过, 当时是为了 BYPASS 负载均衡和选核的 overload. 不过当时的数据库业务场景, 并没有看到明显的收益.

oplus_task_struct->lb_state 记录了进程的负载状态 high 或者 low. 每次 WALT 更新进程的负载信息时, 根据进程的负载信息动态更新.

walt_update_task_ravg()
update_task_demand()
update_history()
-=> update_load_flag()

PER_CPU(task_lb_count) 记录了各个 cpu cgroup 分组 high 负载和 low 负载的任务数量. 每次进程入队和出队的时候, 根据进程的 cgroup 信息 task_lb_sched_type() 和其负载信息(high 或者 low), 通过 inc_ld_stats()/dec_ld_stats() 维护 task_lb_count 计数.

enqueue_task()
-=> trace_android_rvh_after_enqueue_task(rq, p) =======> android_rvh_enqueue_task()
    -=> inc_rq_walt_stats(rq, p)
        -=> dec_ld_stats(p, rq)

dequeue_task()
-=> trace_android_rvh_after_dequeue_task(rq, p) =======> android_rvh_dequeue_task()
    -=> dec_rq_walt_stats(rq, p)
        -=> dec_ld_stats(p, rq)

选核时候, 通过 sched_assist_spread_tasks() 按照 nr_running(也就是 PER_CPU(task_lb_count)) 来选核, 寻找到 rq_nr/lowest_nr 最小的 CPU. lowest_nr 相同时则选择 NR 加权负载 rq_nr_load 最小的.

walt_find_energy_efficient_cpu()
-=> walt_find_best_target()
    -=> sched_assist_spread_tasks(p, new_allowed_cpus, fbt_env->order_index, fbt_env->end_index, fbt_env->skip_cpu, candidates, fbt_env->strict_max)
        -=> find_spread_lowest_nr_cpu(p, &visit_cpus, sched_type, prev_cpu, skip_cpu, &lowest_nr, &lowest_nr_load, &lowest_nr_cpu)
-=> if (fbt_env.fastpath == NR_WAKEUP_SELECT) best_energy_cpu = cpumask_first(candidates)

其中 rq_nr_load 直接已 nr_running 做加权来预估 CPU 的负载, 不同 sched_type 的 nr_running 权重不同.

rq_nr_load = 1000 \times ux_nr + 100 \times top_nr + 10 \times fg_nr + bg_nr

2 MM


编号 特性 CONFIG 描述 链接
1 Multi Freearea CONFIG_PHYSICAL_ANTI_FRAGMENTATION 物理内存反碎片机制. mm/multi_freearea.c
2 VM Anti Fragment NA 虚拟内存反碎片化机制. mm/vm_anti_fragment.c
3 Multi Kswapd NA 多线程 KSWAPD. 加速内存回收. vendor/oplus/kernel/oplus_performance/multi_kswapd
4 Health Info CONFIG_OPLUS_MEM_MONITOR NA mm/healthinfo
5 MemoryLeak Detect

2.1 Anti Fragmentation


第 17 届中国 Linux 内核开发者大会(CLK-2022) "内存管理与异构计算" 分论坛的第三个议题 "[手机平台] Linux 内存反碎片化" 来自 OPPO 的开发者李培锋春就对 OPPO ColorOS 上内存反碎片化机制做了深入的讲解.

2.1.1 MF(Multi Freearea) 物理内存反碎片化机制


ColorOS 提供了 MF(Multi Freearea) 提供了物理内存反碎片化的能力.

时间 作者 特性 描述 是否合入主线 链接
2021/04/14 lipeifeng@oppo.com lipeifeng@oppo.com mm: support multi_freearea to the reduction of external fragmentation TODO v1 ☐☑✓ LORE

2.1.2 CSVM(Centralize Small Virtual Mem) 虚拟内存反碎片化机制


ColorOS 提供了 vm_anti_fragment 提供了物理内存反碎片化的能力.

2.2 Multi Kswapd


2.3 Memleak Detect


2.3.1 DUMP_TASKS_MEM


task_mem 提供了 Dump Task Mem 的能力.

ion_track 提供了 dump_ion_info 的能力.

malloc_track

3 帧感知


编号 特性 CONFIG 描述 链接
1 Input Boost PLUS_FEATURE_INPUT_BOOST NA vendor/oplus/kernel/oplus_performance/input_boost
2 Identify Task Itself(IM)) OPLUS_FEATURE_IM 通过 task->im_flag 标记 ANDROID 下的关键线程类型. 在许多情况下, 我们需要识别关键任务, 虽然可以通过字符串比较(比较进程的 COMM 是否是我们关心的任务), 但在一些性能敏感的上下文中, 如调度器路径下, 这样做不是一个好的选择. 这个 IM 工具可以让我们只通过一个比较来检查任务. vendor/oplus/kernel/oplus_performance/im