memcached 源码阅览 一
想要快速了解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资源
- http://dtrace.org/blogs/brendan/2011/02/09/dtrace-pid-provider/
- https://www.ibm.com/developerworks/cn/aix/library/au-dtraceprobes.html
- 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 源码阅览 一的更多相关文章
- Memcached源码分析之请求处理(状态机)
作者:Calix 一)上文 在上一篇线程模型的分析中,我们知道,worker线程和主线程都调用了同一个函数,conn_new进行事件监听,并返回conn结构体对象.最终有事件到达时,调用同一个函数ev ...
- Memcached源码分析之线程模型
作者:Calix 一)模型分析 memcached到底是如何处理我们的网络连接的? memcached通过epoll(使用libevent,下面具体再讲)实现异步的服务器,但仍然使用多线程,主要有两种 ...
- Memcached源码分析之从SET命令开始说起
作者:Calix 如果直接把memcached的源码从main函数开始说,恐怕会有点头大,所以这里以一句经典的“SET”命令简单地开个头,算是回忆一下memcached的作用,后面的结构篇中关于命令解 ...
- Memcached源码分析
作者:Calix,转载请注明出处:http://calixwu.com 最近研究了一下memcached的源码,在这里系统总结了一下笔记和理解,写了几 篇源码分析和大家分享,整个系列分为“结构篇”和“ ...
- Memcached源码分析之内存管理
先再说明一下,我本次分析的memcached版本是1.4.20,有些旧的版本关于内存管理的机制和数据结构与1.4.20有一定的差异(本文中会提到). 一)模型分析在开始解剖memcached关于内存管 ...
- memcached源码分析-----item过期失效处理以及LRU爬虫
memcached源码分析-----item过期失效处理以及LRU爬虫,memcached-----item 转载请注明出处:http://blog.csdn.net/luotuo44/article ...
- memcached源码安装(linux和windows)
如果是在windows环境下编译安装,我这边是基于cygwin或msys2方式 安装cygwin环境,http://www.cnblogs.com/skey_chen/p/5765179.html 安 ...
- memcached 源码阅读笔记
阅读 memcached 最好有 libevent 基础, memcached 是基于 libevent 构建起来的. 通由 libevent 提供的事件驱动机制触发 memcached 中的 IO ...
- Memcached源码分析——process_command函数解析
以下为个人笔记 /** * process_command 在memcached中是用来处理用户发送的命令的, * 包括get set,add,delete,replace,stats,flush_a ...
随机推荐
- IDEA环境下GIT操作浅析之一Idea下仓库初始化与文件提交涉及到的基本命令
目标总括 idea 下通过命令操作文件提交,删除,与更新并推送到github 开源库基本操作idea 下通过命令实现分支的创建与合并操作 idea 下通过图形化方式实现idea 项目版本控制基本操作 ...
- SharedPreferences解析
一.概述 SharedPreferences(简称SP)是Android中很常用的数据存储方式,SP采用key-value(键值对)形式,主要用于轻量级的数据存储,尤其适合保存应用的配置参数,但不建议 ...
- linux创建用户并设置密码
1.在root权限下,useradd只是创建了一个用户名,如(useradd+用户名),它并没有在/home目录下创建同名文件夹,也没有创建密码,因此利用这个用户登录系统,是登录不了的,为了避免这样的 ...
- OWIN 自托管静态网站
我们知道,借助OWIN,WebApi,SignalR,WCF 都可以创建自托管(Self-Host)实例,完全不需要IIS,静态网站也可以. 最近做一个服务器监控小工具,用 SignalR 通信,监控 ...
- 【Spark调优】Broadcast广播变量
[业务场景] 在Spark的统计开发过程中,肯定会遇到类似小维表join大业务表的场景,或者需要在算子函数中使用外部变量的场景(尤其是大变量,比如100M以上的大集合),那么此时应该使用Spark的广 ...
- TensorFlow中的变量和常量
1.TensorFlow中的变量和常量介绍 TensorFlow中的变量: import tensorflow as tf state = tf.Variable(0,name='counter') ...
- tensorflow 1.0 学习:参数初始化(initializer)
CNN中最重要的就是参数了,包括W,b. 我们训练CNN的最终目的就是得到最好的参数,使得目标函数取得最小值.参数的初始化也同样重要,因此微调受到很多人的重视,那么tf提供了哪些初始化参数的方法呢,我 ...
- 在vue项目中添加特殊字体
这里的特殊字体,指的是一般用户电脑未安装到本地的字体,要引入这样的字体,首先需要把字体文件下载下来. 就像上图这样的,ttf格式的,然后在项目里添加它. 然后我们在font.css里用@font-fa ...
- Chapter 4 Invitations——4
I wanted very much to talk to him, and the day after the accident I tried. 在发生事故之后我尽力尝试,我很想和他聊聊. The ...
- leetcode — trapping-rain-water
/** * Source : https://oj.leetcode.com/problems/trapping-rain-water/ * * Created by lverpeng on 2017 ...