内存变大后,索引表占了很大内存,tlb命中率也下降。
考虑从两点下手:
- 修改页框大小
- 使用大页内存
修改页框大小
kernel 2.6.30 menuconfig中没有页框大小配置项,这个版本还没有加入修改页框大小的功能。
找到page_types.h
1 |
12就是4KB,打算修改成16即64KB。
修改后,编译失败。
大页内存
2.6.30支持大页内存,一般通过mount -t hugetlbfs和mmap来利用,但这导致需要修改不少程序代码。
还有一点就是程序使用的是否使用大量连续内存,否则会导致大量碎内存,使用内存池解决更好。
想不修改程序代码,考虑使用libhugetlbfs.so替换系统alloc。
这里又发现libhugetlbfs代码下的tests在2.6.30下编译不通过。原来是tests目录下一个文件打洞的标记此版本内核不支持(吐槽一下,官方doc写支持此版本,编译都不测一下吗)。反正是tests,冒险一下,先干掉。ok,编译通过。
又一坑。。。程序使用了tcmalloc,已经替换了一次malloc,所以这里还要在tcmalloc里写一个新的大页内存的malloc。