自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(28)
  • 收藏
  • 关注

原创 erlang虚拟机topology不符导致启动后crash

线上有一台t4的机器,这些机器的cpu topo是经过伪造的,通过top命令可以看到4个核心:topCpu0  :  0.3%us,  0.0%sy,  0.0%ni, 99.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.7%stCpu1  :  0.7%us,  0.3%sy,  0.0%ni, 98.7%id,  0.0%wa,  0.0%hi,  0...

2013-12-24 15:49:47 182

原创 mnesia监控项目

mnesia在运行时提供了大量的统计量,对这些统计量进行监控,有助于正确使用mnesia,以及对mnesia进行调优,这些统计量包括: 代码版本R15B03 1.启动与运行时参数:运行相关参数:mnesia是否在运行中:mnesia:system_info (is_running) 信息输出级别:mnesia:system_info (debug) 是否使用数据...

2013-07-07 13:34:42 260

原创 mnesia的index_read的性能问题

我们在程序开发过程中,存在如下的一段代码:F = fun () ->    Recs = mnesia:index_read(table, Index, indexfield),    NewRecs = some_ops_on(Recs),    mnesia:write(NewRecs)end,mnesia:transaction(F). 这段代码在运...

2013-06-23 16:12:21 346

原创 erlang程序优化点的总结(持续更新)

转载请注明出处  注意,这里只是给出一个总结,具体性能需要根据实际环境和需要来确定霸爷指出,新的erlang虚拟机有很多调优启动参数,今后现在这个方面深挖一下。1. 进程标志设置:       消息和binary内存:erlang:process_flag(min_bin_vheap_size, 1024*1024),减少大量消息到达或处理过程中产生大量binary时的gc次数...

2013-03-03 15:40:08 353

原创 innodb对B树游标的定位过程以及对“小于(等于)B树最小记录”的特殊处理

 innodb对B树进行游标定位时,主要通过函数btr_cur_search_to_nth_level进行,该函数从根页开始向下层页迭代,直到指定的层级level,最终将B树游标定位在第一个大/小于(等于)tuple的位置,先不考虑页面latch、锁、自适应哈希索引、插入缓冲的影响,仅看B树游标定位:UNIV_INTERNvoidbtr_cur_search_to_nth_le...

2013-03-02 17:35:26 484

原创 gen_tcp的close与delay_send交叉问题

铁血的同学遇到这样一个问题,与之前4399同学遇到的问题类似,当初以为是erlang:ports/0的快照问题,仔细分析后发现另有玄机。以下是问题描述:>> 我使用的erlang版本是R15B03,进行socket处理的时候,如果在客户端到服务端有大概1000多个连接的时候(同时有较多的数据在发送),同时关闭所有客户端,>> 这时在使用ports()查询出的...

2013-01-07 22:07:57 411

原创 R15B01版本controlling_process一个port到self的问题

在R15B01上,遇到一个gen_tcp/gen_udp:controlling_process(Port, self())导致的port泄露问题,下列链接详细的说明了产生问题的步骤:https://github.com/erlang/otp/commit/944a57a11a79c5a9bb2f554c921e2e00e7d56c91该问题在R15B03得到了修复,此处分析这个问题如...

2013-01-07 21:43:24 97

原创 erlang:ports与erlang:processes引发的问题

最近4399的同学遇到一个问题,以下是他的描述: “用erlang:ports得出来的port列表里,很多port的port_info都是undefined,实际上这些ports应该都已经被关闭了,手动调用close去关闭这些port的话会抛出异常。”首先重现他的场景:在时刻t1调用erlang:ports()时可以得到erlang虚拟机在t1的所有port,在t1时刻之后的t2时...

2012-07-29 22:57:52 578

原创 erlang NIF部分接口实现(五)复用driver功能的接口

NIF除了自身提供的功能外,还封装了一系列driver的功能,这些功能与操作系统平台紧密相关,主要包括:系统信息,操作系统线程及线程私有资源 ,条件变量、信号量、读写锁等,这些功能本身与erlang的进程体系无关,本身也是线程安全的,因此可以直接复用到NIF中,统一NIF的接口。此处简单的分析一个操作系统线程创建的接口,其余的类似。int enif_thread_create...

2012-07-22 22:08:01 133

原创 erlang NIF部分接口实现(四)消息发送

erlang中不能没有消息和异步过程,NIF也必须有此项能力,这个能力是通过enif_send实现的,它可以在NIF中向一个进程发送消息,但由于消息本身需要跨进程传递,消息的生命周期可能很长,而在erlang NIF部分接口实现(一)中可以看到,NIF每次调用所使用的ErlNifEnv结构是位于process_main函数的栈上的,由这个ErlNifEnv结构分配消息所占用的内存是不可能的,因此需...

2012-07-22 21:42:47 194

原创 erlang NIF部分接口实现(三)持久资源

持久资源是NIF中一类非常有用接口,可以把资源看成各种数据结构描述符,然后在各个模块间传递数据结构,从而使得写erlang程序像写c程序一样,弥补一些erlang程序在性能上的不足。使用持久资源,需要首先创建持久资源类,这些工作可以在NIF被load时进行。ErlNifResourceType*enif_open_resource_type(ErlNifEnv* env, ...

2012-07-22 21:05:58 315

原创 erlang NIF部分接口实现(二)类型系统和内存分配接口

NIF的内存管理接口为enif_alloc/enif_free。erl_nif.c void* enif_alloc(size_t size){    return erts_alloc_fnf(ERTS_ALC_T_NIF, (Uint) size);}erl_alloc.h  ERTS_ALC_INLINEvoid *erts_alloc_fnf(E...

2012-07-22 19:12:30 394

原创 erlang NIF部分接口实现(一)加载过程及编写框架

最近在项目中频繁用到erlang的NIF接口,以扩展erlang虚拟机的功能,同时又能提供较高的性能。NIF(native implemented functions)从R14B开始支持,其功能在于,能够使得erlang module的功能通过c/c++实现。erlang虚拟机有很多与外部进行功能交互的方式,如通过spawn_executable类型的port调用其它程序,port_dri...

2012-07-22 18:18:41 743

原创 erlang抽象码与basho的protobuf(五)执行过程

上文介绍了代码生成过程,成功的从erlang抽象码生成了erlang源文件,抽象码的替换步骤很少,这主要得益于模板文件pokemon_pb.erl的设计。这里将继续分析pokemon_pb.erl的执行过程,从中学习它的编程技巧。编码过程:pokemon_pb.erl encode_pikachu(Record) when is_record(Record, pikachu) -&...

2012-07-07 22:54:15 106

原创 erlang抽象码与basho的protobuf(四)代码生成原理之代码生成

上文介绍了protobuffs的语义分析过程,发现其收集了目标proto文件及其import文件的符号表,此处继续观察代码生成过程。符号表的格式如下: [Message1 = {MessageName,                      [                         Field1 = {FieldId,                   ...

2012-07-07 22:19:15 188

原创 erlang抽象码与basho的protobuf(三)代码生成原理之语义分析

上文介绍了protobuffs的词法与语法分析过程,发现其收集了目标proto文件及其import文件的语法树,此处继续观察语义分析过程。语法树的格式如下:[Message1 = {message,MessageName,[FieldRecord1,FieldRecord2,...,FieldRecordn]},Message2,...,Messagen],FieldRecord = ...

2012-07-07 21:14:12 136

原创 erlang抽象码与basho的protobuf(二)代码生成原理之词法与语法分析

上文介绍了rds_la.proto生成的头文件rds_la_pb.hrl和源文件rds_la_pb.erl的内容,这里将继续分析生成它们的原理。首先看看protoc-erl的内容: #!/usr/bin/env escript%% -*- erlang -*-%%! -sasl errlog_type error -boot start_sasl -noshell ma...

2012-07-07 20:21:47 190

原创 erlang抽象码与basho的protobuf(一)使用

basho的riak是应用erlang编写的类dynamo kv存储,其实现贯彻了松耦合、模块化的特征,各类核心组件均可替换:分布式组件riak_core可以用于构建其它的分布式应用,https://github.com/rzezeski/try-try-try是一个利用riak_core构建分布式应用的教学实例;存储组件riak_kv和riak_serach是基于riak_core实现的...

2012-07-07 19:20:54 146

原创 异步gen_server进行port访问时性能严重下降的原因和应对方法(五)套接字发送的应对...

复制前文的应对方法概览: 1从大道理上来讲,需要开发者预估一个进程的处理能力,不要向进程投递过多的消息以致于处理不完,如果处理不完,则需要重新设计,将消息分布到多个进程中处理;2将异步接收消息的进程与调用port(receive_match)的模式的进程分开;3拆分向port投递命令的过程,由进程来接收port回传的结果,而不是由模块接收;4不使用port编写的模块,利用nif...

2012-06-30 23:35:48 129

原创 异步gen_server进行port访问时性能严重下降的原因和应对方法(四)文件写的应对...

对于“进程允许异步投递,但进程内部有调用port(receive_match)的模式出现”这个问题的解决,有这么几个办法:1从大道理上来讲,需要开发者预估一个进程的处理能力,不要向进程投递过多的消息以致于处理不完,如果处理不完,则需要重新设计,将消息分布到多个进程中处理;2将异步接收消息的进程与调用port(receive_match)的模式的进程分开;3拆分向port投递命令的过程,...

2012-06-30 23:08:47 122

原创 异步gen_server进行port访问时性能严重下降的原因和应对方法(三)典型场景

上文解释了问题成因,即进程允许异步投递,但进程内部有调用port(receive_match)的模式出现 ,现在来看一个典型的场景。霸爷(yufeng)曾经不建议我们使用error_logger模块记录日志,因为该模块就使用了这个模式。首先看看error_logger的启动方式: start() ->    case gen_event:start({local, e...

2012-06-30 22:28:49 162

原创 异步gen_server进行port访问时性能严重下降的原因和应对方法(二)成因

上文介绍了简单的问题场景,现在来分析下产生的原因。consumer进程里面调用file:write和gen_tcp:send来处理消息: handle_msg(Type, Msg, #state{file = File, socket = Socket}) when is_binary(Msg) ->    case Type of        file -> f...

2012-06-30 22:06:29 174

原创 异步gen_server进行port访问时性能严重下降的原因和应对方法(一)场景

在进行项目开发时,有这么一个需求:一个生产者不断产生消息,并将消息异步投递给消费者,异步投递不受任何限制,消费者进程内部将消息写入文件或者通过套接字发送该消息。看到这个需求,我想也没想,熟练地写下了如下代码: API: start_link(FileName, DsgHost, DstPort) ->    gen_server:start_link({local, ...

2012-06-30 20:37:45 141

原创 mnesia的普通transaction写过程(五)事务提交

上一篇博文介绍了mnesia的事务提交准备过程,为每个事务参与结点构造了其提交结构commit,下面将进入到提交过程中,此后将继续分析。 mnesia_tm.erl multi_commit(sym_trans, _Maj = [], Tid, CR, Store) ->    {DiscNs, RamNs} = commit_nodes(CR, [], []),  ...

2012-06-25 22:54:46 179 1

原创 mnesia的普通transaction写过程(四)事务提交准备

上一篇博文介绍了mnesia的锁请求过程,在请求到锁后,mnesia:write将更新写入临时ets表,此后mnesia:write将完成其使命,重新回到mnesia_tm:apply_fun函数中,此后将继续分析。apply_fun(Fun, Args, Type) ->    Result = apply(Fun, Args),    case t_commit(Type...

2012-06-25 22:26:53 168

原创 mnesia的普通transaction写过程(三)锁请求

上一篇博文介绍了mnesia的写操作函数write完成的工作,其中涉及了锁请求过程,此后将继续分析。mnesia_locker.erlwlock(Tid, Store, Oid) ->    wlock(Tid, Store, Oid, _CheckMajority = true).wlock(Tid, Store, Oid, CheckMajority) ->...

2012-06-25 22:05:24 174

原创 mnesia的普通transaction写过程(二)写操作

上一篇博文介绍了mnesia的事务准备阶段,在其transaction上下文中执行了传入的函数,该函数为 fun() -> mnesia:write({user, me, 12345}) end此后将继续分析。mnesia_tm.erlapply_fun(Fun, Args, Type) ->    Result = apply(Fun, Args),    c...

2012-06-25 21:34:49 166

原创 mnesia的普通transaction写过程(一)事务准备

erlang的分布式数据库mnesia是erlang分布式体系中非常重要的组件,其本身具有分布式的特性,可以在多个结点上建立数据副本,支持数据持久化,用好了mnesia,可以极大的减轻分布式架构的设计难度。 本博文带来的第一篇有关mnesia的分析,即是mnesia最常见也最重要的接口:transaction写过程。mnesia的文档上记载(http://www.erlang.org/doc...

2012-06-25 21:14:46 531

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除