想要快速了解memcached内部原理么?那么赶紧离开本页,这会耽误您的时间。

不知时隔多少时间,今天受了些刺激,在码农路上开始犹豫起来,但是想想自己也没其他本身,就只好放下王者荣耀,重新看看技术内容了。自己看东西比较功利,但总是一开始比较功利,突然被中间说明地方吸引了,就会一层一层的跟下去,这也是有超链接的好处。就先看memcached吧,虽然说起来这东西都十多年了,是个人都能叫出名字,但是用归用,具体的实现公众号之类的也是瞄见无数次,总是浅尝辄止,不能不说工作后是越来越浮躁了。

好了开始阅读代码了,打开Github第一个看到的是timedrun.c,很显然这个和定时相关,这个文件内有个main,程序启动后会fork进程

父进程:捕获子进程事件,并在超过一定时间后向子进程发送term信号,这个时间有程序的argv[1]决定

子进程:execvp一个程序,程序名就是原始启动程序argv[2]中指定的名称(虽然源码中execvp的参数是argv[0],但这时的argv已经在传入时+2了)

当然这个是一个比较简陋的实现,也只是用在测试中。和memcached的主要功用也没什么大的联系,但是怎么说我是重温了一番学习源码的感觉。

接下有个奇怪的文件叫做memcached_dtrace.d,里面是一些probe打头的定义,文件注释中也说了这是和DTrace相关的,这个东西好像是以前翻过一些资料的在《性能之巅》里也提到过,但是当时就是感觉重新学一套脚本语言分支叉开来太多了,只是草草看了一下。好在DTrace在mac也是默认提供的,这就方便太多了。找到一些好的dtrace资源

  1. http://dtrace.org/blogs/brendan/2011/02/09/dtrace-pid-provider/
  2. https://www.ibm.com/developerworks/cn/aix/library/au-dtraceprobes.html
  3. http://dtrace.org/guide/chp-intro.html

前面两个是比较基础的引入例子,后面就是手册了。其实找的个新的感兴趣的东西,最想的就是马上能试着用一下或者跑个结果出来,这个就和某时想干一发一样,如果此时得不到满足,很可能后面就会没兴致或者干脆记不起有这么回事了。当然如果是特别感兴趣的则是愈发得念念不忘的。想起从前各种装系统,最后想搞个黑苹果总是不能成功还试了好几次。废话说完,dtrace是可以直接跟踪程序的,strace只是跟踪程序的系统调用,但是dtrace可以跟踪程序的普通函数调用,而且不用做任何修改。比如一个程序

#include <stdio.h>
#include <unistd.h>
int freq_count() {
sleep(1);
return 0;
} int main() {
printf("proc start pid:%d\n", getpid());
for (;;) {
freq_count();
}
}

gcc 直接编译后使用如下命令就可以对freq_count这个函数调用进行跟踪

sudo dtrace -n 'pid$target::freq_count:entry { printf("%Y", walltimestamp) }' -p 4423

后面的数字就是程序输出的进程ID,dtrace命令似乎都要sudo才能正常执行否则会有各种权限错误。得到的输出如下:

dtrace: description 'pid$target::freq_count:entry ' matched 1 probe
CPU ID FUNCTION:NAME
0 182084 freq_count:entry 2017 May 27 01:53:33
0 182084 freq_count:entry 2017 May 27 01:53:34
......

这种模式称为“Function Boundary Tracing (FBT)”就是在函数的出入口进行跟踪,如果要在非函数出入口的一些区段做跟踪可以用“User Statically Defined Tracing (USDT).”。FBT不用修改原有程序就可以进行跟踪,而USDT需要用户把探测点放到自己的程序内部。

很多时候我觉得知道的越多感觉就越好,然而后来发觉也从别人口中得知知识和思考、能力并不是一回事。但是我还是享受这种了解新知的快感,虽然相比于思考的快感是档次低了点,但是我享受。上一年我在手写类似nginx的网络代理,发现内存和耗时上和nginx还是有50%的差距,就是各种猜,用了一些prof工具说是一些函数执行时间太短不会记录和统计,这个相当无语啊。本来一次网络请求就没多少cpu时间,都不统计的话就没办法了。用dtrace,这回我得看看到底是哪里出翔了。

memcached 源码阅览 一的更多相关文章

  1. Memcached源码分析之请求处理(状态机)

    作者:Calix 一)上文 在上一篇线程模型的分析中,我们知道,worker线程和主线程都调用了同一个函数,conn_new进行事件监听,并返回conn结构体对象.最终有事件到达时,调用同一个函数ev ...

  2. Memcached源码分析之线程模型

    作者:Calix 一)模型分析 memcached到底是如何处理我们的网络连接的? memcached通过epoll(使用libevent,下面具体再讲)实现异步的服务器,但仍然使用多线程,主要有两种 ...

  3. Memcached源码分析之从SET命令开始说起

    作者:Calix 如果直接把memcached的源码从main函数开始说,恐怕会有点头大,所以这里以一句经典的“SET”命令简单地开个头,算是回忆一下memcached的作用,后面的结构篇中关于命令解 ...

  4. Memcached源码分析

    作者:Calix,转载请注明出处:http://calixwu.com 最近研究了一下memcached的源码,在这里系统总结了一下笔记和理解,写了几 篇源码分析和大家分享,整个系列分为“结构篇”和“ ...

  5. Memcached源码分析之内存管理

    先再说明一下,我本次分析的memcached版本是1.4.20,有些旧的版本关于内存管理的机制和数据结构与1.4.20有一定的差异(本文中会提到). 一)模型分析在开始解剖memcached关于内存管 ...

  6. memcached源码分析-----item过期失效处理以及LRU爬虫

    memcached源码分析-----item过期失效处理以及LRU爬虫,memcached-----item 转载请注明出处:http://blog.csdn.net/luotuo44/article ...

  7. memcached源码安装(linux和windows)

    如果是在windows环境下编译安装,我这边是基于cygwin或msys2方式 安装cygwin环境,http://www.cnblogs.com/skey_chen/p/5765179.html 安 ...

  8. memcached 源码阅读笔记

    阅读 memcached 最好有 libevent 基础, memcached 是基于 libevent 构建起来的. 通由 libevent 提供的事件驱动机制触发 memcached 中的 IO ...

  9. Memcached源码分析——process_command函数解析

    以下为个人笔记 /** * process_command 在memcached中是用来处理用户发送的命令的, * 包括get set,add,delete,replace,stats,flush_a ...

随机推荐

  1. 控制页面打印的2种方法(css3的media媒体查询和window.print())

    在实际开发中,有时可能会有打印的需求.下面我总结了2种打印的方法,希望对各位小伙伴有所帮助. ①:直接用window.print()方法就可以打印整个页面,下面是一个小demo <!DOCTYP ...

  2. 空手套白狼,硬阅java字节码class文件

    如下,是一些java字节码也就是原始的class文件,当应用部署到线上之后,我们能够看到的也就是这样的字样了.那么怎样解呢?就让我们一起,来解读解读字节码吧! Offset A B C D E F C ...

  3. 使用HttpClient发送Get/Post请求 你get了吗?

    HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议 ...

  4. linux下 几个常用makefile模板,亲测可用

    一 生成动态链接库的模板: ####################### # Makefile ####################### # compile and lib parameter ...

  5. Docker - 参考信息

    初见 从 0 开始了解 Docker 可能是把Docker的概念讲的最清楚的一篇文章 Docker新手指南 8 个基本的 Docker 容器管理命令 Docker 核心技术与实现原理 在线教程 Doc ...

  6. Tools - 速查表与备忘单(Cheat Sheet)

    Cheat Sheets Rico's cheatsheets Cheat-Sheets.org Python Python Cheat sheet Python Programming Cheat ...

  7. 屌炸天,Oracle 发布了一个全栈虚拟机 GraalVM,支持 Python!

    前阵子,Oracle 发布了一个黑科技 "GraalVM",号称是一个全新的通用全栈虚拟机,并具有高性能.跨语言交互等逆天特性,真有这么神奇? GraalVM 简介 GraalVM ...

  8. Swift中的元组tuple的用法

    用途 tuple用于传递复合类型的数据,介于基础类型和类之间,复杂的数据通过类(或结构)存储,稍简单的通过元组. 元组是使用非常便利的利器,有必要整理一篇博文. 定义 使用括号(), 括号内以逗号分割 ...

  9. Vue 加载外部js文件

    Vue.js  加载外部js文件 在项目内新建一个config.js //变量的定义 export var config = { baseurl:'http://172.16.114.5:8088/M ...

  10. 【emotion】目标初定

    现在的我漂浮不定,我的心是凌乱的,虽然在我面前的路有无数条,但是我却不知道哪一条路是属于我的.对于java,我掌握的东西可能并不是系统的,想想也知道,自学一年,能形成什么样子的体系呢?然而在日常的工作 ...