自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

阿罗

天高任鸟飞,海阔凭鱼跃

  • 博客(57)
  • 资源 (3)
  • 收藏
  • 关注

原创 Zookeeper C Client分析

每个zookeeper API必须有一个zhandle。当初始化一个zhandle时(zookeeper_init)首先初始化zhandle的相应字段然后创建两个线程:do_io,do_completion;并且等待这两个线程初始化完成后才返回,这两个线程也要等待彼此初始化完成后,才提供服务(notify_thread_ready)。1 IO线程/do_io显然这个线程用于处理io请求(使

2013-06-28 17:56:27 12420

原创 innodb学习(一)——innodb如何使用aio

Innodb从5.5开始使用linux的Native AIO(后面简称N-AIO),告别之前仿真的方式。我们下面从5.6.10的源码分析Innodb的Native AIO使用架构。       Innodb有N个io handler threads(N=1个ibuf_io_thread + 1个log_io_thread + innodb_read_io_threads个read_io_t

2013-03-07 17:23:29 7079 1

原创 innodb事务隔离级别

事务隔离级别SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。Read Uncommitted(读取未提交内容)      在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读

2013-02-28 20:15:08 12675

原创 linux调度器(十)——调度器/proc信息解读

注下面的时间或时刻都是从rq->clock中获得的,而这个值是由update_rq_clock底层cpu来更新的。并且很多信息是需要内核配置CONFIG_SCHEDSTATS才有。/proc//sched$cat /proc/28733/sched     cpu_test (28733, #threads: 1)--------------------------

2013-02-06 20:46:16 24012

原创 linux调度器(九)——调度器的配置参数

调度器的配置参数/proc/sys/kernel/sched_min_granularity_ns(4000000ns):sysctl_sched_min_granularity,表示进程最少运行时间,防止频繁的切换,对于交互系统(如桌面),该值可以设置得较小,这样可以保证交互得到更快的响应(见周期调度器的check_preempt_tick过程)/proc/sys/kernel/sc

2013-02-06 20:44:45 22129 1

原创 linux调度器(八)——实时调度与SMP

实时调度器类实时调度类有两类进程:循环进程SCHED_RR:循环进程有时间片,随着进程的运行时间会减少。当时间片用完时又将其置为初值,并将进程置于队列末尾。先进先出SCHED_FIFO:没有时间片调度,运行后可执行任意长时间直到自己放弃CPU。实际上两类进程在相同优先级队列上都是先进先出的,只是一个有时间片一个没有时间片。    现在实时进程的调度其实就是使用之前内核的O(1)

2013-02-06 20:42:45 9442

原创 linux调度器(六)——应用层理解CFS及组调度

上面我们介绍了CFS及组调度相关的主要内容,但可能很多人还跟我一样有点云里雾里的,下面我们直接从应用层面上也查看CFS及组调度的效果。首先对于非组调度,决定它们运行时间的唯一因素就是weight,也就是我们知道的nice,我们可以通过renice来重新调整进程的优先级,然后再使用taskset将它们限定在同一个CPU上(CFS只是保证一个CPU的公平,所以你可以看到一个有趣的现象:如指定两个进程的

2013-02-06 20:38:57 9698 1

原创 linux调度器(五)——进程管理与CFS

进程调度初始化         由于该过程涉及到进程的管理模块,这个模块的详细过程我们将在以后的机会介绍,所以这里,我们主要扣出与调度相关的内容。进程的创建内核入口为do_fork,首先我们简单的看一下它的主要行为:图 do_fork与CFS的交互         上图我们只是画了do_fork最普通的fork操作,及正常的启动状态,上面的三个sched_class函数调用就是

2013-02-06 20:36:24 7015

原创 linux调度器(四)——主调度器与CFS

当内核从系统调用返回,或者从中断处理程序返回,内核都会检查当前进程是否设置了TIF_NEED_RESCHED标志;或者进程主动放弃CPU时(sched_yield,sleep或者收到SIGSTOP,SIGTTOP信号)都会进入主调度器。同样的我们先看一下主调度的框架部分,该部分就是sched.c:schedule(void):关闭内核抢占如果进程之前是不可运行并且被内核抢占了,那么如果它现

2013-02-06 20:33:44 6817 1

原创 linux调度器(三)——周期性调度器与CFS

注:这里并没有详细分析到每个内部函数,如果要了解这些细节的话,可以看后面的OTHER CFS CLASS API及CFS主要的内部函数。    周期性调度器在调度框架上由scheduler_tick完成:在每一个cpu的时钟周期都触发一次该函数调用,它更新运行队列的时钟及load,然后调用当前进程的调度器类的周期调度函数。 update_rq_clock(rq); /* 更新运行队列的时钟rq

2013-02-06 20:29:54 7337

原创 linux调度器(二)——CFS模型

本系列文章阅读的core是:2.6.32-220这里使用“模型”而不是“算法”是因为这东西实在不好用算法描述(但是它却运行得很好,包括性能)。         核心思想: 把CPU总时间按运行队列的所有se的权重分配给每个se。每个se使用cpu的顺序由它们已使用的cpu虚拟时间(vruntime)决定的,已使用的虚拟时间越少,它在运行队列的位置越靠左,那么它再次被调度执行的概率也就越高。

2013-02-06 20:23:30 7696

原创 linux调度器(一)——概述

本次分析的kernel代码为2.6.32-220。并且我们先不考虑SMP。当前linux的调度程序由两个调度器组成:主调度器,周期性调度器(两者又统称为核心调度器);并且每个调度器包括两个内容:调度框架(其实质就是两个函数框架)及调度器类。调度器类是实现了不同调度策略的实例,如 CFS、RT class。它们的关系如下图:图 调度器的组成当前的内核支持两种调度器类(sched_se

2013-02-06 14:08:06 17784

原创 cgroup学习(八)——CPUSET子系统

对于CPUSET子系统我们主要解释对cpuset.cpus的操作。Read操作根据《cgroup学习(三)——伪文件》可以很容易的跟踪到代码,并解读,所以我们这里就不赘述,直接解释write及attach操作。首先我们看一下write操作的bt(使用systemtap见《使用systemtap获得内核函数的局部变量》):sudo sh -c "echo 0-3 > cpuset.cpus"1

2013-01-09 18:23:57 10082

原创 cgroup学习(七)——cpu子系统

CPU子系统        对于CPU子系统最常见的参数就是cpu.shares,我们来通过《cgroup学习(三)——伪文件》的表格来跟踪一下对该参数的读写操作。        通过systemtap我们可以看到读的bt:(cat cpu.shares)2327 (cat) cpu_shares_read_u64 call trace: 0xffffffff8104d0a0 : c

2013-01-06 21:01:48 7991

原创 cgroup学习(六)——attach task

attach task        该过程对应于我们上面的实例操作的:echo 512 > tasks的过程,其实质就是先对cgroup下tasks文件进行写操作,建立该进程新的css_set与所有管理它的cgroup的关系;然后再根据各个子系统自己的attach函数进行attach操作。在这里我们先介绍第一个过程,第二个过程在各个子系统中介绍。先看一下bt:12530 (sh) cpu

2013-01-06 20:46:45 7229

原创 cgroup学习(五)—— create new cgroup

create new cgroup        该过程就是mkdir/cgroup/cpu/test_cpu:在一个/cgroup/cpu hierarchy上创建一个cgroup,下面的bt是创建一个cpu hierarchy下的cgroup:mkdir /cgroup/cpu/test_cpu74447177 8388 (mkdir) call trace: 0xffffff

2013-01-06 20:38:17 5884

原创 cgroup学习(四)——mount hierarchy

mount hierarchy        该过程对应于mount -t cgroup -o cpu,cpuset cpuandset /cgroup         首先它解析mount参数-o ***:parse_cgroupfs_option,创建一个新的cgroupfs_root:cgroup_root_from_opts,通过cgroup_test_super判断新的mount

2013-01-06 20:24:36 8146 1

原创 cgroup学习(三)——伪文件

伪文件        cgroup是通过VFS与上层进行交互的,它定义了自己的cgroup文件系统,同时也定义了哪些文件,这些文件也是最终影响着cgroup行为,这一节我们介绍一下,每个子系统的伪文件定义在哪里?以及内核如何去操作这些伪文件。下面我们通过一张表来展示这些关系:SubsysFilesTo_csslocate

2013-01-06 20:13:59 6798

原创 cgroup学习(二)——cgroup框架结构

cgroup框架结构这一章里,我们先整体介绍一个cgroup的框架结构,以及cgroup文件系统的相应文件定义。这里我们先看一下cgroup的主要结构关系: 图2 主要数据结构关系该图包含了cgroup的所有主要数据结构及它们的关系。其中cgroupfs_root相当于我们mount操作指定的dir;cgroup表示在mount目录下的mkdir cg_test;而cgroup

2013-01-06 19:48:33 11558 1

原创 cgroup的学习(一)——what cgroup?

本序列文章将介绍cgroup概念,cgroup框架,cgroup的子系统 What Cgroup?      Control Groups provide a mechanism foraggregating/partitioning sets of tasks, and all their future children, intohierarchical groups with s

2013-01-06 18:23:36 14466

原创 使用systemtap获得内核函数的局部变量

使用systemtap获得内核局部变量         这两天在看内核的cgroup源码,就想着通过某个工具来获得一些调试信息如bt,参数返回值等,像在调试应用程序一样使用gdb来获得这些信息。所以就有了对systemtap的真正实践。注:我测试的机器使用的内核是:2.6.32-220.23.1.tb704.el6.x86_64(这是我们公司的内核),我看的源码是http://www.ke

2012-12-28 17:26:48 9194 1

原创 mysql-proxy学习(四)——性能测试

1.     硬件配置hwconfigSummary:        Intel S5500WBV, 2 x Xeon E5620 2.40GHz,23.5GB / 24GB 1067MHzSystem:         Intel S5500WBVProcessors:     2 x Xeon E5620 2.40GHz 133MHz FSB (HTenabled, 8 cor

2012-05-10 18:12:54 5620 2

原创 mysql proxy学习(三)——体系结构

Mysql proxy体系结构:多线程+libevent+glib2从前面的内容我们已经确认了accept过程是由主线程完成的,并且它创建了一个con->client的与client连接的event;并且它接着创建一个con->server打算与后台mysql server进行连接。此时如果该fd不可写,则会在proxy_connect_server返回NETWORK_SOCKET_ERROR

2012-02-06 22:12:58 3587

原创 mysql proxy学习(二)——状态转移

mysql proxy学习(二)——状态转移上一节我们已经知道了listen fd的回调函数network_mysqld_con_accept,该函数负责accept客户端的连接network_socket_accept,然后进入与客户端及后台mysql交互的协议流程(状态转移)network_mysqld_con_handle。下面我们看一下proxy的状态转移图(mysql proto见h

2012-02-06 22:00:40 3214

原创 mysql proxy学习(一)启动过程

mysql proxy学习(一)启动过程mysql-proxy依赖的库较多包括:libevent,glib2,lua;所以代码阅读起来还是需要一些的相应的一些知识。1. Libevent主要接口event_base_new:初始化一个event_baseevent_set:设置event事件;即初始化struct event结构:类型,文件描述符,回调函数以及参数event_b

2012-02-06 21:53:36 6644 1

原创 redis代码结构之三类型库-list

redis代码结构之三类型库-list 1. REDIS_LIST(t_list.c)该类型的命令包括:lpush,rpush,lpop,rpop等等。这里我们只介绍lpush命令,它相应的命令回调函数为void lpushCommand(redisClient *c) { pushGenericCommand(c,REDIS_HEAD);}我们直接看pushGenericCommand

2012-01-19 17:42:14 1867

原创 redis代码结构之三类型库-string

redis代码结构之三类型库-list 1. 类型库概述下面介绍redis核心的内容以及所支持的数据类型及操作。首先看一下相应的数据结构:typedef char *sds; //该文件返回的基本上都是sds,即char *,也是实际存储内容的地址。struct sdshdr { int len; //内容拥有的空间,不包括该结构的本身的大小,也不包括buf最后的结束符’

2012-01-19 17:37:37 1816

原创 redis代码结构之二net,main,event

redis代码结构之二net,main,event1. 网络库anet.c、networking.c:这两个文件主要实现与网络通信以及与client之间的交互处理。1.1 anet.c该文件封装了基本的网络socket操作(tcp、unixsock),我们这里通过调用者简单说明一下其中的函数。(有一些函数在当前还没有使用)Server使用的函数:int anetTcpSer

2012-01-19 17:28:16 88

原创 redis代码结构之一mem,bio

Redis代码结构 一mem,bio1.       Redis代码结构事件库类型库网络库持久化复制订阅事务mainclient其它ae.cae_epoll.c ae_kqueue.cae_select.csyncio.cadlist.cintset.cobject.csds.ct_ha

2012-01-19 17:09:10 188

原创 redis replication

redis replication//////////////////////////////////////////////// slave /////////////////////////////////////////////1.      Slave init方式当前有两种方式:启动一个server通过slaveof mip mport方式来将该server转换为一个slav

2011-12-20 19:43:37 2148

原创 Redis SNAPSHOT的实现

Redis SNAPSHOT上一篇文章我们学习了redis aof的实现.这篇文章我们将学习redis的另一种持久化方式:snapshot(快照)。同上一篇文章一样,我们首先介绍相关参数;然后依次介绍它的使用场景。1. 配置参数save :相对一个DB,多少秒内发生了多少次更新操作,此时就会进行一次保存操作,这个可以设置多个条件,它们中的任一个满足都会保存一次,下面把这个

2011-12-11 17:58:19 2325

原创 REDIS AOF的实现

Redis AOF上文我们介绍了Redis的主框架,以及两种持久化大概原理。本文我们将从源码角度分析Redis AOF的相关实现。(本文基于的版本为2.4.2)1. 相关配置项首先我们看一下redis.conf里的关于AOF的配置选项:Appendonly(yes,no):是否开启AOF持久化Appendfilename(log/appendonly.aof):AOF日志文件

2011-12-08 13:50:43 10531 1

原创 redis学习总结

Redis学习总结redis是一个单线程基于事件机制的一个模型,使用事件处理框架 aeEvent1.       启动过程Reids的启动过程大致如下:1.初始化全局struct server数据结构,给每个成员赋予默认值,并且创建命令表,用于查找相应命令对应的处理函数:initServerConfig()--->populateCommandTable2.如果指定了配置文件,

2011-11-23 21:29:47 5535

原创 mysql子查询(in)的实现

In子查询的原理1.    in原理此调研的背景是同样的select结果为什么使用子查询会比不使用子查询慢。我们使用的数据库还是mysql官方的employees。进行的实验操作为下面两个语句:方法一:explain select sql_no_cache t.emp_no,t.title,t.from_date,t.to_datefrom titles t straight_join

2011-11-13 16:04:23 27359 1

原创 MYSQL Order by的实现

本文使用的mysql版本为5.1.48select sql_no_cache * from one where id#0 my_qsort2 (base_ptr=0x1b2176c0, count=4, size=8, cmp=0x869220,cmp_argument=0x4670ea38) at mf_qsort.c:115#1 0x00000000008690ea in my

2011-10-27 11:53:46 4008

原创 erlang的rabbitmq client

rabbitmq-erlang-client函数,命令:amqp_connection:which is used to open connections to a broker and create channelsamqp_channel:which is used

2011-09-23 21:09:10 3401

转载 AMQP协议

AMQP协议AMQP协议是一个异步消息传递所使用的应用层协议规范。又可以称为消息中间件协议。它是定义一个标准的接收及发送机制。它包括消息的路由(exchange)和缓存(queue)两个主要部分。1.体系结构:Producer-client---> exchange-

2011-09-23 21:06:01 4750 2

原创 rpm包的制作及动态库问题

rpm包的制作概要rpm:Redhat Package Manager,是一种二进制的文件,安装(称解压可能更合适,只是它还包括一些数据库的操作,判断依赖关系等)后可以直接运行的软件包,所以它们是平台相关的,即与体系结构操作系统完全一一对应的软件包。本文档主要从以下几个方面进行介绍:l  rpm的简单使用命令l  rpm包的制作流程l  无法找到动态库分析l  rpm包

2011-09-23 16:59:54 8229

转载 转:linux gcc 编译时头文件和库文件搜索路径

转自:http://blog.csdn.net/rlj021/archive/2008/12/16/3530939.aspx一、头文件  gcc 在编译时寻找所需要的头文件 :  ※搜寻会从-I开始  ※然后找gcc的环境变量 C_INCLUDE_

2011-09-16 20:25:08 190

原创 mysql join

mysql的join就一个算法nest loop。本文是我学习该算法的一个分享文档。本文我分析学习了mysql的join过程也就是Nest Loop,其涉及的主要函数包括sub_select、evaluate_join_record、do_select、optimize。这里先看一下bt(select *from a join b on a.id=b.id where a.name='ab

2011-08-13 11:25:44 4919 2

c语言常用算法源代码

c语言常用算法源代码,包含了常见的各种算法的C语言源码。对于学习分析算法很有帮助。

2010-02-24

linux常用命令.chm

linux常用命令,很使用,linux下挂载windows ntfs分区,Linux分区的命名

2008-12-27

空空如也

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

TA关注的人

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