1、概述

虽然存储设备的恨不能在近年来一直在稳步提升,从raw nand到emmc,再到UFS都在进步,但和CPU相比它们依然是一个低俗的外设,并且IO是不可抢占的,所以应用程序在交互中等待IO会带来非常糟糕的用户体验,大部分程序员都意识到了这一点,所以绝大多数的程序尽量都会想办法改善这个问题,例如预读(readahead)和异步IO等。但是有些场景是很难规避IO的影响的。比如启动应用和本地音视频播放。如果在这两个场景中,还有其它的程序来竞争IO,那对用户体验来说可能无法接受。

2、现有的优化

设想有这样一个场景:某天用户心血来潮要整理设备上的照片或其它文件,通过文件浏览器把大量的文件拷到一张新的TF卡上,这个过程是很漫长的,这个时候他打开一个本地视频观看,但是不幸的事情来了,视频卡顿非常严重。

遇到这种情况,工程师们肯定能理解,文件拷贝和视频播放在竞争IO,导致解码器没有及时得到新的视频数据,进而导致丢帧或音视频不同步。但是用户不一定能接受这个解释。他觉得为什么不能把文件拷贝的速度放慢一些,优先保证视频播放的用户体验。

这时候又轮到工程师来想办法了,在这个场景中,IO实际上可以分两类,视频播放和文件拷贝。把其中视频播放的IO认为是关键IO,问题就变成 了如何避免关键IO拥塞。

让我们先看看万能的谷歌是怎么处理这个问题的,在最新的android版本上会设置所有视频相关进程的IO优先级到RT级,这种优先的效果肯定是有的,但是还有几个问题:

  • 效果有限 BT只能改善,而不能避免关键IO的拥塞,因为文件拷贝的进程会更频繁的发起IO请求,所以经常会碰到这种情况,视频播放的IO请求到来时,设备驱动正在执行文件拷贝操作的IO,由于IO不可抢占,此时只能等这个请求完成,视频播放的请求才能得到服务。
  • 对第三方应用支持有限 如果第三运用是通过MediaCodec或者OMX来实现音视频播放的,此时流媒体数据的请求是应用 自己发起的,并不会被自动配置成RT级
  • 没有考虑启动应用的场景 实测在文件拷贝的同时去启动应用,速度慢了近两倍

注:在线音视频缓存流媒体数据一般都是直接存在内在中的,一是可以保证性能,二是Flash设备的寿命有限,所以不需要考虑IO优化

3、如何改进

3.1、结合cgroup控制

kernel除了IO优先级以外,还有一个blk cgroup控制,目前支持两种控制策略:权重和节流。二者都是通过标准的cgroup方式提供配置接口的,这里就不详细描述了。把进程分组以后,可以给不同的分组配置不同的权重,例如给视频播放进程配置1000的权重,给文件拷贝分配10的权重,则内核会尽量按99:1的比例来分配存储设备的带宽,当然实际上的带宽比例不会是这样的,因为两个进程发起IO的频度是不一样的,内核只能保证短时间内的带宽按配置的权重来分配。而节流的话,则是可以给每个分组每个设备设置一个性能阈值,内核来保证性能不超过这个阈值,例如给文件拷贝分配2MB/s的读带宽,则内核会严格按这个指标分配带宽,即使此时设备带宽还没有用完。

3.2、提升第三方应用兼容性

大部分媒体应用都是直接调用MediaPlayer来实现播放,这样会通过MediaServer来读取流媒体数据,而这个进程android已经配置了RT优先级。但是还有一部分应用是直接调用MediaCodec来实现播放的,比如特殊的加密格式视频,又或者为了实现帧合成等特殊处理,在这种情况下是由视频应用本身来读取流媒体数据,为了改善这个问题,可以在dequeueInputBuffer函数中把当前线程IO优先级和权重都配置到最高。

3.3、识别启动应用的场景

所有的应用启动都要经过ActivityManagerService,所以AMS的startActivity中识别启动应用开始,在Activity.onStart中认为启动应用结束。

3.4、限制文件拷贝性能

为了进一步提升前台应用和媒体应用的用户体验,还需要降低文件拷贝的IO性能,即在识到到启动应用和音视频播放的场景后,会同时根据一个白名单(主要是各种文件浏览器),降低特定活动进程的IO优先级和权重,同时发出一个BROADCAST_IO_JANK的消息,各种系统服务如mtp服务、下载服务等可以在收到这个消息的时候降低IO优先级和权重。

3.5、提供框架层接口

框架层提供IO优先级和权重的配置接口,但是普通应用只支持降低优先级和权重,只有system权限的应用可以提高优先级和权重。

4、整体流程

  • step 1:开机启动过程中,init会为每个系统服务设定IO优先级和权重,其中media相关的进程全部都是RT和最高权重,debugerd、logcatd等都是IDLE和最低权重
  • step 2:AMS会在Activity的不同生命周期,设置不同的IO优先级和权重,其中TOP_APP > FORGROUND > BACKGROUD
  • step 3:媒体播放过程中会设置一个属性media.codec.running=true,来表示当前正在进行音视频编解码,并且会发出BROADCAST_IO_JANK消息,通知系统服务调低mtp、下载器和其它白名单中应用程序的IO优先级和权重到最低,并在播放结束后延迟发出BROADCAST_IO_RESUME(如果在延迟时间内触发新的BROADCAST_IO_JANK,会先移除这个延迟消息)通知系统服务恢复到正常优先级和权重。
  • step 4:在应用启动过程中,如果media.codec.running=false,则会发出BROADCAST_IO_JANK消息,通知系统服务调低mtp、下载器和其它白名单中应用程序的IO优先级和权重到最低,并在启动结束后延迟发出BROADCAST_IO_RESUME(如果在延迟时间内触发新的BROADCAST_IO_JANK,会先移除这个延迟消息),通知系统服务恢复到正常优先级和权重

存储设备IO优化向导(blkio)相关推荐

  1. 基于SSD的存储IO优化解决方案

    2019独角兽企业重金招聘Python工程师标准>>> 基于SSD的存储IO优化解决方案 我们一起走过的10年,还是曾经的硬盘,一成不变的开机速度,让人无法忍受的操作体验.I/O瓶颈 ...

  2. 如何提高Linux下块设备IO的整体性能?

    编辑手记:本文主要讲解Linux IO调度层的三种模式:cfp.deadline和noop,并给出各自的优化和适用场景建议. 作者简介: 邹立巍 Linux系统技术专家.目前在腾讯SNG社交网络运营部 ...

  3. 系统英伟达gpu驱动卸载_绕过CPU,英伟达让GPU直连存储设备

    英伟达最近发布了一个新的GPUDirect Storage,暂且叫做GPU直连存储,让GPU直接连到NVMe存储设备上.这一方案用到了RDMA设备来把数据从闪存存储转移到GPU本地的内存里,无需经过C ...

  4. Android高手笔记 - IO优化

    IO 优化不就是不在主线程读写大文件吗,真的只有这么简单吗? IO 基础 IO流程:应用程序 发送逻辑IO命令给文件系统,文件系统发送物理IO命令给存储设备/磁盘 文件系统 文件读(read)过程:应 ...

  5. Android性能优化--IO 优化( IO基本知识:应用程序、文件系统和磁盘,三种IO方式及适用场景,多线程阻塞IO和NIO)

    目录 I/O 的基本知识 1. 文件系统 2. 磁盘 Android I/O 1. Android 闪存 2. 两个疑问 疑问一:文件为什么会损坏? 疑问二:I/O 有时候为什么会突然很慢? 不同的场 ...

  6. 基于Linux的NAS IO优化-以Padavan为例 [SAMBA+VSFTP+ARIA]

    基于Linux的NAS IO优化-以Padavan为例 一.硬件环境介绍 二.系统分析 1.≈不需要随机读写性能: 2.协议:FTP+SMB 3.aria2离线下载 4.存储器读强写弱,R0降低随机性 ...

  7. 英伟达最大gpu_绕过CPU,英伟达让GPU直连存储设备

    英伟达最近发布了一个新的GPUDirect Storage,暂且叫做GPU直连存储,让GPU直接连到NVMe存储设备上.这一方案用到了RDMA设备来把数据从闪存存储转移到GPU本地的内存里,无需经过C ...

  8. linux后台开发必知的io优化知识总结

    尊重原创版权: https://www.hanzhangsy.com/hot/105435.html 更多内容参考: https://www.hanzhangsy.com/ linux后台开发必知的i ...

  9. Linux性能优化之CPU、内存、IO优化

    Linux 的性能进行监测,以下是 VPSee 常用的工具: 工具    简单介绍 top    查看进程活动状态以及一些系统状况 vmstat    查看系统状态.硬件和系统信息等 iostat   ...

最新文章

  1. binary_crossentropy(二元交叉熵)的定义
  2. 关于Unity3D中鼠标移动指定物体的解决方案
  3. 字符编码总结(UTF-8,UNICODE)
  4. LeetCode Rotate List
  5. js javascript 实现多线程
  6. LeetCode 271. 字符串的编码与解码(4位16进制字符+字符串)
  7. 深度卷积神经网络_深度卷积神经网络中的降采样
  8. java编译大项目很慢_优化MyEclipse编译速度慢的问题、build、project clean 慢
  9. 各种协议在RFC中的编号
  10. mysql数据库操作类
  11. SQLServer启动和关闭bat脚本
  12. 通过文件结构直接生成xls文件
  13. MPU6050六轴传感器的原理及编程说明
  14. 基于Mathemtica绘制一元酸滴定碱的滴定曲线(含V--PH曲线方程的推导)
  15. 点到直线的距离直线的交点及夹角
  16. 安卓手机设置指定文件夹下的图片、视频不被相册读取到
  17. 【Unity3D】AR游戏制作 - Sikuto's Farm
  18. 解决Cannot delete or update a parent row: a foreign key constraint fails的mysql报错
  19. 全屏播放PPT时,播放音乐
  20. Lanproxy 路径遍历漏洞 (CVE-2021-3019)

热门文章

  1. Matlab 仿真——单自由度倒立摆(4)根轨迹法控制器设计
  2. 第三方系统对接的设计思路(案例分享)
  3. 设备数据采集、子系统对接的工具化与通用化是未来工业互联网的发展趋势
  4. CSS IN JS —— CSS Moudules
  5. 四川小学计算机的组成是几年级学,浅谈小学计算机教学_小学四年级计算机
  6. linux redhat中文字体安装,Linux redhat中文字体安装.doc
  7. 手机端测试touch的一段代码
  8. DirectPlay学习笔记[1]
  9. 豆瓣评分9.0,《IBM SPSS数据分析与挖掘实战案例精粹》
  10. 一键重装正版Win系统