我们发现自己处于令人困惑的世界中。我们要理解周围所看到的一切的含义,并且询问:宇宙的本质是什么?我们在其中的位置如何,以及宇宙和我们从何而来?宇宙为何是这个样子?
史蒂芬-霍金
我们发现自己处于令人困惑的世界中。我们要理解周围所看到的一切的含义,并且询问:宇宙的本质是什么?我们在其中的位置如何,以及宇宙和我们从何而来?宇宙为何是这个样子?
史蒂芬-霍金
早前,Android
使用内核中的lowmemorykiller
驱动模块来监控系统内存,在内存不足时会主动杀掉某些非关键性的进程或者应用,从而减少系统的内存压力;自从内核版本4.12
之后,lowmemorykiller
从内核中移除了,因此Android
增加一个lmkd(Low Memory Killer Daemon)
来替代内核驱动用以监控系统内存状态,在系统处于内存高压状态时,主动清理部分内存,确保内存水位处于可接受的状态。那么,LMKD
又是如何获取系统内存压力状态的了?这个就要说到PSI(Pressure stall information)
这个内核模块了。
cgroups(Control Groups)
即控制分组,是Linux
中的一种进程资源分组访问控制机制,用于将系统中的进程划分为不同的分组(形成一种树状层级的结构),利用不同的分组可以实现对各个进程的资源使用,如CPU、IO、内存、网络等系统资源进行优先级管理,可以确保在系统资源紧张的情况下,高优先级的进程可以获得更多的系统资源。简单来说,通过cgroups
,我们可以实现对系统资源的分配、访问优先级、访问限制以及管理、监控等更精细的控制,从而提升系统的性能。本文主要介绍Android
系统如何利用cgroups
来改善系统性能,主要分为以下几个部分:
cgroup
的实现原理cgroup
分组管理策略cgroup
优化Android系统性能fio是一个广泛使用的磁盘性能测试工具,功能强大,可以用于测试磁盘性能,也可以通过I/O
重放来模拟用户的实际请求,其主要有如下几个特点:
Nothing is easier than self-deceit. For what each man wishes, that he also believes to be true(人们善于自欺,人们想得到什么,就会相信什么)
德摩斯梯尼(Demosthenes,古希腊)
If we spoke a different language, we would perceive a somewhat differenet world.
Ludwig Wittgenstein
在Android系统开发过程中,经常碰到CPU占用率高、内存泄露、内存占用高等性能相关的问题,这时通常需要抓取系统的trace
日志,用以查看进程的CPU占用,内存分配等情况。怎么抓取系统trace, 这时一般需要用到系统性能相关的分析工具。这篇文章就以Android S
为例,说明Android开发中常用的一些性能优化工具的使用方法,主要包括如下几个工具:
在讲虚拟化的第二篇QNX系统时,提到在QNX
中设备的虚拟化有直通(pass-through
)、半虚拟化(para-virtulization
)、全虚拟化(full-virtualization
)等几种形式,而像串口、网络设备、块设备等通常都是基于半虚拟化的形式实现的。在半虚拟化的实现方案中,virtio
是最常见的一种。简单来说,virtio
是虚拟化设备的中间抽象层,为设备的虚拟化提供了一个统一的框架与接口,增加了跨平台时代码的复用性。
QNX
最初是Gordon Bell
与Dan Dodge
两人在1980年代初期创建的一个实时微内核操作系统(RTOS(Real-Time Operating System
), 后来被黑莓(BlackBerry
)公司收购,因此也叫做Blackberry QNX
系统。QNX
被世人熟知还是因为其高安全性、QNX hypervisor
等特性在汽车领域的广泛应用。
这两年汽车领域在智能与域融合的推动下,开始兴起了各种虚拟化(Virtualization
)的座舱解决方案,尤其以黑莓公司的QNX
虚拟化方案应用最为广泛。说起来,虚拟化并不是什么新的概念,操作系统诞生之初就有了类似的原型: 对于一个分时的操作系统,通过在不同进程之间切换状态,给每个用户都制造一种完全使用整个机器的感觉,实则是操作系统通过进程之间的资源分时复用实现的结果;虚拟内存让每个进程都可以使用整个内存空间,而不用关心物理内存。简单来说,虚拟化就是一种资源隔离与抽象的方案,通过对CPU
、Memory
、I/O
设备增加中间层的访问控制,以达到与访问物理资源同等的效果。