想要快速了解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. Eclipse常用20个快捷键

    Eclipse常用20个快捷键 1. Ctrl+F : 本文查找Find与替换Replace 2. Ctrl+H : 全局搜索,可按照文件类型搜索 3. Ctrl+1 : 快速修复,能快速的显示光标所 ...

  2. 《机器学习实战(基于scikit-learn和TensorFlow)》第六章内容学习心得

    本章讲决策树 决策树,一种多功能且强大的机器学习算法.它实现了分类和回归任务,甚至多输出任务. 决策树的组合就是随机森林. 本章的代码部分不做说明,具体请到我的GitHub上自行获取. 决策树的每个节 ...

  3. redux源码学习笔记 - createStore

    本篇是学习redux源码的一些记录,学习的redux版本是^4.0.1. 在页面开发时,需要管理很多状态(state),比如服务器响应,缓存数据,UI状态等等···当页面的庞大时,状态就会变的混乱.r ...

  4. MySQL(3)---MySQL优化

    MySQL优化 一.单表.双表.三表优化 1.单表    首先结论就是,range类型查询字段后面的索引全都无效 (1)建表 create table if not exists article( i ...

  5. 【云服务器部署】---Linux下安装MySQL

    [云服务器部署]---Linux下安装MySQL 有关如何阿里云ECS建网站,推荐一片文章,我是是通过这篇文章安装tomcat和jdk的 网址:阿里云ECS建网站(建站)超详细全套完整图文教程! 注意 ...

  6. 网站 HTTP 升级 HTTPS 完全配置手册

    网站 HTTP 升级 HTTPS 完全配置手册 今天,所有使用Google Chrome稳定版的用户迎来了v68正式版首个版本的发布,详细版本号为v68.0.3440.75,上一个正式版v67.0.3 ...

  7. 比较 Spring AOP 与 AspectJ

    本文翻译自博客Comparing Spring AOP and AspectJ(转载:https://juejin.im/post/5a695b3cf265da3e47449471) 介绍 如今有多个 ...

  8. Redis 事物

    MULTI . EXEC . DISCARD 和 WATCH 是 Redis 事务的基础. Multi 和 Exec Multi:开启一个事务,它总是返回 OK .执行之后, 客户端可以继续向服务器发 ...

  9. 进程间通信IPC-消息队列

    前言: 消息队列就是一个消息的链表.可以把消息看作一个记录,具有特定的格式以及特定的优先级.对消息队列有写权限的进程可以向其中按照一定的规则添加新消息:对消息队列有读权限的进程则可以从消息队列中读走消 ...

  10. IDEA的几个常用配置,日常开发必备。

    用了IDEA有很长时间了,身边的同事朋友也都慢慢的开始都从Eclipse切换到IDEA了,其实无论是Eclipse还是IntelliJ IDEA都是开发工具而已,各自都有优点.但是刚从Eclipse切 ...