随笔分类 - Linux
摘要:我们在阅读C/C++的开源代码时,常常会遇到这样的烦恼。很多开源项目是跨平台的,代码中使用了大量条件编译,充斥着各种#ifdef(#ifudef)等等。这些代码段对于源码阅读者来说,通常是一种干扰(源码阅读者通常是基于某一个固定平台的),这里介绍一种简单的方法,用来移除不必要的代码段。首先下载一个源码处理的小工具:(其他Linux发行版请使用对应的包管理工具)sudo apt-get install unifdef拷贝一份源代码目录,并进入拷贝的目录中:cp src/ src_bak/ -r && cd src_bak/使用unifdef(假定我们要去掉所有基于WINDOWS和
阅读全文
摘要:就在近日,Facebook宣布开源了内部使用的C++底层库,总称folly,包括散列、字符串、向量、内存分配、位处理等,以满足大规模高性能的需求。这里是folly的github地址:https://github.com/facebook/folly在folly项目的Overview.md中,谈到了folly库的初衷:It complements (as opposed to competing against) offerings such as Boost and of coursestd. In fact, we embark on defining our own component o
阅读全文
摘要:对于提供事务支持的数据库,在事务提交时,都要确保事务日志(包含该事务所有的修改操作以及一个提交记录)完全写到硬盘上,才认定事务提交成功并返回给应用层。一个简单的问题:在*nix操作系统上,怎样保证对文件的更新内容成功持久化到硬盘?1. write不够,需要fsync一般情况下,对硬盘(或者其他持久存储设备)文件的write操作,更新的只是内存中的页缓存(page cache),而脏页面不会立即更新到硬盘中,而是由操作系统统一调度,如由专门的flusher内核线程在满足一定条件时(如一定时间间隔、内存中的脏页达到一定比例)内将脏页面同步到硬盘上(放入设备的IO请求队列)。因为write调用不会等
阅读全文
摘要:我认为,想要熟练掌握Linux下的TCP/IP网络编程,至少有三个层面的知识需要熟悉:1. TCP/IP协议(如连接的建立和终止、重传和确认、滑动窗口和拥塞控制等等)2. Socket I/O系统调用(重点如read/write),这是TCP/IP协议在应用层表现出来的行为。3. 编写Performant, Scalable的服务器程序。包括多线程、IO Multiplexing、非阻塞、异步等各种技术。关于TCP/IP协议,建议参考Richard Stevens的《TCP/IP Illustrated,vol1》(TCP/IP详解卷1)。关于第二层面,依然建议RichardStevens的《
阅读全文
摘要:实现一个开源KV数据库的想法来源于对目前项目中所使用的K-V数据库使用情况的不满意。先介绍一下我们的目前项目,作为本文的背景:较为底层的分布式运行平台,使用C/C++实现的Actor模型(异步消息传递系统)数据schema简单灵活,使用key-value能够很好表示。数据库有大量的读写请求,有事务需求,数据丢失容忍度很低。当前,从众多的KV和NOSQL存储产品中,我们使用了Berkeley DB作为底层的存储引擎。为什么选择BDB呢?1.与传统的RDBMS相比,简单K-V存储的Berkeley DB(再加入“嵌入式”直接库链接的特性)有着优越的性能,容易满足我们大量读写(尤其是大量写)的需求。
阅读全文
摘要:1.false sharing原因:CPU loads memory into cache by "line"Linux下获取cache line :cat /proc/cpuinfo | grep cache_alignmentor cat /sys/devices/system/cpu/cpuN/cache/indexN/coherency_line_size 以及其他详尽的cpu cache信息Maybe : get cacheline programatically ( via C language )Multi-cpu contention algorithm &
阅读全文