本系列文章的目标,是将混沌工程作为一个入口,窥探整个分布式系统。
混沌工程之ChaosBlade(一):建立混沌工程思想
混沌工程之ChaosBlade(二):原理深度剖析
一、项目剖析
1.场景调用
chaosblade-exec-os作为基础执行场景被各模块调用,而chaosblade-spec-go中包含yaml文件,用于场景匹配。chaosblade-exec-docker基于chaosblade-exec-os实现,chaosblade-operator又依赖chaosblade-exec-docker实现。
jvm场景与cpp场景则属于单独构造的场景,其中jvm场景使用Java字节码增强技术实现。
(注:该图片源于《chaosblade项目介绍-穹谷.ppt》)
2.chaosblade-sepc-go
按实验模型定义了实验场景类型,也包含通用的工具类和本地命令调用通道。
(注:该图片源于《chaosblade项目介绍-穹谷.ppt》)
3.chaosblade-exec-os
由下图可见,chaosblade-exec-os文件夹的代码目录,每个文件中的go文件定义了实验场景的执行实现。这些文件是基础资源场景的故障注入实现,高级场景会调用这些实现。
4.chaosblade-exec-docker
其中executor_execin.go是将chaosblade整个文件拷入容器中执行相关命令,exector_sidecar.go则是以sidecar模式执行。
(注:该图片源于《chaosblade项目介绍-穹谷.ppt》)
5.chaosblade-exec-operator
(注:该图片源于《chaosblade项目介绍-穹谷.ppt》)
6.chaosblade-jvm
基于java字节码增强技术。
(注:该图片源于《chaosblade项目介绍-穹谷.ppt》)
二、原理剖析
- CPU Load
在执行CPU负载命令时,实际调用了/bin/burn_cpu,blade可执行文件调用了Cobra接口注入了故障。
Cobra 是一个 Golang 包,它提供了简单的接口来创建命令行程序。同时,Cobra 也是一个应用程序,用来生成应用框架,从而开发以 Cobra 为基础的应用.
要分析注入原理,需引入一个概念:时间片(timeslice)。
根据Wikipedia上的解释,CPU Time分为:
- User Time:在用户空间中执行代码的总时间;
- System Time:在内核空间(kernel space)中执行代码的总时间;
- Idle Time:指所有空间中CPU处于空闲状态的总时间;
- Steal Time:在虚拟硬件中,操作系统要执行但系统管理程序不允许的时间;
Chaosblade中,将CPU分为了busy和idle状态,根据代码,它使用runtime.Gosched()让出CPU时间片后,让CPU一直处于繁忙状态。这就像跑接力赛,A跑了一会碰到代码runtime.Gosched()就把接力棒交给B了,A歇着了,B继续跑。
func burnCpu() {
runtime.GOMAXPROCS(cpuCount)
for i := 0; i < cpuCount; i++ {
go func() {
for {
for i := 0; i < 2147483647; i++ {
}
runtime.Gosched()
}
}()
}
select {
} /