想要快速了解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. 使用Java类加载SpringBoot、SpringCloud配置文件

    我们都知道平常在使用SpringBoot和SpringCloud的时候,如果需要加载一两个配置文件的话我们通常使用@Value("${属性名称}")注解去加载.但是如果配置文件属性 ...

  2. JavaScript中的日期时间函数

    1.Date对象具有多种构造函数,下面简单列举如下 new Date() new Date(milliseconds) new Date(datestring) new Date(year, mont ...

  3. PHP全栈学习笔记18

    php基础知识,JavaScript,jQuery,ajax基础知识 linux基础知识,mysql数据库的基础与优化 程序设计,PHP框架基础知识,算法,逻辑思维,高并发 PHP基础知识 引用变量, ...

  4. Kali学习笔记32:Maltego、Exiftool

    有段时间没学Kali里面的工具了 以前做信息收集的时候呢,忘记了两个很强大的工具:Maltego.Exiftool 先来看看Maltego: 这个工具不仅可以方便地收集DNS信息等等,强大地地方还在于 ...

  5. 简单读!Mybatis源码(一)一条select的一生

    工具除了会用,还应该多做点.我觉得使用一个软件工具(开源类),一般会经历几个步骤: 1. 通过wiki了解大致作用,然后开始码代码: 2. 系统性地学习其特性,找出可能需要的点,用上去: 3. 通过阅 ...

  6. SpringCache实战遇坑

    1. SpringCache实战遇坑 1.1. pom 主要是以下两个 <dependency> <groupId>org.springframework.boot</g ...

  7. dubbo实用知识点总结(一)

    1. dubbo基础架构 架构 特性 服务提供者 服务消费者 配置可以用dubbo.properties来替换 2. 注解配置 提供方(注意:serivce注解是dubbo的service) 消费者 ...

  8. 长沙IT二十年

    长沙IT二十年 古语有云“近代中国,湖南独撑半边天”,近代中国以来,多少仁人志士从湖湘这片热土出发,在中华大地上,挥毫泼墨,为中华民族的繁荣昌盛做出了不可磨灭的贡献.而今天,随着互联网时代的到来,长沙 ...

  9. 什么 是JavaScript中的字符串类型之间的转换问题详解? 部分4

    字符串类型 单双引号都可以!建议使用单引号!(本人建议:个人觉得单个字符串更利于网页优化@特别地方特别处理!); 判断字符串的长度获取方式:变量名.length html中转义符: < < ...

  10. Elastic Search 上市了,市值翻倍,这群人财务自由了!

    国庆长假,大部分人还深浸在风花雪月之中,而就在昨天(美国时间10月5号),我们 Java 程序员所熟知的大名鼎鼎的 Elastic Search 居然在美国纽约证券交易所上市了! 当说到搜索时,大部分 ...