- 博客(27)
- 资源 (1)
- 收藏
- 关注
RabbitMQ源码分析 – 持久化机制
(注:分析代码基于RabbitMQ 2.8.2) 当消息需要持久化(相应队列首先必须是durable)或者因为内存吃紧,需要把消息转移到磁盘的时候就会触发持久化操作。Rabbit中两部分信息涉及到持久化操作:一个是消息本身,由msg_store模块负责([$RABBIT_SRC/src/rabbit_msg_store.erl]),另一个是消息在队列中的位置,由queue_index模块负责(...
2012-08-21 09:34:24
449
I/O模型:阻塞、非阻塞 & 同步、异步
这篇文章主要总结下这几个概念,前几天看到微博里在讨论,当时也有点搞不清楚,昨天在看到Reactor和Proactor模式的时候,又提到相关概念,索性搞搞清楚,写个总结。 《Unix网络编程卷1:套接字联网API》(下面称为卷1)第6章对Unix I/O模型有5种划分:阻塞式I/O模型,非阻塞式I/O模型,I/O复用模型,信号驱动式I/O,异步I/O模型。这里我们只关心跟我们主题相关的...
2012-08-12 20:05:43
283
原创 RabbitMQ源码分析 - 队列机制
(注:分析代码基于RabbitMQ 2.8.2)当rabbit无法直接将消息投递到消费者时,需要暂时将消息入队列,以便重新投递。但是,将消息入队列并不意味着,就是将消息扔在一个队列中就不管了,rabbit提供了一套状态转换的机制来管理消息。 在rabbit中,队列中的消息可能会处理以下四种状态:alpha:消息内容以及消息在队列中的位置(消息索引)都保存在内存中;beta...
2012-07-09 10:10:58
463
RabbitMQ源码分析 – 消息生命周期
(注:分析代码基于RabbitMQ 2.8.2)当客户端通过basic.publish命令(AMQP定义)发布一个消息时,rabbit需要经过以下几个步骤处理消息:1) 根据客户端传来的消息内容及相关属性(目标exchange,routing keys,mandatory及immediate属性)构造一个消息实体;2) 根据要投递的exchange及routing keys匹配消息的目...
2012-06-25 10:53:22
798
RabbitMQ源码分析 – 实体初始化
(注:分析代码基于RabbitMQ 2.8.2)Connection在上篇文章中提到,客户端连上rabbit后,需要向rabbit发送AMQP协议头,rabbit在收到协议头后,开始在0号channel 上跟客户端进行交互(AMQP中一个连接可以多路复用,1~65535为可用的channel编号,0号channel,也就是frame中channel的索引为0,被认为是全局于整个连接)。...
2012-06-11 16:15:05
485
原创 RabbitMQ源码分析 – 网络层
(注:分析代码基于RabbitMQ 2.8.2) 网络层的启动也是作为上一篇文章中提到的一个启动步骤来启动的,入口为[$RABBIT_SRC/src/rabbit_networking.erl -->boot/0],代码如下:boot() -> ok = start(), ok = boot_tcp(), ok = boot_ssl()....
2012-05-30 13:31:06
576
RabbitMQ源码分析 - 启动
RabbitMQ是一个消息队列的实现,基于AMQP(Advanced MessageQueuing Protocol)。最近因为工作需要,打算深入了解RabbitMQ的架构以实现,后续会出一系列文章记录分析过程。这篇总结RabbitMQ的启动过程。(注:分析代码基于RabbitMQ 2.8.2) RabbitMQ的启动入口在[$RABBIT_SRC/src/...
2012-05-24 19:41:36
505
Erlang热部署 – 模块更新
Erlang的热部署做的很完善,参见ReleaseHandling,这篇文章只关心最基本的模块更新。模块是Erlang程序组织的最基本单元。如下代码就是一个最简单的hello模块(为了说明问题,我们添加了一个init函数): -module(hello).-export([init/0, hello/1]).init() -> Db = dict:new()...
2012-05-21 10:55:55
176
原创 Erlang并发机制 – 垃圾回收
Erlang中每个进程都有独立的堆内存,默认的大小是233个words(可配置),并以Fibonacci序列的顺序增长(233对应fib(11))。不过,当堆内存增大到一定程序时,增长速度减缓,比如内存大于fib(35)=14M的时候,堆内存开始不以Fibonacci序列增长(具体参见[$R15B_OTP_SRC/erts/emulator/beam/erl_gc.c --> erts...
2012-05-02 10:34:18
274
Erlang并发机制 – 消息传递
Erlang系统中,进程之间的通信是通过消息传递来完成的。消息使用Pid ! Message的形式发送,通过receive语句获取。每个Erlang进程都有用来存储传入消息的信箱。当一个消息发送的时候,它会从发送进程中拷贝到接收进程的信箱,并以它们到达的时间次序存储。消息的传递是异步的,一个发送进程不会在发送消息后被暂停。 上面提到发送消息时,会在两个进程之间存在消...
2012-05-02 10:24:30
523
Erlang并发机制 – 任务迁移算法
一般情况下,在SMP环境中,每个调度器都会绑定到一个CPU核心,为了保证调度器可以充分的利用CPU资源,那么就必要确保每个调度器任务队列的长度大致相同,Erlang通过任务迁移算法来完成这个功能。Characterizingthe Scalability of Erlang VM on Many-core Processors这篇文章中对这个算法进行了详细的说明,不过,就我自己感觉来说,...
2012-05-02 10:22:08
304
原创 AMQP & Nova
OpenStack中的Nova各个服务之间以松耦合的方式使用AMQP进行通信(RPC)。使用AMQP的发布/订阅模式来进行RPC有如下优势: 1)客户端及服务端之间解耦:客户端不需要知道有哪些服务端以及服务端的地址; 2)客户端与服务端之间完全的同步性:客户端的RPC不需要服务端正好在运行; 3)远程调用的随机均衡:如果...
2012-04-24 17:31:25
308
Ganger released!
自己做的一个小东西,欢迎有兴趣的同学试用:https://github.com/onlychoice/ganger Ganger - A simple automate tool.==================================================What is Ganger-------------------------------...
2012-04-12 14:40:45
153
Erlang并发机制 –进程调度
Erlang调度器主要完成对Erlang进程的调度,它是Erlang实现软件实时和进程之间公平使用CPU的关键。Erlang运行时,有4种任务需要被调度:进程,Port,Linked-in driver,Erlang虚拟机的系统级活动。 Erlang调度器主要有以下特点:1. 进程调度运行在用户空间 :Erlang进程不同于操作系统进程,Erlang的进程调度也跟操作系统完全没有...
2012-04-10 22:43:43
373
Erlang并发机制 - 进程
在了解Erlang的并发机制之前,我们先来看一下Erlang与Java的并发性能对比,一个是并发单元的创建时间,一个是并发单元之间的消息通讯时间(纵坐标代表时间,横坐标代表并发数量): (测试程序及说明见这里,原测试时间比较早了,于是在自己的虚拟机上重新跑了下(CenterOS 6,3G内存);JVM生成线程数量控制,可见这里,) 从上面的测试结果来看,...
2012-03-26 21:24:37
536
ELF文件的加载和动态链接过程
近段时间在研究Erlang核心特性的实现,也许过段时间会有个系列的总结,期待... 今天看到有人写一个深入Hello World的文章,想起来读研的时候做的一个关于程序加载和链接的课程设计,也是以Hello World为例说明的,随发出来共享。文后有下载链接。 ====================================================== 本文...
2012-03-09 11:38:00
336
CentOS6下编译Erlang R15B with wxWidgets
如果不需要安装wxWidgets的话,很简单,./configure & make & make install。但是装起来后,发现Erlang的debugger无法启动,显示“ERROR:Could not find 'wxe_driver.so' in: /usr/local/lib/erlang/lib/wx-0.99.1/priv”,虽说不使用debugger也问...
2012-02-23 16:41:15
256
Tsung源码分析(五):Tsung数据统计
上一篇说明Tsung的服务器监控机制的时候提到,收集到监控数据后,会发送到数据统计进程。其实在会话进程运行时,也会产生大量的统计数据,比如发送了多个请求,执行了多个个事务(Tsung事务),通过网络发送了多少数据,收到多少数据等等。 根据手册中描述,Tsung的统计数据分为四类:sample,sample_counter,counter,sum。其中sample与sample_cou...
2012-02-22 19:59:45
221
Tsung源码分析(四):Tsung服务器监控
Tsung在进行压力测试同时,也可以监控服务器结点上的CPU、内存、系统负载等信息(详见监控一节)。 Tsung提供了三种监控方式:Erlang,SNMP,Munin。在tsung_controller启动的第二个阶段,会通过ts_os_mon:activate启动服务器监控。activate函数的执行很简单,通过ts_config_server:get_monit...
2012-02-21 22:18:42
284
原创 Tsung源码分析(三):Tsung插件式协议支持
在Websocket forTsung一文中有提到如何扩展Tsung支持自有协议,这里所说的插件式协议支持是指上文中提到的第一种方式:作为session type,本文说明下它的实现原理。 tsung的配置文件中会有sessions这一节,主要配置会话进程跟测试服务器之间的交互过程。sessions可包含多个session,每个session有不同的概率,在会话...
2012-02-17 16:15:45
288
原创 Tsung源码分析(二):Tsung压力生成过程
上一篇讲到ts_config_server:newbeams通过ts_launcher:launch和ts_launcher_static:launch启动本地和远程结点压力客户端,其中ts_launcher用于随机生成用户,ts_launcher_static主要用于静态生成用户。这一篇详细的说明压力客户端是如何启动的。 说明:压力客户端是指一个tsung应用,见TUNG_R...
2012-02-17 12:55:27
245
原创 Tsung源码分析(一):Tsung启动过程
一方面,分析Tsung的架构及实现,另一方面,也是一个学习Erlang的过程,所以如果有碰到不了解的东西,也会记录下来。(该分析系统基于Tsung 1.4.2,涉及到Erlang源码的部分会以R15B为基础) Tsung由tsung.sh(默认位置:/usr/bin/tsung)来启动。调用tsung.sh后,会进入到start()函数中,然后调用默认的erl命令来启...
2012-02-17 12:51:04
407
原创 Websocket for Tsung
这篇博文距离上次提到要写差不多快两个月了,一方面时间不多,另一方面主观上总觉得写博客总要写的很好才能发表出来。不过,看了很多别人的博客,其实很多时候只是个记录笔记。希望自己也能利用这个平台做好自己的技术积累过程,不要太在意到底写的怎么样。 费话少说,开发Websocketfor Tsung的初衷是为了做测试。公司一个基于websocket和XMPP的长连接解决方...
2012-02-11 22:11:12
330
Windows下vimerl的配置以及扩展
最近开始学习Erlang,一方面出于对其主要语言特征(高并发)的兴趣,另一方面,当前项目的压力测试希望用Tsung(http://tsung.erlang-projects.org/,基于Erlang,很好的压力测试工具)来做,而当前Tsung的协议支持还不能满足我们的要求(XMPP over Websocket),所以希望对其进行扩展(下一篇会讲到Tsung的具体扩展实现)。当然,学习一门...
2011-12-11 22:03:12
194
中断线程的执行
--(《Java Concurrency in Practice》读书笔记) 中断线程是指:线程正在运行,还没有正常退出(run方法顺利结束),而某个事件的发生导致该线程必须中断当前正在执行的任务,该线程或者退出,或者等待其它事件然后再继续执行。稳定的基于线程的服务,在程序退出时,必须能够安全的释放线程所占用的资源,减少对系统性能的影响。 Thread类提供的方法中与此功能相关的函...
2011-12-11 19:48:12
254
原创 [转载]Linux线程和进程
上次在做Java中最大线程数量的测试时,对于Linux下的线程与进程的关系有点迷惑,今天看到的一篇文章简单的说明了这两者的关系:Linux线程是通过进程来实现。Linux kernel为进程创建提供一个clone()系统调用,clone的参数包括如 CLONE_VM, CLONE_FILES, CLONE_SIGHAND 等。通过clone()的参数,新创建的进程,也称为LWP(Lig...
2011-11-21 21:10:49
122
原创 JVM中可生成的最大Thread数量
最近想测试下Openfire下的最大并发数,需要开大量线程来模拟客户端。对于一个JVM实例到底能开多少个线程一直心存疑惑,所以打算实际测试下,简单google了把,找到影响线程数量的因素有下面几个: -Xmsintial java heap size-Xmxmaximum java heap size-Xss...
2011-11-21 21:01:15
507
Computer Science from the Bottom Up
2018-11-12
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人