ERLANG OTP源码分析 – supervisor
supervisor实际上是基于gen_server的系统进程,监控子进程的退出状态并设置一定的重启机制。 Read the rest of this entry »
supervisor实际上是基于gen_server的系统进程,监控子进程的退出状态并设置一定的重启机制。 Read the rest of this entry »
gen_fsm和gen_server非常的类似, 在gen进程递归调用loop函数的过程中,除有StateData还额外有一个StateName的atom, 它决定了下次执行的函数. 另外一个不同之处是, gen_server程序是由调用进程向gen进程发送消息, 一种cs模式的调用关系,而gen_fsm程序中这个发送消息的通常都是gen进程本身. Read the rest of this entry »
阅读OTP源码可以帮助你写出更好、更健壮的erlang程序.下面一系列文章就gen_server、gen_fsm、supervisor的源码进行分析, 从erlang级别解释其工作原理, 所有的完整流程图在这里, 第一次写erlang方面博文有错误请帮忙指出. Read the rest of this entry »
在lua里只能为表设置元表,而在c程序里面可以为基本类型进行元表操作,但上篇博文提到了普通类型的很多操作是不会走到元表,下面的例子针对数字类型,添加多种事件,只有部分事件会生效.下面的例子在c代码里对数字类型添加元表对__add,__len都设置事件.
表是如何调度到元表的呢,上篇博文的例子我们看到当键值未能被查找到之后会调用__index事件对应的函数.现在举一个”__add”事件来遍历重要环节的源码.当然从luaV_execute开始.
Read the rest of this entry »
lua metatable(以下简称元表)类似c++的operator overloads,可以对复合结构进行操作,在lua里最常见的就是对表的操作.举例来说,当两个表作加法操作的时候,Lua会检查表的元表中是否有”__add”事件是否对应一个函数(metamethod)。如果存在Lua会调用这个函数来执行一次表的加法操作. Read the rest of this entry »
redis是个内存全集的kv数据库,不存在部分数据在磁盘部分数据在内存里的情况,所以提前预估和节约内存非常重要.本文将以最常用的string和zipmap两类数据结构在jemalloc内存分配器下的内存容量预估和节约内存的方法.
redis终于在2.4版本里引入了除主线程之外的后台线程,这个事情由来已久.早在2010年2月就有人提出aof的缺陷,提及的问题主要有:
1 主线程aof的每次fsync(everysecond模式)在高并发下时常出现100ms的延时,这源于fsync必不可少的磁盘操作,即便已经优化多次请求的离散小io转化成一次大的连续io(sina的同学也反映过这个问题).
2 主线程里backgroundRewriteDoneHandler函数在处理bgrewriteaof后台进程退出的时候存在一个rename new-aof-file old-aof-file,然后再close old-aof-file的操作, close是一个unlink的操作(最后的引用计数), unlink消耗的时间取决于文件的大小,是个容易阻塞的系统调用.
3 当发生bgsave或者bgrewriteaof的时候主线程和子进程同时写入不同的文件,这改变了原有连续写模式,不同写入点造成了磁盘磁头的寻道时间加长(其实一个台物理机多实例也有这个问题, 要避免同一时间点做bgrewriteaof), 这又加长了fsync时间.
经过漫长的设计和交流,antirez终于在2.4版里给出了实现, 这个设计保持了redis原有的keep it simple的风格,实现的特别简单且有效果,实现的主要原理就是把fsync和close操作都移动到background来执行.
2.4版本做了很多功能改进,尤其是aof这块变动较大.增加了自动的bgrewriteaof;开启两个后台线程来避免主线程fsync,rename,close等阻塞操作,另外修复了出现重复命令进入aof文件的bug,下面是基于2.4.1.的源码aof这块的改进分析. Read the rest of this entry »
lxc是一种系统层级的虚拟化方案,利用clone这个系统调用的一些特性,模拟一个虚拟化的场景(独立的网络、文件系统),并利用cgroup进行资源的限制管理。
和常见的xen、kvm不同,它不是一种半虚拟化技术,他仅仅使用了本地cpu,只有一个传统意义上的操作系统。类似的解决方案有Solaris的Zone,在Freebsd的Jail。
网络上关于ubuntu的lxc容器都有些小问题,所以整理一下希望对大家有些帮助,lxc的相关命令就不解释了,比较简单。