Colderleo's blog Colderleo's blog
首页
Linux
C++
Python
前端
工具软件
mysql
索引
关于
GitHub (opens new window)

Colder Leo

热爱代码的打工人
首页
Linux
C++
Python
前端
工具软件
mysql
索引
关于
GitHub (opens new window)
  • 常见程序性能开销cost、latency延迟耗时的经验值
  • 面试常见问题
  • 静态链接-动态链接-elf详解-elfloader
  • 动态库和静态库的依赖问题
  • glibc和ld的编译调试-为某程序单独设置ld
  • dl_iterate_phdr遍历linkmap头、获取so加载地址
  • shell、bash语法和脚本模板
  • so文件查找路径
  • 逻辑地址-线性地址or虚拟地址-物理地址
  • 通过ELF读取当前进程的符号表并获取符号的版本信息
  • 虚拟内存,cache,TLB,页表
  • 用户内存空间分布和mmap
  • numa网卡绑定
  • 隔核绑核、服务器优化
  • popen底层原理和仿照实现-execl
  • tmux用法
  • ASLR机制
  • 程序后台运行、恢复前台nohup
  • 大页内存huge_page
    • 标准大页和透明大页
    • 标准大页
      • 查看系统保留的大页内存数量
      • 设置大页内存数量为192
      • 使能透明大页
      • 查看大页使用情况
      • 查看某个进程的大页使用情况
      • mount hugetlbfs
      • 相关项目
      • 代码
      • 内核中mmap关于 MAP_HUGETLB 的合法性校验
    • 透明大页THP Transparent Huge Page
  • 用perf查看page-fault
  • Bash设置显示全部路径
  • 查看socket fd状态,设置nonblock
  • cout输出到屏幕的过程
  • 多进程写同一文件-write原子性-log日志
  • vim用法
  • epoll用法
  • signal信号、软中断、硬中断、alarm
  • 内核模块
  • 读写锁之pthread_rwlock和内核rwlock自旋读写锁
  • systemtap
  • xargs、awk用法
  • openssl libssl.so.10.so缺失问题
  • netstat用法
  • fork函数
  • tcp延迟确认ack
  • 90.centos7上一次std-string编译错误定位
  • docker用法
  • find用法
  • dmesg
  • gcc编译用法
  • avx-sse切换惩罚
  • Centos7防火墙
  • chmod用法
  • kernel-devel安装版本
  • Linux-Centos7系统安装、网络设置、常见报错
  • linux下g++编译c++文件
  • MegaCli 安装及使用
  • mysql
  • mysql忘记密码修改方法
  • set用法
  • crontab
  • ssh传文件scp
  • ssh连接
  • tcpdump、tshark、tcpreplay用法
  • ubantu root登录以及创建新用户
  • ubuntu安装g++和gdb
  • uClibc编译失败解决方法
  • win10安装WSL open-ssh
  • yum升级git
  • 比较so文件版本-md5sum
  • 查看磁盘信息
  • 合并两个硬盘,挂载到一个文件夹下
  • 软件安装目录usr-local-src
  • 下载centos历史版本
  • sh脚本转可执行文件、加密
  • Linux
gaoliu
2022-03-14
目录

大页内存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

配置

echo always >  /sys/kernel/mm/transparent_hugepage/enabled

echo 1 > /proc/sys/vm/overcommit_memory:
1
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

# 相关项目

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

# 内核中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

# 透明大页THP Transparent Huge Page

pass

编辑 (opens new window)
上次更新: 2023/05/07, 17:27:54
程序后台运行、恢复前台nohup
用perf查看page-fault

← 程序后台运行、恢复前台nohup 用perf查看page-fault→

最近更新
01
通过模板实现结构体成员拷贝-按成员名匹配
05-07
02
c++17通过模板获取类成员的个数
05-01
03
avx-sse切换惩罚
04-30
更多文章>
Theme by Vdoing | Copyright © 2019-2023 Colder Leo | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×