我遵循了这个方法,发现
clear_page_erms
在火焰图中产生了大量的开销。
上网搜索得知,该函数的作用是在缺页时将内核分配的页面清零。考虑到我的工作负载不是多租户云环境,不会有恶意软件或攻击行为,我可以控制内核放宽这些安全功能并绕过这个重置操作来提高性能吗?
我使用的是内核5.14,AMD处理器,并且不启用大页或透明大页。
相关内核参数均未设置:
#
# Memory initialization
#
CONFIG_INIT_STACK_NONE=y
# CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set
# CONFIG_INIT_ON_FREE_DEFAULT_ON is not set
# end of Memory initialization
# end of Kernel hardening options
# end of Security options
请参阅
mmap(2)
的手册页,了解如何配置内核以考虑 MAP_UNINITIALIZED
标志:
(自 Linux 2.6.33 起)MAP_UNINITIALIZED
- 不要清除匿名页面。该标志旨在提高嵌入式设备的性能。仅当内核配置了
选项时,才会使用此标志。由于安全隐患,该选项通常仅在嵌入式设备(即可以完全控制用户内存内容的设备)上启用。CONFIG_MMAP_ALLOW_UNINITIALIZED
即你需要一个定制的内核来放置
CONFIG_MMAP_ALLOW_UNINITIALIZED=y
进入其
.config
文件(或通过menuconfig设置)。为了使其在您的用户空间应用程序中生效,您必须将此标志传递给 mmap
的所有相关调用。
但请注意,不初始化内存实际上会对性能产生负面影响,特别是由于页表延迟填充而增加延迟。所以这是一把双刃剑。