有些时候大家可能觉得Linux系统刚刚启动的时候没什么操作,为什么这么耗内存。最最常见的回答就是Linux会将很多的东西cache到内存当中。这么说是笼统的。
linux的cache有很多种,linux之所以这么消耗内存,主要是内核的设计即使如此。
我总结了一下,主要有两个大类:
1.slab会先从内存当中申请一些内存,以备内核申请一个核心数据结构的时候能够快速得到满足,提高内核申请一些关键数据结构的效率。
2.page cache,将常常需要访问的文件及数据块cache到内存当中,这样访问文件的时候就不会每次都访问磁盘。效率大大的增加了。
同时我们也可以发现有些时候,zfs on linux 这个zfs消耗内存也比较大。
那是由于zfs需要copy on write,那么copy的操作,肯定是copy到内存当中,也就是常说的dbuf。而dbuf有几种状态,从UNCACHED 变到CACHED的状态的时候,需要从内存中申请,以备copy操作使用。
另外一点就是由于他的dbuf经常会申请和释放,所以zfs会在刚刚创建的时候就申请大量的内存,建立几个缓冲区,
- kmem_cache_t *zio_cache;
- kmem_cache_t *zio_link_cache;
- kmem_cache_t *zio_vdev_cache;
- kmem_cache_t *zio_buf_cache[SPA_MAXBLOCKSIZE >> SPA_MINBLOCKSHIFT];
- kmem_cache_t *zio_data_buf_cache[SPA_MAXBLOCKSIZE >> SPA_MINBLOCKSHIFT];
然后dbuf如果需要申请内存,根据arc buffer的类型,如果dbuf中存放的是数据 那么就从zio_data_buf_cache当中申请,如果申请的内容是meta data,那么就可以从zio_buf_cache当中申请。
这就是linux及sun 的zfs为什么这么消耗内存的原因了。
阅读(4763) | 评论(0) | 转发(0) |