中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助
鲲鹏小智

调整内存页的大小

原理

TLB(Translation lookaside buffer)为页表(存放虚拟地址的页地址和物理地址的页地址的映射关系)在CPU内部的高速缓存。TLB的命中率越高,页表查询性能就越好。

TLB的一行为一个页的映射关系,也就是管理了一个页大小的内存:

TLB管理的内存大小 = TLB行数 * 内存的页大小

同一个CPU的TLB行数固定,因此内存页越大,管理的内存越大,相同业务场景下的TLB命中率就越高。

修改前后可以通过如下命令观察TLB的命中率($PID为进程ID):

perf stat -p $PID -d -d -d

输出结果包含如下信息,其中1.21%和0.59%分别表示数据的miss率和指令的miss率。

1,090,788,717      dTLB-loads                #  520.592 M/sec
13,213,603      dTLB-load-misses             #    1.21% of all dTLB cache hits
669,485,765      iTLB-loads                 #  319.520 M/sec
3,979,246      iTLB-load-misses              #  0.59% of all iTLB cache hits

修改方式

  • 调整内核内存页大小
  • 设置内存大页
  • 设置透明大页

设置内核内存页大小

修改Linux内核的内存页大小,需要在修改内核编译选项后重新编译内核(详情可参考内核源码编译安装),简要步骤如下所示:

  • 执行make menuconfig
  • 选择PAGESIZE大小为64K

    Kernel Features-->Page size(64KB)

  • 编译和安装内核

设置内存大页

  • 在内核启动阶段设置

    可参考kernel-parameters设置如下内核启动参数:

    参数

    说明

    hugepages

    定义启动时内核中配置的内存大页的数量。

    hugepagesz

    定义启动时在内核中配置的内存大页的大小。

    default_hugepagesz

    定义启动时在内核中配置的内存大页的默认大小。

  • 在运行时设置

    设置node中2 MB大页的数量为20。

    # echo 20 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages

设置透明大页

透明大页是以上内存大页的升级版,使用透明大页,内核会自动为进程分配大页,因此无需手动保留大页。

设置/sys/kernel/mm/transparent_hugepage/enabled的值为:

参数

说明

always

在整个系统范围内启用THP,如果有进程大量使用连续的虚拟内存,则内核会尝试将大页分配给该进程。

madvise

内核仅将大页分配给madvise()系统调用指定的单个进程的内存区域。

never

禁用透明大页。

例如关闭透明大页的设置方法:

# echo never > /sys/kernel/mm/transparent_hugepage/enabled

操作系统还有很多内存参数可以调整,具体参考常用操作系统内存参数说明

搜索结果
找到“0”个结果

当前产品无相关内容

未找到相关内容,请尝试其他搜索词