- 论坛徽章:
- 0
|
FreeBSD4.11的kern_malloc.c的kmeminit()函数:
- /*
- * Try to auto-tune the kernel memory size, so that it is
- * more applicable for a wider range of machine sizes.
- * On an X86, a VM_KMEM_SIZE_SCALE value of 4 is good, while
- * a VM_KMEM_SIZE of 12MB is a fair compromise. The
- * VM_KMEM_SIZE_MAX is dependent on the maximum KVA space
- * available, and on an X86 with a total KVA space of 256MB,
- * try to keep VM_KMEM_SIZE_MAX at 80MB or below.
- *
- * Note that the kmem_map is also used by the zone allocator,
- * so make sure that there is enough space.
- */
- vm_kmem_size = VM_KMEM_SIZE;
- mem_size = cnt.v_page_count * PAGE_SIZE;
- #if defined(VM_KMEM_SIZE_SCALE)
- if ((mem_size / VM_KMEM_SIZE_SCALE) > vm_kmem_size)
- vm_kmem_size = mem_size / VM_KMEM_SIZE_SCALE;
- #endif
- #if defined(VM_KMEM_SIZE_MAX)
- if (vm_kmem_size >= VM_KMEM_SIZE_MAX)
- vm_kmem_size = VM_KMEM_SIZE_MAX;
- #endif
- /* Allow final override from the kernel environment */
- TUNABLE_INT_FETCH("kern.vm.kmem.size", &vm_kmem_size);
复制代码
因此,全局变量vm_kmem_size最终依据的是内核参数kern.vm.kmem.size。我的4.11虚拟机默认情况下的vmstat -m的输出信息是:
- Memory statistics by type Type Kern
- Type InUse MemUse HighUse Limit Requests Limit Limit Size(s)
- linux 8 1K 1K 25970K 8 0 0 32
- atkbddev 2 1K 1K 25970K 2 0 0 32
- uc_devlist 30 3K 3K 25970K 30 0 0 16,2K
复制代码
在/boot/loader.conf文件中添加如下一行(将kern.vm.kmem.size设置为缺省值的两倍):
- kern.vm.kmem.size="106373120"
复制代码
重启系统后的vmstat -m的输出信息是:
- Memory statistics by type Type Kern
- Type InUse MemUse HighUse Limit Requests Limit Limit Size(s)
- linux 8 1K 1K 51940K 8 0 0 32
- atkbddev 2 1K 1K 51940K 2 0 0 32
- uc_devlist 30 3K 3K 51940K 30 0 0 16,2K
- ......
复制代码
这样做至少解决了你所说的“好像不能用sysctl调节?”的问题,前提是此limit即彼limit。至于在实际分配中是否有效,只有等你自己去验证了!^_^
[ 本帖最后由 雨丝风片 于 2007-1-10 07:59 编辑 ] |
|