摘要:
(此PPT源于我在公司内所做的一次技术分享,在此公开,希望各位看官能有所收获) 并发编程实践与思考 from promise6522 阅读全文
摘要:
我们在阅读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 阅读全文
摘要:
本文仅仅从应用的角度来谈一谈Berkeley DB中锁相关的理论与实践经验,接下来还会有一篇博客来介绍BDB锁的内部实现。锁粒度除了Queue Access Method,其他所有的Access Pattern都是页级锁(page-level locking),而Page大小默认为操作系统filesystem的block size(Linux下默认为4K)。(可以通过减少Page大小,使一个Page上容纳更少的记录来减少页级锁粒度,但是减小Page会影响数据库的IO效率,在缺乏足够性能数据支撑的情况下,很少会这样做。) BDB的页级别的锁粒度一向是比较恼人的问题,由于Queue并不常用(ke. 阅读全文
摘要:
对于提供事务支持的数据库,在事务提交时,都要确保事务日志(包含该事务所有的修改操作以及一个提交记录)完全写到硬盘上,才认定事务提交成功并返回给应用层。一个简单的问题:在*nix操作系统上,怎样保证对文件的更新内容成功持久化到硬盘?1. write不够,需要fsync一般情况下,对硬盘(或者其他持久存储设备)文件的write操作,更新的只是内存中的页缓存(page cache),而脏页面不会立即更新到硬盘中,而是由操作系统统一调度,如由专门的flusher内核线程在满足一定条件时(如一定时间间隔、内存中的脏页达到一定比例)内将脏页面同步到硬盘上(放入设备的IO请求队列)。因为write调用不会等 阅读全文
摘要:
本文简单地介绍了Berkeley DB在多进程环境下的环境恢复机制。 阅读全文
摘要:
Copy-on-write(以下简称COW)是一种很重要的优化手段。它的核心思想是懒惰处理多个实体的资源请求,在多个实体之间共享某些资源,直到有实体需要对资源进行修改时,才真正为该实体分配私有的资源。COW技术的一个经典应用在于Linux内核在进程fork时对进程地址空间的处理。由于fork产生的子进程需要一份和父进程内容相同但完全独立的地址空间,一种做法是将父进程的地址空间完全复制一份,另一种做法是将父进程地址空间中的页面标记为”共享的“(引用计数+1),使子进程与父进程共享地址空间,但当有一方需要对内存中某个页面进行修改时,重新分配一个新的页面(拷贝原内容),并使修改进程的虚拟地址重定向到 阅读全文
摘要:
我认为,想要熟练掌握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 & 阅读全文