- 博客(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 12523
原创 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 7116 1
原创 innodb事务隔离级别
事务隔离级别SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。Read Uncommitted(读取未提交内容) 在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读
2013-02-28 20:15:08 12724
原创 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 24493
原创 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 22259 1
原创 linux调度器(八)——实时调度与SMP
实时调度器类实时调度类有两类进程:循环进程SCHED_RR:循环进程有时间片,随着进程的运行时间会减少。当时间片用完时又将其置为初值,并将进程置于队列末尾。先进先出SCHED_FIFO:没有时间片调度,运行后可执行任意长时间直到自己放弃CPU。实际上两类进程在相同优先级队列上都是先进先出的,只是一个有时间片一个没有时间片。 现在实时进程的调度其实就是使用之前内核的O(1)
2013-02-06 20:42:45 9493
原创 linux调度器(六)——应用层理解CFS及组调度
上面我们介绍了CFS及组调度相关的主要内容,但可能很多人还跟我一样有点云里雾里的,下面我们直接从应用层面上也查看CFS及组调度的效果。首先对于非组调度,决定它们运行时间的唯一因素就是weight,也就是我们知道的nice,我们可以通过renice来重新调整进程的优先级,然后再使用taskset将它们限定在同一个CPU上(CFS只是保证一个CPU的公平,所以你可以看到一个有趣的现象:如指定两个进程的
2013-02-06 20:38:57 9767 1
原创 linux调度器(五)——进程管理与CFS
进程调度初始化 由于该过程涉及到进程的管理模块,这个模块的详细过程我们将在以后的机会介绍,所以这里,我们主要扣出与调度相关的内容。进程的创建内核入口为do_fork,首先我们简单的看一下它的主要行为:图 do_fork与CFS的交互 上图我们只是画了do_fork最普通的fork操作,及正常的启动状态,上面的三个sched_class函数调用就是
2013-02-06 20:36:24 7065
原创 linux调度器(四)——主调度器与CFS
当内核从系统调用返回,或者从中断处理程序返回,内核都会检查当前进程是否设置了TIF_NEED_RESCHED标志;或者进程主动放弃CPU时(sched_yield,sleep或者收到SIGSTOP,SIGTTOP信号)都会进入主调度器。同样的我们先看一下主调度的框架部分,该部分就是sched.c:schedule(void):关闭内核抢占如果进程之前是不可运行并且被内核抢占了,那么如果它现
2013-02-06 20:33:44 6851 1
原创 linux调度器(三)——周期性调度器与CFS
注:这里并没有详细分析到每个内部函数,如果要了解这些细节的话,可以看后面的OTHER CFS CLASS API及CFS主要的内部函数。 周期性调度器在调度框架上由scheduler_tick完成:在每一个cpu的时钟周期都触发一次该函数调用,它更新运行队列的时钟及load,然后调用当前进程的调度器类的周期调度函数。 update_rq_clock(rq); /* 更新运行队列的时钟rq
2013-02-06 20:29:54 7356
原创 linux调度器(二)——CFS模型
本系列文章阅读的core是:2.6.32-220这里使用“模型”而不是“算法”是因为这东西实在不好用算法描述(但是它却运行得很好,包括性能)。 核心思想: 把CPU总时间按运行队列的所有se的权重分配给每个se。每个se使用cpu的顺序由它们已使用的cpu虚拟时间(vruntime)决定的,已使用的虚拟时间越少,它在运行队列的位置越靠左,那么它再次被调度执行的概率也就越高。
2013-02-06 20:23:30 7738
原创 linux调度器(一)——概述
本次分析的kernel代码为2.6.32-220。并且我们先不考虑SMP。当前linux的调度程序由两个调度器组成:主调度器,周期性调度器(两者又统称为核心调度器);并且每个调度器包括两个内容:调度框架(其实质就是两个函数框架)及调度器类。调度器类是实现了不同调度策略的实例,如 CFS、RT class。它们的关系如下图:图 调度器的组成当前的内核支持两种调度器类(sched_se
2013-02-06 14:08:06 17865
原创 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 10150
原创 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 8049
原创 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 7303
原创 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 5929
原创 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 8195 1
原创 cgroup学习(三)——伪文件
伪文件 cgroup是通过VFS与上层进行交互的,它定义了自己的cgroup文件系统,同时也定义了哪些文件,这些文件也是最终影响着cgroup行为,这一节我们介绍一下,每个子系统的伪文件定义在哪里?以及内核如何去操作这些伪文件。下面我们通过一张表来展示这些关系:SubsysFilesTo_csslocate
2013-01-06 20:13:59 6828
原创 cgroup学习(二)——cgroup框架结构
cgroup框架结构这一章里,我们先整体介绍一个cgroup的框架结构,以及cgroup文件系统的相应文件定义。这里我们先看一下cgroup的主要结构关系: 图2 主要数据结构关系该图包含了cgroup的所有主要数据结构及它们的关系。其中cgroupfs_root相当于我们mount操作指定的dir;cgroup表示在mount目录下的mkdir cg_test;而cgroup
2013-01-06 19:48:33 11643 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 14535
原创 使用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 9288 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 5646 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 3600
原创 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 3230
原创 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 6682 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 1890
原创 redis代码结构之三类型库-string
redis代码结构之三类型库-list 1. 类型库概述下面介绍redis核心的内容以及所支持的数据类型及操作。首先看一下相应的数据结构:typedef char *sds; //该文件返回的基本上都是sds,即char *,也是实际存储内容的地址。struct sdshdr { int len; //内容拥有的空间,不包括该结构的本身的大小,也不包括buf最后的结束符’
2012-01-19 17:37:37 1857
原创 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 101
原创 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 205
原创 redis replication
redis replication//////////////////////////////////////////////// slave /////////////////////////////////////////////1. Slave init方式当前有两种方式:启动一个server通过slaveof mip mport方式来将该server转换为一个slav
2011-12-20 19:43:37 2186
原创 Redis SNAPSHOT的实现
Redis SNAPSHOT上一篇文章我们学习了redis aof的实现.这篇文章我们将学习redis的另一种持久化方式:snapshot(快照)。同上一篇文章一样,我们首先介绍相关参数;然后依次介绍它的使用场景。1. 配置参数save :相对一个DB,多少秒内发生了多少次更新操作,此时就会进行一次保存操作,这个可以设置多个条件,它们中的任一个满足都会保存一次,下面把这个
2011-12-11 17:58:19 2364
原创 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 10608 1
原创 redis学习总结
Redis学习总结redis是一个单线程基于事件机制的一个模型,使用事件处理框架 aeEvent1. 启动过程Reids的启动过程大致如下:1.初始化全局struct server数据结构,给每个成员赋予默认值,并且创建命令表,用于查找相应命令对应的处理函数:initServerConfig()--->populateCommandTable2.如果指定了配置文件,
2011-11-23 21:29:47 5582
原创 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 27554 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 4064
原创 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 3446
转载 AMQP协议
AMQP协议AMQP协议是一个异步消息传递所使用的应用层协议规范。又可以称为消息中间件协议。它是定义一个标准的接收及发送机制。它包括消息的路由(exchange)和缓存(queue)两个主要部分。1.体系结构:Producer-client---> exchange-
2011-09-23 21:06:01 4771 2
原创 rpm包的制作及动态库问题
rpm包的制作概要rpm:Redhat Package Manager,是一种二进制的文件,安装(称解压可能更合适,只是它还包括一些数据库的操作,判断依赖关系等)后可以直接运行的软件包,所以它们是平台相关的,即与体系结构操作系统完全一一对应的软件包。本文档主要从以下几个方面进行介绍:l rpm的简单使用命令l rpm包的制作流程l 无法找到动态库分析l rpm包
2011-09-23 16:59:54 8348
转载 转:linux gcc 编译时头文件和库文件搜索路径
转自:http://blog.csdn.net/rlj021/archive/2008/12/16/3530939.aspx一、头文件 gcc 在编译时寻找所需要的头文件 : ※搜寻会从-I开始 ※然后找gcc的环境变量 C_INCLUDE_
2011-09-16 20:25:08 210
原创 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 4970 2
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人