twemproxy-内存管理机制

官方对内存管理方面介绍如下:

在twemproxy中,请求进入和响应输出的所有内存都在mbuf中进行分配。mbuf启用零拷贝,因为客户端接收请求使用到的内存结构,后端服务器可以复用。同样,从服务器端接收响应时使用的mbuf,也可在客户端复用。

此外,使用重用池管理mbuf的内存。这就是说:一旦分配了mbuf,它就不会被释放,而只是重新进入重用池。默认情况下,每个mbuf块的大小设置为16K。在mbuf大小和twemproxy可以支持的并发连接数之间需要进行权衡。较大的mbuf可以减少读取请求或响应时twemproxy系统调用的次数。但是,对于大的mbuf,每个活动的连接将使用16K的缓冲区,这可能让twemproxy在处理来自客户端的大量并发连接时存在问题。当twemproxy用于处理大量并发客户端连接时,应使用-m或–mbuf-size = N参数将块大小设置为512字节的小值。

总结如下:

twemproxy通过mbuf结构来管理内存,默认申请的内存块大小是16K。
内存结构是复用的。
在有大量客户端进行并发连接时,若使用默认的内存块大小可能存在问题,需要通过参数进行设置。

内存池(mbuf)核心主要在nc_mbuf.ch中。

基本数据结构
mbuf的数据结构:

struct mbuf {
uint32_t magic; /* mbuf magic (const) mbuf的随机数,一个常量值,一般是0xdeadbeef 十六进制数*/
STAILQ_ENTRY(mbuf) next; /* next mbuf 下一块mbuf,代码里所有的mbuf几乎都是以单向链表的形式存储的   下一个mbuf节点*/
uint8_t *pos; /* read marker 表示这块mbuf已经读到那个字节了   mbuf中数据的位置*/
uint8_t *last; /* write marker 表示这块mbuf已经写到哪个字节   mbuf中目前数据的结束位置*/
uint8_t *start; /* start of buffer (const) 表示这块mbuf的起始位置   mbuf中内存块的开始位置(指针)*/
uint8_t *end; /* end of buffer (const) 表示这块mbuf的结束位置       mbuf中数据内存区的结束位置(指针)*/
};



STAILQ_HEAD(mhdr, mbuf); /*mhdr是mbuf单向队列的队列头部*/

mbuf内部采用单向尾队列(STAILQ)作为存储结构;mbuf定义了一个struct mhdr类型的STAILQ单向尾队列,队列通过两个mbuf类型的指针stqh_first和stqh_last将若干个mbuf类型的元素串连起来,形成一个链表队列。

/*
 * Singly-linked Tail queue declarations.
 */
#define STAILQ_HEAD(name, type)                                         \
struct name {                                                           \
    struct type *stqh_first; /* first element */                        \
    struct type **stqh_last; /* addr of last next element */            \
}

twemproxy会设置两个静态变量来控制mbuf,一个用来记录空闲mbuf的数量,一个是空闲mbuf列表头结构,这两个变量的定义如下:

static uint32_t nfree_mbufq;   /* # free mbuf */ /* 空闲mbuf的数量,初始化为0 */
static struct mhdr free_mbufq; /* free mbuf q */ /* 空闲mbuf列表头结构 */

mbuf的创建
mbuf创建时会先申请一个chunk_size的内存块,然后把该mbuf的结构作为头,放在该数据块的最后。官方给出的理由是:这样安排可以让我们在进行put或get操作时尽早的知道内存越界。

mbuf结构创建初始化状态:

创建一个mbuf后的初始化状态下的内存布局和指针指向如下图所示:

mbuf data部分为可用空间,mbuf header用来记录struct mbuf;

在这里插入图片描述
加入一些数据后的状态如下:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值