云计算国产化之路 vnc登录 文件系统直通(virtio-9p) 扩展qemu接口 gpg WARNING 珍藏博客 虚拟内存情况dommemstat分析 免密码自动登录脚本 Linux网桥 测试网段IP占用情况 Linux 进程状态 systemc强制依赖 调试openstack ut uefi p2v 重做ubuntu内核 virsh创建虚拟机简介 virtio IO路径 虚拟化层升级后磁盘无法卸载卷 vmtouch使用 Taint flags 主机和虚拟机文件共享处理的几种方法 kvm分析工具 kvm中对磁盘的io cache 虚拟化不同导致的guestos中软件安装差异(未解决) 设备直通(PCI Assignment)到底是咋整的 virtio到底是咋整的 内核启动参数 虚拟化实时性提升(零)之配置步骤 中断虚拟化(pic)到底是咋整的 中断虚拟化(apic)到底是咋整的 Raid卡配置丢失导致服务器无法启动 tainted kernels cpu stuck for 23s问题分析 虚拟化实时性提升(一)之hostOS切换为强实时系统 内存虚拟化到底是咋整的 qemu-kvm中vcpu虚拟化到底是咋整的 风河虚拟化技术点分析 使用qga的好处 qemu迁移代码分析 虚拟机串口配置及其导出到主机pts和console.log System-based I/O vs. Raw I/O 虚拟机使用Hugepage(大页) 硬件辅助分页(hardware assisted paging) 修改centos7默认启动项目 virtio的工作流程——kernel中virtio-pci初始化(2) virtio的工作流程——qemu中virtio-backend初始化(1) qmp ceilometer取不到memory.usage指标 Virtio-Balloon超详细分析 slabtop输出 虚拟机磁盘cache导致的host os kernel崩溃 虚拟机cpu和memory性能优化测评 PCI配置空间(PCI Configuration Space) centos下网卡设备直通(VT-dpci passthrough)遇到的问题及其解决思路 libguestfs详解 yum卸载软件包及其依赖 通过原始Centos ISO来定制自己的ISO centos下网卡设备直通(VT-d,pci passthrough) (占位符)window虚拟机中拔盘如何通知到libvirt和qemu后端的 cirrus漏洞分析CVE-2017-2615 XSA-208 qcow2随笔 控制寄存器概览 ceilometer对接postgresql 解压initrd和vmlinuz qemu guest agent验证 QEMU升级指南(待续) ubuntu中kdump的配置 qemu(2.3)接口梳理 热迁移导致的FC存储场景下的multipath卷残留问题分析 virsh命令(4)secret,snapshot,pool,volume部分 virsh命令(3)之interface,filter,network virsh命令(2)monitor,host,nodedev部分 virsh命令(1)之domain部分 QEMU内存管理之FlatView模型(QEMU2.0.0) ovirt基于sanock的高可用(主机粒度HA) Sanlock防脑裂场景功能测试用例 gnocchi配置及与ceilometer对接指南 make patch for libvirt in centos centos使用sanlock指导 高可用nfs资料 ubuntu14中使用sanlock指导 LVM操作指南 sanlock相关功能验证流程汇总 make patch for libvirt in ubuntu libvirt.so.0-version `LIBVIRT_PRIVATE_1.2.7' not found gdb debug libvirt 基于ubuntu社区源码包编译libvirt compile libvirt(centos) No PCI buses available nfs lead to Linux halt nfs install and config anti-virus for cloud platform nova fetch image from glance(something about _base) token auth process ovs入门指南 virt software anti-virus something about ceilometer disk sample context interview questions openstack vm injection openstack Restful and RPC murano 概览 创建虚拟机流程(compute节点)之网络创建 创建虚拟机流程之compute_api之虚拟机实例填充之配额检测 创建虚拟机流程之compute_api之基本参数生成 创建虚拟机流程之compute_api 创建虚拟机流程(主) 创建虚拟机之image 创建虚拟机流程之准备网桥 创建虚拟机流程之virt 创建虚拟机流程之compute节点 CI/CD研发流程之工程创建 CI/CD研发流程之代码合入 CI/CD研发流程之UT(单元测试) 向openstack社区合入代码记 openstack/ceilometer/gnocchi杂谈 影子页表原理 mem_add(exec.c) qemu编译安装调试 openstack/ceilometer/gnocchi之Grafana简介 openstack wiki etcd openstack计量ceilometer openstack计费cloudKitty enventlet backdoor USB 安装VMWARE ESX pycharm设置指南 无法执行modprobe -a kvm-intel解决办法 QEMU配置项 网络不通小记 libvirt之XML(虚拟机定义文件) openstack-horizon 证书认证 ceilometer与ceph对接 openstack定时任务剖析(TODO) 服务器重启后mongodb进程无法启动 ubuntu14下新增openstack服务到service的导引 ERROR 1045(28000)-数据库连不上 Python两个内置函数—locals和globals unknown exit, hardware reason 31

虚拟化实时性提升(一)之hostOS切换为强实时系统

2017年05月08日

背景

三胖同志决心将核弹系统迁移上云
鉴于已经在Linux上搞了这么多年虚拟化,更重要的是Linux是开源的,可以绕过技术封锁壁垒
初步计划是Linux+kvm虚拟化中部署核弹系统
首先,将Linux打造成实时操作系统(RTOS),因为我们不希望伟大领袖按下按钮后,半天没有反应

核心技术点

Linux是弱实时系统,可以通过RT-Preempt补丁使其变为实时系统

抢占

内核中好多地方不可被抢占造成linux系统时延主要原因
比如关键区和锁,比如中断处理,比如显示的关中断(interrupt-disable)

如何正确合理的是的上述内容变成可抢占,是RT-Preempt的核心任务

当然有些地方不可以被抢占,比如进程调度任务,比如写寄存器任务,比如内存页表处理等
任然需要使用spinlock,确保上述任务不会被抢占
如何甄别和替换这些任务,是RT-Preempt工作任务的一个大头,当然也是让人头大的任务

此外,需要重点关注smp,超线程等特性在此patch下的运行情况,可能会释放一系列bug。
(timer deadlocks, lock omissions in ns83820_tx_timeout() and friends, an ACPI-idle scheduling latency bug,
a core networking locking bug, and a number of preempt-off-needed bugs in the block IO statistics code.)

当然,这些手段只是尽可能的减少了时延,并不能保证实时性。

可抢占的关键区

打上patch后spinlock_t 和 rwlock_t的关键区是可以被抢占的了
也就是说,不能寄希望于加上关键区,然后就能确保其中变了在单个cpu上执行了
因为会被抢占,然后漂到其他cpu上执行指令

可抢占的中断处理

打上patch后,几乎所有的中断处理(interrupt handlers)都是在进程上下文(process context)中处理的,进而可以了理解为是可以抢占的

当然,以下中断需要通过指定SA_NODELAY 运行在中断上下文(interrupt context)中:
irq0(时钟中断)
fpu_irq(浮点协调处理中断)
lpptest(interrupt-latency benchmarking)
irq2
其中irq0最常用
中断运行在中断上下文,会严重降低中断系统和进程调度时延
当然,irq0时钟中断对进程调用和其他内核模块有重大影响,是需要运行在中断上下文的

中断禁止的可抢占

中断禁止看起来和抢占有点矛盾
但是通过上文知道中断处理多数运行在进程上下文中
此外SMP系统架构,也为中断禁止情况下的可抢占提供了条件

中断逆转&中断继承

假设低优先级任务A获取到一个资源,比如锁
中优先级的任务B抢占了任务A
高优先级的任务C想获取低优先任务的锁

这导致高优先级的任务被延迟
通过优先级继承可以解决此问题,上述例子中高优先级的任务C把其优先级暂时借给低优先的任务A
一旦低优先级的任务释放锁,则优先级回滚为原先的低优先级

这里重新实现了锁机制rtmutexes,使得加锁后可以被抢占
并且spinlock_t 和 rwlock_t设置的关键区也可以被抢占

RCU

传统的rcu无抢占,需要改造 相关文档参考这里和这里

High resolution timer

hrtimer已经默认打到2.6以后的内核中了,这里不重点关注

验证

patch -p1 <../patch-3.10.105-rt120.patch


make make modules_install make install

参考文献

https://rt.wiki.kernel.org/index.php/Main_Page

https://lwn.net/Articles/656807/