JasonWang's Blog

JasonWang's Blog

「置顶」收藏的学习资料

以下是从事软件开发以来收藏的资料/书籍/网站, 欢迎推荐~

基础

深入Linux容器LXC之二-LXC源码分析

在上一篇文章中深入Linux容器LXC之一-LXC的实现原理着重介绍了LXC容器的实现原理,我们对LXC容器的基本原理有了一定的了解,但其中有一个问题,启动一个容器后,容器系统中存在两个名为init的进程。为什么会有两个init进程?为了解开这个疑问,需要对LXC的源码做一个深入的分析。本篇文章主要是围绕这个问题展开,大致分为两个大的部分:

  • lxc-create的实现: LXC容器是如何创建的
  • lxc-start的实现: LXC容器是如何启动的
深入Linux容器LXC之一-LXC的实现原理

容器(Containers)是一种创建轻量级虚拟的应用执行环境的技术;基于容器技术,我们可以轻松的在同一个操作系统中构建出多个隔离、虚拟的运行环境,不同于基于虚拟化技术(hypervisor)的硬件级别的隔离方案,容器通过Linux内核中的命名空间(Namespace)以及控制分组(Cgroups)来实现进程级资源如CPU、内存、IO、网络等隔离与管理。目前常见的容器方案有Linux Containers(LXC)DockerLXC可以用于进程执行也可以用于启动一个系统镜像(包含rootfs的完整系统执行环境),而Docker一般用于云计算中的应用程序的打包运行。

深入Linux容器文章系列准备分为上下两篇来写,第一篇主要围绕LXC容器的基本实现原理以及如何在ubuntu系统中创建自己的容器;下篇主要从源码的角度分析下LXC是如何实现的。这篇文章,我们着重了解下LXC的实现原理,主要从如下两个方面进行介绍:

  • 首先从namespacecgroups两个基本的概念介绍LXC的基本原理
  • 基于Ubuntu系统搭建、启动一个完整的LXC容器
说一说VLAN

VLAN(Virtual Local-Area-Network)虚拟局域网,用于将一个物理局域网(LAN)在逻辑上分割为多个独立虚拟的广播域;每个VLAN都对应一个广播域,可以直接通讯,而不同VLAN的主机则无法直接互通,这样广播报文就限定在一个固定的VLAN内。VLAN工作在网络协议栈的数据链路层(L2),通过在网络数据报文中增加一个额外的VLAN标签,从而让同一个物理局域网的流量可以像多个物理局域网一样分隔开来;另外,我们也可以利用VLAN中的优先级标签来保证局域网中的高优先级流量可以更低延迟的进行传输,从而提升整个网络的传输质量。这篇文章,主要从两个方面介绍下VLAN:

  • 首先介绍下如何创建、配置VLAN
  • 其次基于数据报文分析下VLAN是如何在Linux内核中实现的
一个CPU steal-time高的问题

前两天碰到一个基于QNX的虚拟化平台上的项目问题,同事反馈系统很卡,点击页面明显有延迟,卡顿严重。用top看了下Android系统的负载,还有20%左右的空闲,其他的如用户态、内核态以及中断的占用都比较正常,唯独有一个%host的占用特别高,最高能占到60%以上。这个host的占用是什么意思了?这篇文章,我们就基于这个问题,来详细阐述分析下虚拟化平台中host占用高的问题以及在虚拟化平台KVM是如何计算host占用的。

Linux内核模块签名那些事

最近有同事反馈一个系统启动失败的问题,根因是系统的驱动模块加载失败导致system_server无法正常启动。lsmod查看,没有有任何的驱动加载,尝试insmod /vendor/lib/modules/cnss2.ko会提示:

1
2
3

insmod: failed to to load cnss2.ko : Key was rejected by service

说明对应模块的签名与内核不一致,导致安装失败了。这里我们就来看看内核模块具体是怎么签名的,模块签名又是如何验证的,以及如何通过工具进行模块的签名检验。

深入理解Android进程冻结

GoogleAndroid11系统开始支持应用冻结功能,可以将后台长时间未运行的任务暂缓执行,通过将对应的进程迁移到对应的cgroup分组来冻结对应的后台缓存应用,这样可以减少如CPU、内存等资源占用,减少业务在后台的不当行为,尽可能减少功耗。本文将对Android的进程冻结的实现原理、冻结策略进行详细的介绍与阐述,争取把相关的策略与机制都讲述清楚,主要分为以下几个部分 :

  • Android进程冻结的大致框架:主要介绍进程冻结的总体框架与思路
  • Android进程冻结的实现原理:介绍Android如何实现进程冻结
  • Android进程冻结的冻结策略:进程冻结的具体策略
Linux实时调度踩到的那些坑

早期Linux内核的调度更多考虑的是系统调度的公平与吞吐量,对于实时性的支持并不友好。为了改善系统的响应时间,降低某些场景下实时任务的调度延迟,从2.6版本开始支持了实时调度与抢占功能,开发人员为此专门建立了一个实时Linux的网站,上面提供了实时内核的一些历史状态与补丁信息。实时调度对于音视频、UI渲染等对时间非常敏感的任务来说,非常必要。比如对于Android平台,会将音频、渲染相关的一些核心任务的调度策略设置为实时调度,这样可以减少系统调度延迟与任务抢占带来的延时。Linux内核中的实时调度主要有两种调度策略:

  • SCHED_FIFO: 先入先出,即优先级高的任务优先执行,不会被其他任务抢占,直到对应的任务阻塞或者主动释放CPU
  • SCHED_RR: 轮询(也称随机轮盘)调度,相同优先级的任务轮流执行相同的时间片,时间片用完后会调度其他的任务

本文基于Linux内核5.10版本分析

高通QNX平台DCVS介绍

目前智能座舱领域的方案中,高通的两大平台8155/8295占据了大部分的市场份额,这两个硬件平台都是基于QNX系统的虚拟化方案实现的,就是说中控域与仪表域都跑在一个系统上了-座舱通常是Android系统,实际是QNX上的一个虚拟机;而仪表通常是运行在QNX侧。跟传统的单Android系统比较来看,QNX虚拟化平台有很多的变化,比如很多物理驱动与系统服务都跑在了QNX上,而Android上看到的只是一个虚拟的设备,或者压根就去掉了,比如本文要讲到的动态调频与调压功能DCVS(Dynamic Clock and Voltage Scaling)就是一个例子,这个功能在Android上已经没有了,所有的调频与调压功能都在QNX上实现。

DCVS也可将其称为DVFS(Dynamic Voltage and Frequency Scaling)实际都是根据系统负载动态调整CPU/GPU/DDR等工作频率与电压,从而减少功耗

接下来,我们就一起看看高通QNX平台的DCVS功能是如何实现的,以及如何在QNX平台查看CPU, GPU,UFS,DDR的频率。

avatar
JasonWang
生命短暂,莫空手而归