最近因为项目需要仔细看了memcached的相关资料,这里整理下,备忘。
1、memcached开始支持多线程,
2、使用自己的内存分配策略,而不是系统的malloc方法。目的减少内存碎片。
系统的malloc分配等尺寸的内存片,必将导致内存浪费,从而出现碎片。(题外话,这个分配方案可以作为操作系统的磁盘空间分配方案,现在windows系统使用等尺寸的最小单元存储,经常性产生碎片,磁盘利用率低)。
将内存切割为大小相等的slab,每个slab中划分大小不等的trunk,当客户端请求save数据时,系统会从这些trunk中找一个尺寸与其最接近的trunk保存。
3、memcached存储的一个Item的最尺寸有上限,超过这个上限不是不能存储,而是将导致性能打折扣严重。读取一个数据需要搜索两个trunk。
4、存储ByteCode还是序列化对象?
在java体系同,可以将基本类型的信息用bytecode形式保存在cache中,也可以用java的对象形式保存在cache中。int i=4 需要4个字节,而其对象需要64个字节,节约16倍内存。为什么有这样的差别呢?因为cache保存对象时,首先要调用Java系统的序列话过程,它将整 个对象信息用bytecode表示,显然其占用空间比只有表达值的bytecode多很多。
实现上面逻辑的方法就是实现对象的外部序列化,只需要用bytecode表示值。不使用系统自己的序列化方法(序列化对象)。
有一个minix项目使用该技术优化前占用memcached内存为1.152G,优化后,空间只需要144M,可见这样的优化效果非常的理想,节约了宝贵的资源(虽然内存已经很便宜,但是在高并发系统中,内存还是非常珍贵的)。
5、memcached的进程监控
我们经常会发现有些时候memcached会因为一些原因停止工作deamonTools工具可以监控进程,当进程将死、意外退出,他会即时重新启动memcached进程,从而减少应用中断时间,减少系统性能抖动,减少故障恢复时间。