自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(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 400

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 243

原创 RabbitMQ源码分析 - 队列机制

 (注:分析代码基于RabbitMQ 2.8.2)当rabbit无法直接将消息投递到消费者时,需要暂时将消息入队列,以便重新投递。但是,将消息入队列并不意味着,就是将消息扔在一个队列中就不管了,rabbit提供了一套状态转换的机制来管理消息。 在rabbit中,队列中的消息可能会处理以下四种状态:alpha:消息内容以及消息在队列中的位置(消息索引)都保存在内存中;beta...

2012-07-09 10:10:58 420

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 727

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 449

原创 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 519

RabbitMQ源码分析 - 启动

RabbitMQ是一个消息队列的实现,基于AMQP(Advanced MessageQueuing Protocol)。最近因为工作需要,打算深入了解RabbitMQ的架构以实现,后续会出一系列文章记录分析过程。这篇总结RabbitMQ的启动过程。(注:分析代码基于RabbitMQ 2.8.2)          RabbitMQ的启动入口在[$RABBIT_SRC/src/...

2012-05-24 19:41:36 474

Erlang热部署 – 模块更新

Erlang的热部署做的很完善,参见ReleaseHandling,这篇文章只关心最基本的模块更新。模块是Erlang程序组织的最基本单元。如下代码就是一个最简单的hello模块(为了说明问题,我们添加了一个init函数): -module(hello).-export([init/0, hello/1]).init() -> Db = dict:new()...

2012-05-21 10:55:55 138

原创 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 229

Erlang并发机制 – 消息传递

Erlang系统中,进程之间的通信是通过消息传递来完成的。消息使用Pid ! Message的形式发送,通过receive语句获取。每个Erlang进程都有用来存储传入消息的信箱。当一个消息发送的时候,它会从发送进程中拷贝到接收进程的信箱,并以它们到达的时间次序存储。消息的传递是异步的,一个发送进程不会在发送消息后被暂停。          上面提到发送消息时,会在两个进程之间存在消...

2012-05-02 10:24:30 309

Erlang并发机制 – 任务迁移算法

 一般情况下,在SMP环境中,每个调度器都会绑定到一个CPU核心,为了保证调度器可以充分的利用CPU资源,那么就必要确保每个调度器任务队列的长度大致相同,Erlang通过任务迁移算法来完成这个功能。Characterizingthe Scalability of Erlang VM on Many-core Processors这篇文章中对这个算法进行了详细的说明,不过,就我自己感觉来说,...

2012-05-02 10:22:08 257

原创 AMQP & Nova

 OpenStack中的Nova各个服务之间以松耦合的方式使用AMQP进行通信(RPC)。使用AMQP的发布/订阅模式来进行RPC有如下优势:         1)客户端及服务端之间解耦:客户端不需要知道有哪些服务端以及服务端的地址;         2)客户端与服务端之间完全的同步性:客户端的RPC不需要服务端正好在运行;         3)远程调用的随机均衡:如果...

2012-04-24 17:31:25 267

Ganger released!

自己做的一个小东西,欢迎有兴趣的同学试用:https://github.com/onlychoice/ganger Ganger - A simple automate tool.==================================================What is Ganger-------------------------------...

2012-04-12 14:40:45 124

Erlang并发机制 –进程调度

Erlang调度器主要完成对Erlang进程的调度,它是Erlang实现软件实时和进程之间公平使用CPU的关键。Erlang运行时,有4种任务需要被调度:进程,Port,Linked-in driver,Erlang虚拟机的系统级活动。 Erlang调度器主要有以下特点:1. 进程调度运行在用户空间 :Erlang进程不同于操作系统进程,Erlang的进程调度也跟操作系统完全没有...

2012-04-10 22:43:43 308

Erlang并发机制 - 进程

在了解Erlang的并发机制之前,我们先来看一下Erlang与Java的并发性能对比,一个是并发单元的创建时间,一个是并发单元之间的消息通讯时间(纵坐标代表时间,横坐标代表并发数量):   (测试程序及说明见这里,原测试时间比较早了,于是在自己的虚拟机上重新跑了下(CenterOS 6,3G内存);JVM生成线程数量控制,可见这里,)          从上面的测试结果来看,...

2012-03-26 21:24:37 473

ELF文件的加载和动态链接过程

近段时间在研究Erlang核心特性的实现,也许过段时间会有个系列的总结,期待... 今天看到有人写一个深入Hello World的文章,想起来读研的时候做的一个关于程序加载和链接的课程设计,也是以Hello World为例说明的,随发出来共享。文后有下载链接。 ====================================================== 本文...

2012-03-09 11:38:00 310

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 215

Tsung源码分析(五):Tsung数据统计

上一篇说明Tsung的服务器监控机制的时候提到,收集到监控数据后,会发送到数据统计进程。其实在会话进程运行时,也会产生大量的统计数据,比如发送了多个请求,执行了多个个事务(Tsung事务),通过网络发送了多少数据,收到多少数据等等。 根据手册中描述,Tsung的统计数据分为四类:sample,sample_counter,counter,sum。其中sample与sample_cou...

2012-02-22 19:59:45 196

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 256

原创 Tsung源码分析(三):Tsung插件式协议支持

 在Websocket forTsung一文中有提到如何扩展Tsung支持自有协议,这里所说的插件式协议支持是指上文中提到的第一种方式:作为session type,本文说明下它的实现原理。          tsung的配置文件中会有sessions这一节,主要配置会话进程跟测试服务器之间的交互过程。sessions可包含多个session,每个session有不同的概率,在会话...

2012-02-17 16:15:45 251

原创 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 211

原创 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 359

原创 Websocket for Tsung

 这篇博文距离上次提到要写差不多快两个月了,一方面时间不多,另一方面主观上总觉得写博客总要写的很好才能发表出来。不过,看了很多别人的博客,其实很多时候只是个记录笔记。希望自己也能利用这个平台做好自己的技术积累过程,不要太在意到底写的怎么样。          费话少说,开发Websocketfor Tsung的初衷是为了做测试。公司一个基于websocket和XMPP的长连接解决方...

2012-02-11 22:11:12 302

Windows下vimerl的配置以及扩展

 最近开始学习Erlang,一方面出于对其主要语言特征(高并发)的兴趣,另一方面,当前项目的压力测试希望用Tsung(http://tsung.erlang-projects.org/,基于Erlang,很好的压力测试工具)来做,而当前Tsung的协议支持还不能满足我们的要求(XMPP over Websocket),所以希望对其进行扩展(下一篇会讲到Tsung的具体扩展实现)。当然,学习一门...

2011-12-11 22:03:12 171

中断线程的执行

--(《Java Concurrency in Practice》读书笔记) 中断线程是指:线程正在运行,还没有正常退出(run方法顺利结束),而某个事件的发生导致该线程必须中断当前正在执行的任务,该线程或者退出,或者等待其它事件然后再继续执行。稳定的基于线程的服务,在程序退出时,必须能够安全的释放线程所占用的资源,减少对系统性能的影响。 Thread类提供的方法中与此功能相关的函...

2011-12-11 19:48:12 231

原创 [转载]Linux线程和进程

上次在做Java中最大线程数量的测试时,对于Linux下的线程与进程的关系有点迷惑,今天看到的一篇文章简单的说明了这两者的关系:Linux线程是通过进程来实现。Linux kernel为进程创建提供一个clone()系统调用,clone的参数包括如 CLONE_VM, CLONE_FILES, CLONE_SIGHAND 等。通过clone()的参数,新创建的进程,也称为LWP(Lig...

2011-11-21 21:10:49 110

原创 JVM中可生成的最大Thread数量

最近想测试下Openfire下的最大并发数,需要开大量线程来模拟客户端。对于一个JVM实例到底能开多少个线程一直心存疑惑,所以打算实际测试下,简单google了把,找到影响线程数量的因素有下面几个: -Xmsintial java heap size-Xmxmaximum java heap size-Xss...

2011-11-21 21:01:15 469

Computer Science from the Bottom Up

In a nutshell, what you are reading is intended to be a shop class for computer science. Young computer science students are taught to "drive" the computer; but where do you go to learn what is under the hood? Trying to understand the operating system is unfortunately not as easy as just opening the bonnet. The current Linux kernel runs into the millions of lines of code, add to that the other critical parts of a modern operating system (the compiler, assembler and system libraries) and your code base becomes unimaginable. Further still, add a University level operating systems course (or four), some good reference manuals, two or three years of C experience and, just maybe, you might be able to figure out where to start looking to make sense of it all. To keep with the car analogy, the prospective student is starting out trying to work on a Formula One engine without ever knowing how a two stroke motor operates. During their shop class the student should pull apart, twist, turn and put back together that two stroke motor, and consequentially have a pretty good framework for understanding just how the Formula One engine works. Nobody will expect them to be a Formula One engineer,

2018-11-12

空空如也

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

TA关注的人

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