月度归档:2016年03月

log日志文件-leveldb源码剖析(4)

往leveldb写一个KV对时先写log,再写MemTable,这样完成一次写入,写log是追加顺序写文件,写MemTable是跳表插入写内存,随机写转化成顺序写,只涉及一次磁盘IO及一次内存写,因此leveldb写入速度非常快。先写log也是为防止发生如进程挂掉时,MemTable的数据仍然可以从log进行重建恢复,不会造成数据丢失。
阅读全文

Arena内存管理-leveldb源码剖析(1)

leveldb实现了定制的Arena内存分配器,并没有直接使用glibc的malloc或者c++标准库的new,Arena主要与MemTable关联使用,实际主要用于SkipList中的Node内存分配,统一MemTable的内存分配需求,减少内存分配的实际系统调用次数(尤其针对小块内存),减少内存分配中的空洞(碎片),但也会造成一定的内存浪费;统一内存释放,不必频繁new/delete;鉴于Arena在leveldb中的使用场景不需考虑线程安全。Arena的实现简单轻量,代码总计百余行,服务于leveldb的定制需求,提高应用性能,并且提供了内存对齐的版本。
阅读全文