0%

Linux tracing系统中有3层:front-end, tracing-framework(本文叫tracer)和event-source; 本文聚焦于ftrace,它属于tracer,类似的还有perf, eBPF等。

阅读全文 »

Linux tracing中有3层:front-end, tracer(即tracing framework)和event-source. Tracepoint属于event-source,是一种kernel static tracing事件源。本文介绍tracepoint的实现以及使用方式,特别是如何被ftrace使用。

阅读全文 »

SSD 的写入性能并非一成不变。一块全新的 SSD 顺序写入可以跑到 3 GB/s,但当盘接近写满时,性能可能骤降至几百 MB/s 甚至更低,延迟也会出现剧烈抖动。这一切的根源在于 NAND 闪存的物理特性,以及 SSD 内部的垃圾回收(Garbage Collection, GC) 机制。而 TRIM(又称 Discard / Deallocate)正是操作系统与 SSD 之间沟通”哪些数据不再需要”的关键桥梁。

本文将从 NAND 闪存的物理结构出发,逐步深入到 GC 机制、TRIM 命令的工作原理,以及在不同存储栈中的工程实践。

阅读全文 »

Google Spanner 基于 TrueTime 的并发控制机制支持跨多个 Paxos group 的事务。它使用两阶段提交协议(2PC: 2 Phase Commit)在 group 间分发。本文是一个简化版本,事务只涉及一个 Paxos group,因此也无需两阶段提交协议,旨在搞清楚 TrueTime 机制。

阅读全文 »

详细梳理Basic Paxos算法,试图找出从Paxos到Raft的演进过程。

阅读全文 »

Version代表LevelDB数据库的一个固化状态;VersionEdit代表对Version的修改或编辑操作;VersionSet维护一系列Version。

阅读全文 »

LevelDB中Table是一个比较复杂的结构。Block负责有序kv-pair的存储、查询及迭代;Table利用Block构造上一层的结构,包含Data Block, Index Block, Filter Block等,并管理这些Block之间的关系。本篇记录这些琐碎细节。

阅读全文 »

Linux中用户态程序总是preemptible的,内核使用clock tick中断用户态程序切换到别的线程,不用等待用户态程序主动放弃CPU。但在Kernel Preemption被引入之前,一个线程进入内核态,不放弃CPU也不返回用户态就能一直占用CPU。直到linux 2.6才引入Kernel Preemption。本文的主要目的是介绍Linux的三种Kernel Preemption模式。但介绍Voluntary Preemption的时候,也需要把might_sleep搞清楚。

阅读全文 »

本文基于linux kernel 3.19.8版本梳理一下读文件的过程,从vfs开始,到发送请求给block层结束。

阅读全文 »