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

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

优化原理

代码大页特性主要为大代码段业务服务,可以降低程序的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,并对其优化原理、使用方法进行了详细阐述
|
4月前
|
存储 缓存 算法
缓存优化利器:5分钟实现 LRU Cache,从原理到代码!
嗨,大家好!我是你们的技术小伙伴——小米。今天带大家深入了解并手写一个实用的LRU Cache(最近最少使用缓存)。LRU Cache是一种高效的数据淘汰策略,在内存有限的情况下特别有用。本文将从原理讲起,带你一步步用Java实现一个简单的LRU Cache,并探讨其在真实场景中的应用与优化方案,如线程安全、缓存持久化等。无论你是初学者还是有一定经验的开发者,都能从中受益。让我们一起动手,探索LRU Cache的魅力吧!别忘了点赞、转发和收藏哦~
99 2
|
芯片 Anolis
性能优化特性之:TLBI - TLB range优化
本文介绍了倚天实例上的内存优化特性:TLBi,并从优化原理、使用方法进行详细阐述。
|
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
968 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 限制 结论
451 0
|
存储 缓存 Android开发
聊聊ViewPager2中的缓存和复用机制
聊聊ViewPager2中的缓存和复用机制
聊聊ViewPager2中的缓存和复用机制
|
Oracle 关系型数据库 Linux
|
Oracle 关系型数据库 Linux