memcached内存管理
由于C语言直接 malloc、free 来向操作系统申请和释放内存时,在不断的申请和释放过程中,形成了一些很小的内存片段,无法再利用,这种空闲但无法利用内存的现象,称为内存的碎片化
如何解决内存碎片化
memcached 用 slab allocator 机制来管理内存有刺来解决内存碎片化问题
- 先把内存分成很多个Slab,这个大小是预先规定好的,以解决内存碎片的问题。 分配给Slab的内存空间被称为Page,默认是1M。一个Slab下可以有多个Page
- 然后把一个Page分成很多个chunk块,chunk块是用于缓存记录的空间。Chunk的大小是先有一个基本值,根据增长因子来增大
- slab class:内存区类别(48byte-1M),每个类别有一个slab classId
- Memcached里面保存着slab内空闲的chunk列表,当收到要保存的item的时候,它会根据item的大小,去选择一个最合适的slab,然后找到空闲的chunk,把数据存放进去
memcached 根据收到的数据的大小,选择最适合数据大小的 chunk 组(slab class)。memcached 中保存着 slab class 内空闲 chunk 的列表,根据该列表选择空的 chunk, 然后将数据缓存于其中
如果有 100byte 的内容要存,但 122 大小的仓库中的 chunk 满了,并不会寻找更大的,如 144 的仓库来存储,而是把 122 仓库的旧数据踢掉!
引发的问题
固定大小 chunk 带来的内存浪费,由于 slab allocator 机制中, 分配的 chunk 的大小是”固定”的, 因此,对于特定的 item,可能造成内存空间的浪费,比如,将 100 字节的数据缓存到 122 字节的 chunk 中, 剩余的 22 字节就浪费了,如何解决这个问题呢
可以通过参数来调整各 slab class 中 chunk大小的增长速度,即增长因子, grow factor
增长因子
memcached 在启动时可以通过f 选项指定 Growth Factor 因子,并在某种程度上控制 slab 之间的差异, 默认值为 1.25,但是,在该选项出现之前,这个因子曾经固定为 2,称为”powers of 2” 策略
key 的长度: 250 字节,(二进制协议支持 65536 个字节)
value 的限制: 1m, 一般都是存储一些文本,如新闻列表等等,这个值足够了.