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 ...
随机推荐
- Open-Source Cybersecurity Infrastructure
https://www.linkedin.com/pulse/open-source-cybersecurity-infrastructure-adrian/ The increased maturi ...
- 18年最有"钱"途的专业就是它(文末有福利)
根据社会调查机构麦可思发布的<2018年中国大学生就业报告>中得知,从就业率.薪资和就业满意度等多角度综合考量,信息安全专业为首推绿牌专业. 不管你是计算机相关专业的学生,还是已经工作的I ...
- BATJ等公司必问的8道Java经典面试题,你都会了吗?
1.谈谈你对 Java 平台的理解?“Java 是解释执行”,这句话正确吗? 考点分析: 对于这类笼统的问题,你需要尽量表现出自己的思维深入并系统化,Java 知识理解得也比较全面,一定要避免让面试官 ...
- FF中flash滚轮失效的解决方案
概述 在FF浏览器中有这样一个bug,就是当鼠标hover在flash区域的时候,滚轮会失效.原因是ff浏览器没有把滚轮事件嵌入到flash里面去.如果这个flash很小的话,比如直播的视频,会很容易 ...
- document.getElementById 和 document.getElementsByClassName获取DOM元素的区别
想必小伙伴们对于 JS 获取DOM的几种方法早已烂熟于心,了然于胸, 尤其是 document.getElementById 和 document.getElementsByClassName, ...
- Metasploit Framework(3)Meterpreter
文章的格式也许不是很好看,也没有什么合理的顺序 完全是想到什么写一些什么,但各个方面都涵盖到了 能耐下心看的朋友欢迎一起学习,大牛和杠精们请绕道 Meterpreter:是一种高级的,动态的,可拓展的 ...
- springboot动态修改日志级别+权限认证
1. springboot动态修改日志级别+权限认证 1.1. 需求 网上找到的动态修改日志级别的方式,基本都是没有权限验证的,或者特地关闭权限验证,但也没给出加上验证的解决方式 修改日志等级也是一个 ...
- python搭建web服务
import json from urlparse import parse_qs from wsgiref.simple_server import make_server import os im ...
- mysql 开发进阶篇系列 42 逻辑备份与恢复(mysqldump 的完全恢复)
一.概述 在作何数据库里,备份与恢复都是非常重要的.好的备份方法和备份策略将会使得数据库中的数据更加高效和安全.对于DBA来说,进行备份或恢复操作时要考虑的因素大概有如下: (1) 确定要备份的表的存 ...
- Node.js 使用 RSA 做加密
RSA RSA加密算法是一种非对称加密算法. 假设 A 与 B 通信.A 和 B 都提供一个公开的公钥.A 把需要传递的信息,先用自己的私钥签名,再用 B 的公钥加密.B 接收到这串密文后,用自己的私 ...