背景
三胖同志决心将核弹系统迁移上云
鉴于已经在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
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/