推荐序一推荐序二译者序序言一序言二前言致谢作者简介第1章 进入混沌工程的世界 11.1 什么是混沌工程 21.2 混沌工程的动机 31.2.1 评估风险和成本,并设定SLI、SLO和SLA 31.2.2 在整体上测试系统 41.2.3 找到“涌现性”特性 51.3 混沌工程的四个步骤 51.3.1 确保可观测性 71.3.2 定义稳态 81.3.3 形成假设 91.3.4 运行实验并证明(或反驳)你的假设 91.4 什么不是混沌工程 101.5 初识混沌工程 111.5.1 FizzBuzz即服务 111.5.2 漫漫长夜 111.5.3 后续 121.5.4 混沌工程简述 13总结 13第一部分 混沌工程基础第2章 来碗混沌与爆炸半径 172.1 设置使用本书中的代码 172.2 场景 182.3 Linux取证101 202.3.1 退出码 202.3.2 终止进程 212.3.3 内存溢出杀手 232.4 第一个混沌实验 252.4.1 确保可观测性 292.4.2 定义稳态 292.4.3 形成假设 302.4.4 运行实验 302.5 爆炸半径 312.6 深入挖掘 332.6.1 拯救世界 35总结 36第3章 可观测性 383.1 应用程序运行缓慢 393.2 USE方法 393.3 资源 413.3.1 系统概述 433.3.2 block I/O 443.3.3 网络 483.3.4 RAM 523.3.5 CPU 593.3.6 操作系统 653.4 应用程序 673.4.1 cProfile 683.4.2 BCC和Python 693.5 自动化:使用时序数据库 713.5.1 Prometheus和Grafana 713.6 延伸阅读 74总结 75第4章 数据库故障和生产环境中的测试 764.1 我们在做WordPress 764.2 弱点 784.2.1 实验1:磁盘慢了 794.2.2 实验2:网络慢了 834.3 在生产环境中测试 88总结 90第二部分 混沌工程实战第5章 剖析Docker 935.1 我的(Docker化的)应用程序运行缓慢 945.1.1 架构 945.2 Docker简史 955.2.1 仿真、模拟和虚拟化 955.2.2 VM和容器 975.3 Linux容器和Docker 995.4 Docker原理 1025.4.1 使用chroot变更进程的路径
1025.4.2 实现一个简单的容器(-ish)第1部分:使用chroot 1055.4.3 实验 1:一个容器可以阻止另一个容器写磁盘吗 1075.4.4 使用Linux命名空间隔离进程 1115.4.5 Docker和命名空间 1145.5 实验2:终止其他PID命名空间中的进程 1165.5.1 实现一个简单的容器(-ish)第2部分:命名空间 1185.5.2 使用cgroups限制进程的资源使用 1205.6 实验3:使用你能找到的所有CPU 1265.7 实验4:使用过多内存 1285.7.1 实现一个简单的容器(-ish)第 3 部分:cgroups 1305.8 Docker和网络 1335.8.1 capabilities和seccomp 1375.9 Docker揭秘 1405.10 修复我的(Docker化的)应用程序运行缓慢的问题 1415.10.1 启动Meower 1415.10.2 为什么应用程序运行缓慢 1435.11 实验5:使用Pumba让容器的网络变慢 1435.11.1 Pumba:Docker混沌工程工具 1435.11.2 运行混沌实验 1445.12 其他主题 1475.12.1 Docker daemon重启 1485.12.2 镜像layer的存储 1485.12.3 高级网络 1485.12.4 安全 149总结 149第6章 你要调用谁?系统调用破坏者 1506.1 场景:恭喜你升职了 1506.1.1 System X:如果大家都在用,但没人维护,是不是废弃软件 1516.2 简单回顾系统调用 1536.2.1 了解系统调用 1546.2.2 使用标准C库和glibc 1566.3 如何观测进程的系统调用 1586.3.1 strace和sleep 1586.3.2 strace和System X 1616.3.3 strace的问题:开销 1626.3.4 BPF 1636.3.5 其他选择 1666.4 为乐趣和收益阻塞系统调用第1部分:strace 1676.4.1 实验1:破坏close系统调用 1676.4.2 实验2:破坏write系统调用 1716.5 为乐趣和收益阻塞系统调用第2部分:seccomp 1736.5.1 seccomp 的简单方法:使用Docker 1736.5.2 seccomp 的困难方法:使用libseccomp 175总
结 177第7章 JVM故障注入 1787.1 场景 1787.1.1 FizzBuzzEnterpriseEdition 介绍 1797.1.2 环顾FizzBuzzEnterprise-Edition 1797.2 混沌工程和Java 1807.2.1 实验的思路 1817.2.2 实验的计划 1827.2.3 JVM字节码简介 1837.2.4 实验的实现 1907.3 已有的工具 1967.3.1 Byteman 1967.3.2 Byte-Monkey 1987.3.3 Spring Boot的Chaos Monkey 2007.4 延伸阅读 200总结 201第8章 应用级故障注入 2028.1 场景 2028.1.1 实现细节:混沌之前 2048.2 实验1:Redis延迟 2088.2.1 实验1的计划 2098.2.2 实验1的稳态 2098.2.3 实验1的实现 2108.2.4 实验1的执行 2128.2.5 实验1的讨论 2138.3 实验2:失败的请求 2138.3.1 实验2的计划 2148.3.2 实验2的实现 2148.3.3 实验2的执行 2158.4 应用程序与基础设施 216总结 217第9章 我的浏览器中有一只“猴子” 2189.1 场景 2189.1.1 Pgweb 2199.1.2 Pgweb实现细节 2209.2 实验1:增加延迟 2229.2.1 实验1的计划 2239.2.2 实验1的稳态 2239.2.3 实验1的实现 2249.2.4 实验1的执行 2269.3 实验2:添加故障 2279.3.1 实验2的实
展开