性能优化特性之:code_hugepage - 代码大页

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
EMR Serverless StarRocks,5000CU*H 48000GB*H
简介: 本文介绍了倚天实例上的内存优化特性:代码段大页,并从优化原理、使用方法、性能收益进行详细阐述。

优化原理

代码大页特性主要为大代码段业务服务,可以降低程序的iTLB miss,从而提升程序性能。

使用方法

在Alinux3/Anolis8上,该特性默认是关闭的。可以使用sysfs接口进行启用,启用方式有三种不同的方式。

启用方法

方式一:仅打开二进制和动态库大页

echo 1 > /sys/kernel/mm/transparent_hugepage/hugetext_enabled

方式二:仅打开可执行匿名大页

echo 2 > /sys/kernel/mm/transparent_hugepage/hugetext_enabled

方式三:同时打开以上两类大页

echo 3 > /sys/kernel/mm/transparent_hugepage/hugetext_enabled

关闭方法

使用sysfs接口关闭代码大页:

echo 0 > /sys/kernel/mm/transparent_hugepage/hugetext_enabled

同时,注意释放已使用的大页,也有几种不同方式: 方式一:清理整个系统的page cache

echo 3 > /proc/sys/vm/drop_caches

方式二:清理单个文件的page cache

vmtouch -e /<path>/target

方式三:清理遗留大页

echo 1 > /sys/kernel/debug/split_huge_pages

检查是否启用代码大页

查看/proc//smaps中FilePmdMapped字段可确定是否使用了代码大页。 扫描进程代码大页使用数量(单位KB):

cat /proc/<pid>/smaps | grep FilePmdMapped | awk '{sum+=$2}END{print"Sum= ",sum}'


性能收益

该特性在不同平台优化效果不同,主要原因在于平台TLB的设计。当前已知较适用场景包括mysql、postgresql以及oceanbase,优化效果在5~8%。


附录-1:进一步优化——Padding

优化原理

Padding特性是对代码大页特性的优化,主要解决在分配给大页使用的内存剩余量不足以再分配出一个新的大页时导致的内存碎片问题。该特性需要在启用代码大页的基础上使用,不可独立使用。

举例说明:当二进制文件末尾剩余text段由于不足2M而无法使用大页,当剩余text大小超过hugetext_pad_threshold值,可将其填充为2M text,保证可使用上大页。

使用方法

启用方法

同样使用sysfs接口启用padding特性:

echo [0~2097151] >  /sys/kernel/mm/transparent_hugepage/hugetext_pad_threshold

建议一般情况写4096即可:echo 4096 > /sys/kernel/mm/transparent_hugepage/hugetext_pad_threshold

关闭方法

使用sysfs接口关闭padding特性,同时注意释放已使用的大页(参考“代码大页”的关闭方法)。

echo 0 >  /sys/kernel/mm/transparent_hugepage/hugetext_pad_threshold

附录-2:注意事项

  1. 打开、关闭并不意味着立即合并、拆散大页,hugetext 是异步的。
  2. 如果一段代码曾经被整理成大页,即使关闭 hugetext 功能,还是会大页映射。
  3. 在测试性能时,为了消除这些影响,可以通过 echo 3 > /proc/sys/vm/drop_caches 来回收整理的大页,下次就是小页映射了。
  4. 想确认代码段是否大页映射,可以通过 grep FilePmdMapped /proc/$(pidof mysqld)/smaps 来确认。


---------------------------------------------------------------------------------------

更多调优信息,请参考:

龙蜥社区:https://openanolis.cn/

KeenTune SIG:https://openanolis.cn/sig/KeenTune

阿里云龙蜥操作系统专区:https://developer.aliyun.com/group/aliyun_linux

相关文章
|
Linux Anolis
性能优化特性之:EXT4 Fast Commit
本文介绍了倚天实例上进行IO优化的特性:Fast Commit,并对其优化原理、使用方法进行了详细阐述
|
6月前
|
存储 分布式计算 资源调度
Spark性能优化之SparkUI
Spark性能优化之SparkUI
124 0
|
芯片 Anolis
性能优化特性之:TLBI - TLB range优化
本文介绍了倚天实例上的内存优化特性:TLBi,并从优化原理、使用方法进行详细阐述。
|
Oracle 关系型数据库 Linux
Linux 关闭透明大页(transparent_hugepage)和 NUMA
有些情况下需要关闭Linux 服务器的 透明大页和 NUMA,比如安装 Oracle 数据库!
Linux 关闭透明大页(transparent_hugepage)和 NUMA
|
SQL 关系型数据库 MySQL
MySQL 中启用大页(Huge Pages)提高性能
在 MySQL 中启用大页(Huge Pages)可以提高性能,还可以减少内存的使用。大页能够减少操作系统的页表,由此可减轻 CPU 负担和内存空间,从而减少了内存管理开销。下面是在 Linux 系统中启用 MySQL 大页的步骤: 1. 配置 Linux 系统大页:在物理或虚拟机上启用大页,请使用以下命令后设置了足够的大页: ```shell echo 2048 > /proc/sys/vm/nr_hugepages ``` 此处示例启用了 2048 个大页。请注意,此操作需要 root 用户权限。 2. 通过运行下列命令可检查您的系统是否已经启用了大页: ```shell gre
942 0
|
存储 开发框架 安全
在 C# 中使用 Span<T> 和 Memory<T> 编写高性能代码
在 C# 中使用 Span 和 Memory 编写高性能代码 .NET 中支持的内存类型 .NET Core 2.1 中新增的类型 访问连续内存: Span 和 Memory Span 介绍 C# 中的 Span Span 和 Arrays Span 和 ReadOnlySpan Memory 入门 ReadOnlyMemory Span 和 Memory 的优势 连续和非连续内存缓冲区 不连续的缓冲区: ReadOnly 序列 实际场景 Benchmarking 基准测试 安装 NuGet 包 Benchmarking Span 执行基准测试 解读基准测试结果 Span 限制 结论
446 0
|
缓存 算法 安全
小师妹学JVM之:cache line对代码性能的影响
小师妹学JVM之:cache line对代码性能的影响
小师妹学JVM之:cache line对代码性能的影响
|
自然语言处理 Java C#
block产生的内存泄漏以及解决方案(以及扩展)
block产生的内存泄漏以及解决方案(以及扩展)
511 0
|
存储 算法 数据库