大页内存huge_page
# 标准大页和透明大页
https://blog.csdn.net/cpongo3/article/details/88798139 (opens new window)
大页内存分为标准大页和透明大页
# 标准大页
https://blog.csdn.net/crazycoder8848/article/details/44983265 (opens new window)
# 查看系统保留的大页内存数量
cat /proc/sys/vm/nr_hugepages
# 设置大页内存数量为192
echo 192 > /proc/sys/vm/nr_hugepages
# 使能透明大页
参考tcmalloc调优文档: https://google.github.io/tcmalloc/tuning.html#system-level-optimizations (opens new window)
/sys/kernel/mm/transparent_hugepage/enabled:
[always] madvise never
/sys/kernel/mm/transparent_hugepage/defrag:
always defer [defer+madvise] madvise never`
/sys/kernel/mm/transparent_hugepage/khugepaged/max_ptes_none:
511
/proc/sys/vm/overcommit_memory:
1
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
配置
echo always > /sys/kernel/mm/transparent_hugepage/enabled
echo 1 > /proc/sys/vm/overcommit_memory:
1
2
3
2
3
# 查看大页使用情况
cat /proc/meminfo | grep -i huge
# 查看某个进程的大页使用情况
cat /proc/pid/smaps | grep -i huge
# mount hugetlbfs
mkdir -p huge_pages
mount -t hugetlbfs none huge_pages -o pagesize=2048K
1
2
2
# 相关项目
libhugetlbfs hugectl
# 代码
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <errno.h>
#include <sys/mman.h>
#include <stdlib.h>
#include <unistd.h>
#define ERR_DBG_PRINT(fmt, args...) \
do \
{ \
printf("ERR_DBG:%s(%d)-%s:\n"fmt": %s\n", __FILE__,__LINE__,__FUNCTION__,##args, strerror(errno)); \
} while (0)
/* mmap方式可以使用指定尺寸的巨页池 */
int main(int argc, char *argv[])
{
const char *fname = "huge_pages/page1.txt";
int ret = system("mkdir -p huge_pages");
ret = system("mount -t hugetlbfs none huge_pages -o pagesize=2048K");
int fd = open(fname, O_CREAT | O_RDWR, 0755);
// char *huge_mem = (char *)mmap(NULL, 2048*1024*5, (PROT_READ | PROT_WRITE), MAP_SHARED, fd, 0);
// fix addr.
char *huge_mem = (char *)mmap((void *)0x7ff000000000, 2048*1024*5, (PROT_READ | PROT_WRITE | PROT_EXEC),
MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED|MAP_HUGETLB, fd, 0);
if (ret<0)
{
ERR_DBG_PRINT("mount fail:");
return 0;
}
if (fd<0)
{
ERR_DBG_PRINT("open fail:");
return 0;
}
if (-1 == (int)(unsigned long)huge_mem)
{
ERR_DBG_PRINT("mmap fail:");
return 0;
}
printf("press any key to access huge page\n");
getchar();
memset(huge_mem, 0, 2048*1024*5);
printf("press any key to delete huge page\n");
getchar();
/* 下面代码一执行,内存就释放回巨页池了 */
if (unlink(fname)==-1)
ERR_DBG_PRINT("unlink fail:");
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# 内核中mmap关于 MAP_HUGETLB 的合法性校验
https://stackoverflow.com/questions/70386773/how-to-implement-map-hugetlb-in-a-character-device-driver
MAP_ANONYMOUS 表明该 The mapping is not backed by any file; its contents are initialized to zero.
对于mmap,当指定了MAP_HUGETLB时,要么是MAP_ANONYMOUS, 要么是该文件被mount在hugetlbfs上
if (!(flags & MAP_ANONYMOUS)) { // <== File-backed mapping?
audit_mmap_fd(fd, flags);
file = fget(fd);
if (!file)
return -EBADF;
if (is_file_hugepages(file)) { // <== Check that FS is hugetlbfs
len = ALIGN(len, huge_page_size(hstate_file(file)));
} else if (unlikely(flags & MAP_HUGETLB)) { // <== If not, MAP_HUGETLB isn't allowed
retval = -EINVAL;
goto out_fput;
}
} else if (flags & MAP_HUGETLB) { // <== Anonymous MAP_HUGETLB mapping?
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 透明大页THP Transparent Huge Page
pass
编辑 (opens new window)
上次更新: 2023/05/07, 17:27:54