XiaoLong's Blog

tcmalloc相关FAQ(基于gperftools-2.1)

在tcmalloc原理剖析中介绍了tcmalloc整体结构,下面就一些常见的疑问进行分析。 问题一:PageHeap内存归还给操作系统的时机 PageHeap负责向操作系统申请及归还内存,对应的函数为PageHeap::ReleaseAtLeastNPages(num_pages), 调用该函数归还内存时以round-robin的方式每次从不同的span list中 取出一个span,并将...

tcmalloc原理剖析(基于gperftools-2.1)

本文偏重于剖析tcmalloc的整体结构(基于gperftools-2.1),为了不过于繁琐,不过多涉及内部实现细节。 介绍 tcmalloc是google开发的一个专门为高并发场景优化的内存分配器,全称为”thread cache malloc”。按照官网的介绍,tcmalloc相比于glibc2.3的malloc(底层实现为ptmalloc2)主要有以下优点: 快速:一台2.8G...

并发编程基础--Cache Coherency、Memory Fence等

本文主要总结并发编程中涉及到CPU和内存相关的基础知识,包括Amdahl‘s raw、Cache coherency、Memory fence、false-sharing等。 Amdahl‘s raw(阿姆达尔法则) Amdahl定律的公式为: S = 1 / ( 1 - p + p / n) 其中: n:处理器的个数 p:程序可并行执行的比率 S:工作加速比,定义为由一个...

修身杂摘

“自古圣贤一条心”,期望能够通过中西方圣贤(或者说开悟的人)的指引,找到一条提升自己的路。这些圣贤包括但不限于孔子、孟子、王阳明、六祖慧能、埃克哈特托利、葛吉夫等。 1.子曰:巧言令色鲜矣仁(来自论语) “巧言令色”指的是溜须拍马以悦人,非我心之真情善意,在孔子看来,这种人很少是有仁心。 第一次看到这句话,以为孔夫子是要告诉我们远离“巧言令色”之人,但是仔细看这句话的前后文,前文讲的...

反向代理服务如何做好过载保护

如下图所示,假设有一个反向代理服务(proxy), 负责将上游请求按照一定规则转发给下游,并将下游返回结果再返回给上游,如何才能使proxy更好的自我保护及保护后端服务,防止出现过载,甚至出现雪崩呢? 过载介绍 什么是过载: 在服务器开发中,过载指的是外部请求量已经超过了系统的最大处理能力。比如,假设某系统每秒最多处理100条请求,但是它每秒收到的请求有200条,这时,我们就说系统已经过...

怎样吃掉一头大象--以终为始

我们经理说过一句话:“以终为始,是复杂项目的管理利器”。联想到负责的RGC国际化项目, 深有同感。以终为始,根据目标选择路径,明确目标后再做计划,会事半功倍。当项目中遇到问题,比如,团队成员对到底要不要实现某个功能有分歧时,,也可以根据”以终为始”的原则,回到项目最初目标上,如果功能对实现目标很有意义,就做,如果仅仅是锦上添花,那就暂时放弃。 即从目标入手将任务层层分解,直到不能继续细分或者...

mmap文件映射方式导致系统平响异常情况分析

内部某检索系统使用了mmap文件映射的方式加载正排索引及倒排索引。部署方式为物理机独立部署,线上运行了很长时间都很稳定,偶尔也有波动。最近将其迁移到公司内虚拟化平台时(类似Docker)却发现性能频繁波动,经常出现平响飙升的情况。对服务SLA有很大影响。经过排查发现平响飙升的原因是由于系统mmap内存映的内存空间被回收(page reclaim)到磁盘导致。排查期间对内核页面回收机制有了更进...

Linux下多线程服务器Reactor模式总结

本文主要的目的是总结Linux下多线程服务器常用Reactor模式。PS:述而不作,里面很大部分知识都是总结的陈硕 (muduo网络库作者,《Linux多线程服务端编程》作者)论述,感谢陈硕前辈。 Reactor模式介绍 Linux环境下高性能网络程序中,大都使用Reactor模式,比如libevent、libev、ACE,POE(Perl)、Twisted(Python)等。那什么是Re...

leveldb系列总结

从第一篇分析LevelDB的文章到现在,差不多一年的时间了,期间共写了10篇有关LevelDB的博客。产出很少(工作、带娃,只能抽早晨早起或者周末的时间),并且现在看以前写的文章,总会觉得不够好。这也是以往对LevelDB理解还太浅薄的原因吧。 不管怎样,以前写的文章也不会大改了,一来是因为写LevelDB的博客主要是为了学习先进的设计思路及coding艺术,二来文章的受众也很少,博客也很少...

段错误调试几个tips

本文讨论在x86_64下段错误调试的几个tips。 基础知识 栈是一个动态内存区域,程序可以将数据压入栈中(入栈,push),也可以将已经压入栈中的数据弹出(出栈,pop)。它遵循FIFO规则(First In Last Out),即先入栈的数据后出栈。Linux操作系统中,栈是向下增长的,栈顶由称为rsp的寄存器进行定位(i386下寄存器名称为esp)。栈保存了一个函数调用所需要维护的信...

Custom Theme JavaScript