- 博客(66)
- 资源 (2)
- 收藏
- 关注
原创 TCMalloc分析笔记(gperftools-2.4)
TCMalloc是专门对多线并发的内存管理而设计的,TCMalloc主要是在线程级实现了缓存,使得用户在申请内存时大多情况下是无锁内存分配。整个 TCMalloc对小内存(小于等于256k)的管理实现了三级缓存,分别是ThreadCache(线程级缓存),Central Cache(中央缓存:CentralFreeeList),PageHeap(页缓存)。小内存的分配和释放流程如下图所示,红线
2015-04-18 15:15:45
5210
1
原创 MongoDB查询
返回所有的键find()> db.users.find(){ "_id" : ObjectId("5518ae1b1d802f6252d90e7b"), "emails" : [ "joe@example.com", "joe@gmail.com", "joe@yahoo.com", "joe@hotmail.com", "joe@php.net", "
2015-03-31 19:06:10
810
原创 MongoDB更新操作
插入文档操作db.foo.insert({"bar": "baz"})删除文档操作删除所有的数据:db.foo.remove()删除指定的数据db.foo.remove({"bar": "baz"})更新文档操作
2015-03-31 19:01:59
701
原创 nanomsg pair tcp SERVER端各个模块的状态
下面这个图描述了nanomsg PAIR协议基于TCP传输的SERVER端的连接建立的各个模块的状态变化.
2015-03-24 18:48:10
2408
原创 nanomsg: 协议NN_PAIR, TCP的SERVER端数据结构
下面这个图描述了nanomsg在NN_PAIR协议,基于TCP传输的各个模块之间的数据结构关系
2015-03-24 18:43:12
3383
原创 InnoDB INODE 页结构
1. Inode是用来管理一个段的,简单说,一个Inode就是代表一个数据段.Inode可以说是一个结构体,它也是像上面一样,按顺序存储到Inode页面中,一个Inode页面可以存储多个Inode节点.如果页面中所有的空间都用来存放已经使用的Inode,则这个页面就称为满Inode页面,否则为半满Inode页面.2. 当表空间的FSP_SEG_INODES_FREE中没有空闲的IN
2015-03-23 19:22:28
2245
原创 InnoDB 锁数管理据结构
对于表锁, InnoDB一般只是获取意向锁(意向共享锁LOCK_IS和意向排它锁LOCK_IX),一般不会去获取共享锁(LOCK_S)和排它锁(LOCK_X)。除非明确的执行LOCK TABLE 命令。一个例外是在在线ALTER TABLE命令的准备阶段,一个表将会被共享锁(LOCK_S) 锁住。Lock bitmap用于表示行锁,紧邻lock struct存放,每bit代表页内1行数据,使用he
2015-03-23 18:53:40
719
原创 InnoDB 死锁检测实现
InnoDB的死锁检测是通过等待图(Wait-For-Graph)的算法实现的,即检查所有在一个锁上等待的事务是否已经成环;如果成环了说明已经出现死锁,根据一定的策略将某个事务回退将环切断而解除死锁。 死锁的检测时机是在将事务加入等待队列是检测的(lock_table_enqueue_waiting(表), lock_rec_enqueue_waiting(记录) );死锁
2015-03-23 18:46:42
2305
原创 InnoDB Purge 过程
Purge流程Purge功能:InnoDB由于要支持多版本协议, 因此无论是更新, 删除, 都只是设置记录上的deleted bit标记位, 而不是真正的删除记录. 后续这些记录的真正删除, 是通过Purge后台进程(根据参数srv_n_purge_threads配置, 由下面两个线程中的一个来执行purge: srv_purge_thread(); srv_master_thre
2015-03-23 18:41:28
3676
原创 InnoDB 事务管理页的结构, 包括rollback segment和undo log页
1. 每个事务开始时,都会分配一个ROLLBACK SEG给这个事务(即trx_sys_struct->rseg_array[]数组中的一个元素, 这个数组中的元素由链表[trx_sys->rseg_list]来管理,在链表中选择segment是采用ROUND-ROBIN的方式来。即trx_sys_struct->latest_rseg来指示最新被使用的rollback segment)
2014-09-02 19:28:11
2691
原创 InnoDB double write
InnoDB的double write的作用主要是为了防止部分写失效,即InnoDB默认的页是16k,而磁盘管理的页(即一次写磁盘的大小)一般不是16k,因此InnoDB一次写一个16k页时,操作系统和磁盘要多次写入,这样如果出现异常(断点或OS异常),会导致16k页只能部分写入。因为我们知道在flush buffer cache的时候,其实redo log已经写好了. 为什么还需要担心par
2014-09-02 19:22:49
856
原创 InnoDB Adaptive Hash Index(AHI)
1. InnoDB AHI的作用 InnoDB的适应哈希(AHI)是维护InnoDB叶子页记录的索引键值(或键值前缀)的到叶子节点记录的Hash映射关系。能够根据索引键值(或前缀)定位到记录的地址。这样可以不用再搜索B+树从root到叶子页的路径定位过程。2. InnoDB AHI的维护 为了避免频繁的更新AHI带来性能的开销,InnoDB的AHI不是随时
2014-09-02 19:22:40
1668
原创 InnoDB 页管理结构
1.段段是表空间文件中的主要组织结构,它是物理上的管理物理空间的一个逻辑概念,它是构成索引,表,回滚段的基本元素,创建一个索引(B树)时会同时创建两个段,分别是内节点段和叶子段,内节点段用来管理(存储)B树中非叶子节点(页面)的数据,叶子段用来管理(存储)B树中叶子节点的数据. 一个段由一个INODE节点来管理这个段下面的所有的簇(extend).2.簇
2014-09-02 19:21:16
1457
原创 InnoDB MVCC
MVCC: multiversion concurrency control, 多版本并发控制,它提供基于某个时间的快照,使得对于事务看来,总是可以提供与事务开始时刻相一致的数据。而不管这个事务执行的时间有多长,故在不同事务看来,同一时刻看到的相同的行数据可能是不一样的,即:每一行数据会有多个版本数据(副本)。InnoDB的实现:InnoDB的MVCC主要是根据u
2014-09-02 19:08:00
787
原创 InnoDB行记录格式(compact)
1. 变长字段长度列表 记录非NULL变长字段的长度列表; 并且安装列的循序的逆序进行放置,一列的长度如果小于255,用一字节表示,如果长度长度大于255,则用两字节表示,一字节还是两字节只对一列来讲,如果一行中既有大于255,也有小于255的,则大于255用两字节,小于255则用一字节。从分析文件的十六进制来看,如果大于255,则高字节的最高位是1. 还需要分析代码是否高位都是
2014-09-02 18:54:48
2529
原创 MyISAM索引文件头部结构(5.1.40)
MyISAM索引文件的头部结构 域长度(byte) MI_STATE_INFOheader24open_count2changed1sortkey1state.records8state.del8state.del8delli
2013-07-12 15:27:49
851
原创 MYSQL配置文件解析
1. 收集默认的目录: 接口 init_default_directories();主要是下面的目录:"/etc/""/etc/mysql/"环境变量中设置的: MYSQL_HOME当前用户的home目录 : "~/"2. 如果命令行参数中有"--no-defaults"选项, 则将"--no-defaults"选项直接从现有的命令行参数中去掉, 然后直接返回,即不
2013-07-12 15:22:47
1498
转载 LINUX 下安装 dropbox
https://www.dropbox.com/install?os=lnxInstall Dropbox via command lineThe Dropbox daemon works fine on all 32-bit and 64-bit Linux servers. To install, run the following command in
2013-07-03 10:38:23
905
原创 Redis定时器
Redis有很多需要周期性执行的任务: 统计内存使用最高值,记录数据库的使用情况,对哈希表进行resize(如果哈希表的使用率小于10%时,需要对哈希表进行压缩),检查客户端连接是否超时,保存数据库到磁盘,检查key是否过期并删除,主备数据同步删除异步关闭的客户端;运行集群定时任务;运行定时监视任务;. . . 这些周期性任务是由REDIS自己来维护定时器机
2013-05-13 17:45:09
7003
原创 集合(REDIS_SET)
第一个添加到集合的元素, 决定了创建集合时所使用的编码:如果第一个元素可以表示为 long long 类型值(也即是,它是一个整数, 接口isObjectRepresentableAsLongLong), 那么集合的初始编码为 REDIS_ENCODING_INTSET 。否则,集合的初始编码为 REDIS_ENCODING_HT如果一个集合使用 REDIS_ENC
2013-05-10 19:16:38
1061
原创 队列(REDIS_LIST)
命令: lpush mylist "world"创建新队列时 Redis 默认使用 REDIS_ENCODING_ZIPLIST 编码, 当以下任意一个条件被满足时, 队列会被转换成 REDIS_ENCODING_LINKEDLIST编码:试图往队列新添加一个字符串值,且这个字符串的长度超过 server.list_max_ziplist_value(默认值
2013-05-09 19:34:09
1018
原创 有序集合(REDIS_ZSET)
命令command key score valuezadd myzset 1 "one"key是作为db最上层字典索引的key;保存到底层的是score和value1. 如果第一个元素符合以下条件的话, 就创建一个 REDIS_ENCODING_Z
2013-05-09 19:19:12
2635
原创 哈希表(REDIS_HASH)
哈希表(REDIS_HASH)默认是用ziplist(REDIS_ENCODING_ZIPLIST)对象(redisObject)来保存数据的,只有key或value的长度超过server.hash_max_ziplist_value(默认64);或者ziplist存储的对象(entry)超过了server.hash_max_ziplist_entries(默认512)时,就对这个ziplist对
2013-05-09 19:13:24
2006
原创 REDIS跳表(skiplist)
一个跳表,应该具有以下特征:一个跳表应该有几个层(level)组成;跳表的第一层包含所有的元素;每一层都是一个有序的链表;如果元素x出现在第i层,则所有比i小的层都包含x;跳表的插入过程如下; 蓝色线表示查找插入位置的过程,红色的都要记录在一个update[]数组中(反序的方式来记录,即从最高的level开始),即level变化时就需要记录下来,主要是为了后续插入后
2013-05-07 19:12:36
1811
原创 REDIS字典(dict)
REDIS用字典来实现键值的空间, 底层是由动态哈希来实现; 字典的结构如下面的图 在字典中有两个哈希桶来实现哈希的扩展; 在没有对哈希进行扩张和rehash的情况下, 只有ht[0]来保存数据库的键值; 在对哈希表进行扩展和rehash时,首先会将哈希桶扩大2倍,挂到ht[1]的哈希桶下面,并将rehashidx置为0(表示开始从哈希桶的第一个桶开始进行rehash),然后逐渐将ht
2013-05-07 09:18:03
958
原创 双向链表(REDIS)
REDIS的双向链表和一般的双向链表差不多,一个链表有一个链表头(list)来管理一个链表(listNode)。只是在链表头中增加了几个操作函数。链表头:typedef struct list { // 表头指针 listNode *head; // 表尾指针 listNode *tail; // 节点数量 unsig
2013-05-07 09:08:39
1040
原创 动态字符串(REDIS)
// sdshdr 结构struct sdshdr { // buf 已占用长度 int len; // buf 剩余可用长度 int free; // 实际保存字符串数据的地方,会分配多一个字节用于存放'\0'; char buf[];};REDIS的字符串一般保存在以sdshdr为头的结
2013-05-06 18:09:23
801
原创 TCP发包客户端,可用于性能测试
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /*由于微秒定时器在计算机上精度是不准确的, 发送数据包
2013-04-25 19:41:26
2739
原创 多线程网络处理服务器demo
#include #include #include #include #include #include #include #include #include #include //#include //#include #include #include #include #include #include #include //#define DEBUG
2013-04-25 19:37:17
1312
原创 一个基于线程池的网络处理服务器demo
#include #include #include #include #include #include #include #include #include #include //#include //#include #include #include #include #include #include #include //#define DEBUG
2013-04-25 19:29:30
1157
原创 B树的实现
#include #include #define MIN_DEGREE (3)#define MAX_KEY (2*MIN_DEGREE -1 )#define true 1#define false 0#define NO_KEY 0typedef int bool;//B树节点结构typedef struct BTreeNode{//当前存储的数据个数
2013-04-25 19:23:53
777
原创 NGINX模块的功能
未完待续:有几个阶段是特例,它不调用挂载地任何的handler,也就是你就不用挂载到这几个阶段了NGX_HTTP_FIND_CONFIG_PHASENGX_HTTP_POST_ACCESS_PHASENGX_HTTP_POST_REWRITE_PHASENGX_HTTP_TRY_FILES_PHASE只有下面这几个phase会有多个handler,剩余的都是
2013-04-23 10:12:44
803
原创 LVS DR模式配置
arp_ignore:定义对目标地址为本地IP的ARP询问不同的应答模式0 0 - (默认值): 回应任何网络接口上对任何本地IP地址的arp查询请求 1 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求 2 -只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内 3 - 不回应该网络界面的arp请求,而只对
2013-04-23 09:59:58
1078
原创 berkeleydb 1.86 页面结构
typedef struct _page {//用于记录内存页的信息,位于页面的开头部分,含有 7 个成员变量 pgno_t pgno; /* this page's page number 页面编号*/ pgno_t prevpg; /* left sibling 左兄弟*/ pgno_t nextpg; /* right sibling 右兄弟*/#define P_BI
2013-04-12 18:19:12
831
原创 广度优先搜索
从某源顶点触发,将源顶点置为GRAY,将源顶点入队列,第一个顶点出队列,反问这个顶点的所有相邻顶点,如果相邻顶点是WHITE,则入队列,并置为GRAY,将本顶点置为BLACK. 取出队列的第一个顶点,继续上述步骤:#include #include #include "AdjacencyListGraph.h"#include "Array_queue.h"#defin
2013-04-11 19:17:08
612
原创 最小二项堆
最小二项堆:1. 节点的关键字(key)大于或等于父节点的关键字.2. degree表示子女的个数3. slibing指向紧右的兄弟结点,最右节点的slibing为NIL.4. 二项堆的根节点组织成一个链表(有slibing连接): 根表5. parent指向父节点,根节点的parent为NIL6.child指向左边第一个子节点7. head指向度数(d
2013-04-10 18:39:32
1248
原创 NGINX避免惊群和负载均衡
NGINX避免epoll_wait出现惊群比较简单,就是NGINX自己维护一个互斥变量ngx_accept_mutex; 每次需要从端口接收数据前都要尝试取获取(ngx_trylock_accept_mutex)这个互斥量;如果获得了就将本进程的监听句柄增加到epoll_wait等待队列中;这样就保证了每次都只有一个经常处于监听事件等待队列中,如果有新的连接进来也操作系统也只会唤醒一个进程取处理.
2013-04-06 16:06:05
849
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人