thrift nonblocking server 实现源码剖析

现有网上资料对于thrift生产环境下使用绝大多数为Java应用(protobuf仅提供序列化且很长时间没开放RPC框架,主体语言确定为C/C++时RPC选型thrift个人觉得是被动选择,当然grpc则是后话,生产环境下性能比较暂未看到相关分析),C++的相关资料极其缺乏,对于网络服务相关开发,nonblock io multiplexing+线程池对于单机应用来说更为常见,所以关于thrift系列开篇以TNonblockingServer模型的实现为例进行分析,其他模型及模块稍后会奉上。
阅读全文

Linux 进程栈与线程栈大小

前段时间和同事一块追一个多线程下栈溢出的bug,究其原因是引用的外部静态库中某个局部的字符串buffer太大导致(1MB),而程序中反复review并没有申请太大的栈空间,当时有怀疑栈空间本身太小,最后通过修改静态库的该buffer大小定义解决,问题看似解决,实则反应对进程和线程的理解不扎实,代码中潜在的问题并没有彻底消除(后来在分析thrift nonblockserver源码时发现是因为默认调用创建IO线程栈指定了大小为1MB),由此本文讨论Linux 下fork或exec调用创建的进程对应栈以及clone调用创建的线程栈。
阅读全文

排序在Hadoop MapReduce中的应用

对于大多在应用层面写MapReduce job的童鞋,不论写streaming/pipes,还是java,通常认为hadoop MR计算框架对数据排序发生在reduce阶段,这也是应用层面最直观易见的,实际在map阶段也有排序操作,笔者以此文分别分析map和reduce两个阶段的排序,处理大数据时所采用的排序算法,以及排序所起到的作用。
阅读全文