Linux tracing系统中有3层:front-end, tracing-framework(本文叫tracer)和event-source; 本文聚焦于ftrace,它属于tracer,类似的还有perf, eBPF等。
Linux Tracepoint
Linux tracing中有3层:front-end, tracer(即tracing framework)和event-source. Tracepoint属于event-source,是一种kernel static tracing事件源。本文介绍tracepoint的实现以及使用方式,特别是如何被ftrace使用。
NAND SSD TRIM and GC
SSD 的写入性能并非一成不变。一块全新的 SSD 顺序写入可以跑到 3 GB/s,但当盘接近写满时,性能可能骤降至几百 MB/s 甚至更低,延迟也会出现剧烈抖动。这一切的根源在于 NAND 闪存的物理特性,以及 SSD 内部的垃圾回收(Garbage Collection, GC) 机制。而 TRIM(又称 Discard / Deallocate)正是操作系统与 SSD 之间沟通”哪些数据不再需要”的关键桥梁。
本文将从 NAND 闪存的物理结构出发,逐步深入到 GC 机制、TRIM 命令的工作原理,以及在不同存储栈中的工程实践。
Spanner TrueTime 与并发控制
Google Spanner 基于 TrueTime 的并发控制机制支持跨多个 Paxos group 的事务。它使用两阶段提交协议(2PC: 2 Phase Commit)在 group 间分发。本文是一个简化版本,事务只涉及一个 Paxos group,因此也无需两阶段提交协议,旨在搞清楚 TrueTime 机制。
Basic Paxos
详细梳理Basic Paxos算法,试图找出从Paxos到Raft的演进过程。
LevelDB的Version和VersionSet
Version代表LevelDB数据库的一个固化状态;VersionEdit代表对Version的修改或编辑操作;VersionSet维护一系列Version。
LevelDB的table结构
LevelDB中Table是一个比较复杂的结构。Block负责有序kv-pair的存储、查询及迭代;Table利用Block构造上一层的结构,包含Data Block, Index Block, Filter Block等,并管理这些Block之间的关系。本篇记录这些琐碎细节。
Backtracking算法
总结Backtracking算法。
Linux Preemption模式
Linux中用户态程序总是preemptible的,内核使用clock tick中断用户态程序切换到别的线程,不用等待用户态程序主动放弃CPU。但在Kernel Preemption被引入之前,一个线程进入内核态,不放弃CPU也不返回用户态就能一直占用CPU。直到linux 2.6才引入Kernel Preemption。本文的主要目的是介绍Linux的三种Kernel Preemption模式。但介绍Voluntary Preemption的时候,也需要把might_sleep搞清楚。
Linux file read
本文基于linux kernel 3.19.8版本梳理一下读文件的过程,从vfs开始,到发送请求给block层结束。