blkio-controller.txt,我已经学会了如何通过cgroup v1来调整不同进程的IO权重,这个IO权重是在CFQ调度算法中实现的,在深入学习一下CFQ调度算法之前,我决定先看一下CFQ的说明书cfq-iosched.txt cfq-iosched.txt CFQ (Complete Fairness Queueing)完全公平排队 =============================== CFQ调度器的主要目的是为所有请求
我们升级了 Google I/O 与 Android 开发峰会的时间表应用:iosched,使其用上 WorkManager 和 Dagger,它同时也是我们用于展示协程 Flow 最佳实践的应用,详情请查看文章 您可以在 github 的 iosched 仓库中的 ADSsched 分支 中查看引入了此功能的提交 (commits)。 原因是我们使用了一个 DelegatingWorkerFactory 来协调那些单个的工厂(此时,我们在 IOsched 中只有一个工厂,但是我们以一种在需要时可以直接添加更多工厂的方式来构建它): IoschedWorkerFactory.kt :IoschedFirebaseMessagingService.kt 至此,我们结束了探索如何使用 Dagger 把参数注入到您的 Worker,同时也了解了如何将 WorkManager 集成到 iosched
- 开启Block IO控制 CONFIG_BLK_CGROUP=y - 开启group scheduling在CFQ调度算法中 CONFIG_CFQ_GROUP_IOSCHED=y 有关CFQ层次结构支持的详细信息, 请参阅文档/block/cfq-iosched.txt。 device] - blkio.weight[_device]价值在于为了决定多少权重任务在给定的cgroup,并且和子cgroup有竞争关系 关于细节,请参考文档/block/cfq-iosched.txt CFQ sysfs 调整 ================= /sys/block/<disk>/queue/iosched/slice_idle --------------------------- 对于SSD设备,可以将这个值设为 0(我自己查的资料) /sys/block/<disk>/queue/iosched/group_idle -----------------------------
对于一个测试项目我们用Madis用过的代码:一个Android项目demo iosched(http://github.com/google/iosched)。 如果你想自己运行 iosched,从GitHub得到它,就像这样: git clone http://github.com/google/iosched cd ioshed 现在我们准备去克隆了! If using the gradle wrapper, try editing the distributionUrl in /Users/shelajev/repo/tmp/iosched/gradle
Android Dev Summit 应用 从 IO-Sched 到 ADS-Sched The Android Dev Summit 应用(adssched)基于 Google I/O 应用(iosched 开源 adssched IOSched 原意始终是一个示例(从包名可以看出)用以学习目的以及作为其他会议应用程序的基础。
SPDX-License-Identifier: Apache-2.0 --> <style name="Theme.<em>IOSched</em>.Schedule"> … <item name="sessionListKeyline ">72dp</item> </style> <style name="Theme.<em>IOSched</em>.Speaker"> … <item name="sessionListKeyline">16dp
// cfq调度算法 static struct elevator_type iosched_cfq = { .ops.sq = { // 检查下一新的请求是否与可以和现在的请求合并 .elevator_merge_fn elevator_name = "cfq", .elevator_owner = THIS_MODULE, }; // deadline调度算法 static struct elevator_type iosched_deadline
iosched iosched项目是Google I/O的官方app,绝佳的学习项目。 https://github.com/google/iosched android-UniversalMusicPlayer 也是Google官方作品,代码量不大、注释清晰,
以官方IOsched中背靠系统大山的巨兽级组件SessionCalendarService为例,看看在它极其庞大的onHandleIntent胸腔结构里到底有什么:无法实施手术的重度灾变:当这只深海巨兽尝试去更改本地恐怖的系统日历时
then netprio=NETPRIO_CGROUP else netprio=CGROUP_NET_PRIO fi flags=( BLK_CGROUP BLK_DEV_THROTTLING IOSCHED_CFQ CFQ_GROUP_IOSCHED CGROUP_PERF CGROUP_HUGETLB NET_CLS_CGROUP $netprio CFS_BANDWIDTH FAIR_GROUP_SCHED
而更戏剧化的一幕是:即便是被封为最高指南灯塔的官方标杆开源工程IOSched应用,在其内部竟然也找不到对业务模块彻底而严密的自动化守护测试痕迹!
BLK_DEV_LOOP support for loopback block device Y Y - BLK_DEV_RAM block devices for RAM filesystems Y Y - IOSCHED_AS Include Anticipatory IO scheduler Y Y IOSCHED_DEADLINE Include Deadline IO scheduler Y N + IOSCHED_CFQ
以 iosched 项目 (Google I/O 开源应用) 中的一个 ViewModel 为例,您能想象创建一个 FeedViewModel 所需的依赖项及传递依赖项需要多大的代码量吗? 您还记得我们在文章开头看到的 iosched 中的 FeedViewModel 代码吗?您想看看使用 Hilt 支持之后的效果吗?
BLK_DEV_LOOP support for loopback block device Y Y - BLK_DEV_RAM block devices for RAM filesystems Y Y - IOSCHED_AS Include Anticipatory IO scheduler Y Y IOSCHED_DEADLINE Include Deadline IO scheduler Y N + IOSCHED_CFQ
iosched 中的封装函数 在 Fragment 中使用 repeatOnLifecycle API 时必须同 viewLifecycleOwner 一道使用。 在开源的 Google I/O 应用中,开发团队决定在 iosched 项目中创建一个封装器来避免于 Fragment 中误用此 API,它叫做: Fragment.launchAndRepeatWithViewLifecycle
io_poll -rw-r--r-- 1 root root 4.0K 8月 28 19:41 io_poll_delay drwxr-xr-x 2 root root 0 8月 28 19:41 iosched
以开源项目——Google I/O 的 Android 应用 iosched 为例,您可以在 源码中 看到,从 Firestore 获取用户事件的数据流是通过 callbackFlow 实现的。
R8 缩减了 65% 的 DEX 文件大小 (测量数据来自 Android Studio 3.5.1 和 IOSched 示例应用)。
oprofile.ko INSTALL arch/x86/platform/atom/punit_atom_debug.ko INSTALL block/bfq.ko INSTALL block/kyber-iosched.ko
image.png 在上图中,Threads 部分显示了界面线程 (java.com.google.samples.apps.iosched)、RenderThread 和 GPU completion