您现在的位置:首页
--> 运维和开发
riak_sysmon 是利用 BIF 函数 system_monitor 来监控 Erlang vm 产生的消息状态的项目。下面结合使用来分析一下其源码。 由于使用 system_monitor,那么 riak_sysmmon 仅能做到如下四类事件的捕获: 1. 进程的 heap 超过预设的 heap_word_limit。 2. gc 的收集时间过长超过预设的 gc_ms_limit。 3. 繁忙的文件或者套接口 port。 4. Erlang 节点之间的网络通信烦忙。
基本类型如何使用元表 在lua里只能为表设置元表,而在c程序里面可以为基本类型进行元表操作,但上篇博文提到了普通类型的很多操作是不会走到元表,下面的例子针对数字类型,添加多种事件,只有部分事件会生效.下面的例子在c代码里对数字类型添加元表对__add,__len都设置事件.
表是如何调度到元表的呢,上篇博文的例子我们看到当键值未能被查找到之后会调用__index事件对应的函数.现在举一个”__add”事件来遍历重要环节的源码..... arith_op是个宏,会针对操作数进行类型判断,如果是数字类型就会立即进行相加,这就是为什么基本类型即便设置了加减等事件函数后还是没有效果,例如你为数字的加法设置了__add事件后数字相加不会掉用这个元表方法,后面会举一个例子.
lua metatable(以下简称元表)类似c++的operator overloads,可以对复合结构进行操作,在lua里最常见的就是对表的操作.举例来说,当两个表作加法操作的时候,Lua会检查表的元表中是否有”__add”事件是否对应一个函数(metamethod)。如果存在Lua会调用这个函数来执行一次表的加法操作. __index和__newindex是表常常要添加的事件,用于处理键值在表无法被查找到之后的处理.
继续上一次的sys模块升级的话题,我们再讨论一下升级基本原理,了解一下code和code_server模块。 简单升级 上文也说到过,如果升级未改动 State 里的内容,你可以这样升级。 在集群的每个节点内(当然也可以通过 rpc) 拷贝 beam 到线上的 ebin 目录。 code:purge(Module). code:load_file(Module). 让代码触发 Fully qualified function calls,走到新的 beam 代码。 如果你想省略后 2,3 步,可以利用mochiweb的 reloader 模块进行自动加载。 升级的原理 结合code_server代码来研究一下升级的原理。 erlang 可以同时允许两套代码同时加载运行在虚拟机内部运行, 一套被成为老版本代码 , 一套被成为当前版本代码,也成为最新代码。
sys模块主要有两大用途.统计跟踪目标gen进程,代码热升级,尤其后者非常重要,下面从erlang源码层面来讲述这两大工作原理. 代码热升级 代码热升级能做到gen进程不停(自然其中的socket,file都不需要关闭咯,100%的在线率多有趣的功能阿)的情况下自动载入新的代码, 这点对于其它程序语言来说是件非常难的事情,而对于erlang确只是简单几行代码就能解决问题. 演示代码 这里有演示代码,你可以自行运行. 热升级的原理和步骤 1.首先gen进程已经启动并处于正常工作状态处理业务逻辑,现在需要对代码进行升级,修改原来的内部State状态. 2.修改代码,编译出新的beam文件. compile:file(Mod). 注意不能使用c(Mod). c命令实际包含一个编译和加载和清理老代码作用,这里还不能加载哦, 老的内存状态运行在新的代码肯定报错.
MySQL协议分析,主要参考MySQL Forge上的wiki和源码.协议的全图见这里, 给同事分享的ppt见这里,下载见这里 MySQL协议分析 View more presentations from ruoyi ruan packet number 在做proxy的时候在这里迷糊过,翻了几遍代码才搞明白,细节如下: 客户端服务端的net->pkt_nr都从0开始.接受包时比较packet number 和net->pkt_nr是否相等,否则报packet number乱序,连接报错;相等则pkt_nr自增.
gen_fsm和gen_server非常的类似, 在gen进程递归调用loop函数的过程中,除有StateData还额外有一个StateName的atom, 它决定了下次执行的函数. 另外一个不同之处是, gen_server程序是由调用进程向gen进程发送消息, 一种cs模式的调用关系,而gen_fsm程序中这个发送消息的通常都是gen进程本身. init 初始化过程和gen_server很类似, 区别是init返回必须获得一个当前状态StateName, 这样才能继续接下来的事件处理.
阅读OTP源码可以帮助你写出更好、更健壮的erlang程序.下面一系列文章就gen_server、gen_fsm、supervisor的源码进行分析, 从erlang级别解释其工作原理, 所有的完整流程图在这里, 第一次写erlang方面博文有错误请帮忙指出. 为什么从gen_server它开始, 因为gen_fsm和它很类似, 而supervsisor本身是一个gen_server. init 图示为一个叫Mod的模块, 它是一个gen_server程序, 绿色方格为调用进程(客户进程), 黄色方格为spawn出的gen进程(服务进程). 不同的泳道表示函数所隶属的模块, 通过这个图可以清晰的看出各个模块至之间的相互调用, 图是使用gliffy所画。
supervisor实际上是基于gen_server的系统进程,监控子进程的退出状态并设置一定的重启机制。 init 在这个例子里Mod模块是一个sup程序,它的启动会调用supervisor:start_link,而start_link实际上调用的gen_server:start_link并存入Mod模块的名字和参数. 从前面的文章我们可以知道, spawn出来的gen进程会先调用supervisor:init函数. 接着把gen进程设置为系统进程, 这样就可以捕获子进程退出信号, 然后根据Args里的Mod模块名和参数,再次调用到Mod:init. Mod的init函数返回的是一个{ok, SupFlags, StartSpec}的元组. SupFlags是supervisor管理的进程的启动策略和可重启的范围窗口,StartSpec是一个列表,保存多个子进程的MFA等信息.
redis是个内存全集的kv数据库,不存在部分数据在磁盘部分数据在内存里的情况,所以提前预估和节约内存非常重要.本文将以最常用的string和zipmap两类数据结构在jemalloc内存分配器下的内存容量预估和节约内存的方法. 先说说jemalloc,传说中解决firefox内存问题freebsd的默认malloc分配器,area,thread-cache功能和tmalloc非常的相识.在2.4版本被redis引入,在antirez的博文中提到内节约30%的内存使用.相比glibc的malloc需要在每个内存外...
丰富的数据结构使得redis的设计非常的有趣。不像关系型数据库那样,DEV和DBA需要深度沟通,review每行sql语句,也不像memcached那样,不需要DBA的参与。redis的DBA需要熟悉数据结构,并能了解使用场景。 下面举一些常见适合kv数据库的例子来谈谈键值的设计,并与关系型数据库做一个对比,发现关系型的不足之处。 用户登录系统 记录用户登录信息的一个系统, 我们简化业务后只留下一张表。
我们跟踪一个普通的get命令来遍历几个关键函数,熟悉协议处理的过程。 你可以通过telnet或者redis_cli、利用lib库发送请求给redis server。前者的是一种裸协议的请求发送到服务端,而后两者会对键入的请求进行协议组装帮助更好的解析(常见的是长度放到前头,还有添加阿协议类型)。 Requests格式 *参数的个数 CRLF $第一个参数的长度CRLF 第一个参数CRLF ... $第N个参数的长度CRLF 第N个参数CRLF 例如在redis_cli里键入get a,经...
mydumper是一个多线程、高性能的数据逻辑备份、恢复的工具,相比MySQL自带的mysqldump提速不少。我下载了0.23的稳定版本,阅读了源码并总结了一些使用的心得。 mysqldump是个单线程的逻辑备份工具,依次一个个导出多个表,没有一个并行的机制。mydumper弥补了这方面的缺陷可以并行的多线程的从表中读入数据并同时写到不同的文件里。项目的作者是由一群在sun、fb、skysql的工程师完成的。类似的工具还有mk-parallel-dump。
使用Python操作MySQL数据库的时候常使用MySQLdb这个模块。 今天在开发的过程发现MySQLdb.connect有些参数没法设置。通过这个页面我们可以看到在connect的时候,可以设置的option和client_flags和MySQL c api相比差不少。 一个很重要的参数 MYSQL_OPT_READ_TIMEOUT没法设置,这个参数如果不设置,极致状况MySQL处于hang住,自动切换IP漂移,客户端无法重连到新MySQL。 给MySQLdb加Option很简单,只要修改_mysql.c这个把Python对象映...
5.1 版本开始MySQL开始支持plugin API,允许在mysqld运行时载入或者卸载组件,而不需要重启mysqld。 plugin API涵盖了UDF、full-text、advanced schema等功能,其中的daemon plugin个人认为是非常的有用。其功能是在plugin载入后可以创建额外的后台线程于mysqld主线程一同协同工作。 plugin API的具体实现在sql/sql_plugin.h 和sql/sql_plugin.cc两个文件中。载入plugin使用dl_open系的动态加载共享库的方法打开so文件,获得需要执...
在MySQL里添加一个system、status variables的比较复杂的,需要修改sql/sql_show.cc,sql/mysqld.cc, 还要修改sql/sql_yacc.yy,然后重新编译等等,前面的文章可见其复杂度,很容易出错。 daemon plugin 除了允许添加后台线程,也允许添加status,且不需要修改mysqld的代码。
本文从源代码角度详细解释使用mysql客户端连上MySQL的服务端的过程以及通过用户认证的过程。 用户在客户端键入 mysql -h a.b.c.d -u root -pxxxx 最终都会调用到mysql_real_connect(sql/client.c的1856行的宏CLI_MYSQL_REAL_CONNECT),我们从这个函数出发。 先上图 发件人 MySQL 客户端发起socket连接,等待三次握手的通过。 三次握手通过之后,客户端进入client_safe_read阻塞,同时服务端从handle_connection_sockets函数的selec...
show processlist是诊断MySQL常用的命令,它会列出THD对象里所有的线程当前状况。 下面将为show processlist添加一个新的列,表示当前连接查询之后返回的行数,字段名为my_row_count。 当你要修改一个命令的时候,最好从sql/sql_yacc.yy出发,根据命令的关键字语法匹配到后续的动作。打开sql/sql_yacc.yy后搜索关键字show:,就找到了所有show命令的语法规则。
redis的复制方法和机制都比较简单。 slaveof masterip port 在slave端键入命令之后,就开启了从master到slave的复制。一个master可以有多个slave,master有变化的时候会主动的把命令传播给每个slave。slave同时可以作为其他的slave的master,前提条件是这个slave已经处于稳定状态(REDIS_REPL_CONNECTED)。slave在复制的开始阶段处于阻塞状态(sync_readline)无法对外提供服务。 数据的有向图会让redis的运维很有搞头。
[ 共23篇文章 ][ 第1页/共2页 ][ 1 ][ 2 ]
近3天十大热文
- [55] Oracle MTS模式下 进程地址与会话信
- [55] IOS安全–浅谈关于IOS加固的几种方法
- [54] 如何拿下简短的域名
- [53] android 开发入门
- [52] Go Reflect 性能
- [52] 图书馆的世界纪录
- [49] 读书笔记-壹百度:百度十年千倍的29条法则
- [48] 【社会化设计】自我(self)部分――欢迎区
- [38] 程序员技术练级攻略
- [32] 视觉调整-设计师 vs. 逻辑
赞助商广告