Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1237377
  • 博文数量: 389
  • 博客积分: 2874
  • 博客等级: 少校
  • 技术积分: 3577
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-24 10:34
文章分类

全部博文(389)

文章存档

2020年(2)

2018年(39)

2017年(27)

2016年(3)

2015年(55)

2014年(92)

2013年(54)

2012年(53)

2011年(64)

分类: LINUX

2017-12-19 17:40:35

1、为什么hugepage是不可swapable
交换子系统仅能处理基本页面大小(4K),因此不能交换较大的页面。

2、为什么transparent hugepages  (THP)能够swapable
THP能够将hugepage分割成基本页面(4K,然后再进行交换。

3、内存大页适用范围
程序耗费内存较大(G级别)并且乱序访问

4、内存大页如何提高性能
通过增大操作系统页的大小来减小页表,从而避免TLB缺失

5、如何启用透明大页
centos7默认启用透明大页功能,所以不用设置
检查和设置方法:
cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
参考:

6、设置系统使用多少大页
centos7虽然默认启用大页,但是查看/proc/meminfo会看到:
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0

该部分需要在系统启动时通过kernel参数设置:
Documentation/kernel-parameters.txt
 hugepages=      [HW,X86-32,IA-64] HugeTLB pages to allocate at boot.
        hugepagesz=     [HW,IA-64,PPC,X86-64] The size of the HugeTLB pages.
                        On x86-64 and powerpc, this option can be specified
                        multiple times interleaved with hugepages= to reserve
                        huge pages of different sizes. Valid pages sizes on
                        x86-64 are 2M (when the CPU supports "pse") and 1G
                        (when the CPU supports the "pdpe1gb" cpuinfo flag)
                        Note that 1GB pages can only be allocated at boot time
                        using hugepages= and not freed afterwards.


6、编程时使用内存大页
网上找到两种方法,第一种方法不管用。
1)通过
madvise函数建议内核如何处理地址范围内的内存

点击(此处)折叠或打开

  1. #include <sys/mman.h>

  2. // Allocate a large amount of memory for which you have some use
  3. size_t size = 256*1024*1024;
  4. char* mymemory = malloc(size);
  5. // Either just enable hugepages ...
  6. madvise(mymemory, size, MADV_HUGEPAGE);
  7. // ... or also tell the
  8. madvise(mymemory, size, MADV_HUGEPAGE | MADV_SEQUENTIAL)
参考:
2)mmap

点击(此处)折叠或打开

  1. #include <sys/mman.h>
  2. #include <stdio.h>
  3. #include <memory.h>
  4.  
  5. int main(int argc, char *argv[]) {
  6.   char *m;
  7.   size_t s = (8UL * 1024 * 1024);
  8.  
  9.   m = mmap(NULL, s, PROT_READ | PROT_WRITE,
  10.                     MAP_PRIVATE | MAP_ANONYMOUS | 0x40000 /*MAP_HUGETLB*/, -1, 0);
  11.   if (m == MAP_FAILED) {
  12.     perror("map mem");
  13.     m = NULL;
  14.     return 1;
  15.   }
  16.  
  17.   memset(m, 0, s);
  18.  
  19.   printf("map_hugetlb ok, press ENTER to quit!\n");
  20.   getchar();
  21.  
  22.   munmap(m, s);
  23.   return 0;
  24. }
上面的代码通过查看/proc/meminfo 可以看到hugepage free的数量确实减少了。
参考:http://blog.yufeng.info/archives/2118

7、内存大页和透明大页的区别
透明大页管理和标准大页管理都是操作系统为了减少页表转换消耗的资源而发布的新特性,虽然Oracle建议利用大页机制来提高数据库的性能,但是Oracle却同时建议关闭透明大页管理。这二者的区别在于大页的分配机制,标准大页管理是预分配的方式,而透明大页管理则是动态分配的方式。
阅读(1756) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~