gpt4 book ai didi

performance - x86 Windows/Linux应用程序在减少页面数方面是否有性能提升?

转载 作者:行者123 更新时间:2023-12-02 00:52:25 24 4
gpt4 key购买 nike

我正在过去五年的Windows和Linux上编写和运行软件,例如,在过去五年的计算机上。

我相信正在运行的进程永远不会接近我们拥有的内存量(我们通常使用32GB中的3GB),但是我敢肯定我们会填满缓存以至于溢出。

我对数据结构进行了修改,这使数据结构的运行速度变慢了(也就是说,指针数学处理了很多),但同时减少了应用程序的缓存行数和页面数(工作集)。

我的理解是,如果将进程的内存分页到磁盘上,则减少页面数,因此就挂钟时间和延迟(例如,响应网络事件,用户事件,计时器,等等)但是,由于如今的内存如此便宜,我认为使用我的数据结构的进程不会出现内存不足的页面。那么,改善这一点还有优势吗?例如,如果我使用10,000个缓存行,那么它们分布在157个4k页(= 643k)还是10,000个4k页(= 40MB)上是否有关系?子问题:即使您还远远没有填满RAM,现代操作系统是否仍会分页正在运行的进程? (例如,我认为90年代的Linux可能这样做是为了增加文件缓存。)

相比之下,我也可以减少高速缓存行,并且我怀疑这可能会浪费很多时钟时间。只是为了清楚我要计数的内容,我计算的是我接触至少一个字节的64字节对齐内存区域的数量,作为此结构使用的总缓存行。示例:如果假设我有40,000个16字节结构,那么一台计算机的进程不断引用更多的内存(具有L1高速缓存),如果这些结构打包到10,000个64字节高速缓存行中,而不是每个跨两个高速缓存行,它们的运行速度可能会更快80,000个缓存行?

最佳答案

一般建议是,在给定应用程序生命周期的相同时间间隔内,将在同一内核上表现出较高时间局部性的高速缓存行和虚拟页的数量最小化。

当所需的物理页面总数即将超过主内存的容量时,操作系统将尝试通过将某些驻留页面分页到辅助存储来释放一些物理内存。这种情况可能会导致严重的页面错误,从而可能严重影响性能。即使您确定地知道系统将无法达到该目标,但在不必要地使用更多虚拟页面时(即在使用的页面中浪费了空间)也可能会出现其他性能问题。

在Intel和AMD处理器上,页表项和其他页面结构被缓存在内存管理单元中的硬件缓存中,以有效地将虚拟地址转换为物理地址。这些包括L1和L2 TLB。在L2 TLB未命中时,将使用称为页面漫游器的硬件组件来执行所需的地址转换。更多的页面意味着更多的错过。在Broadway1和Zen之前的微体系结构上,任何时候都只能进行一次出色的页面遍历。在以后的微体系结构中,只能有两个。此外,在Intel Ivy Bridge及更高版本上,TLB预取器可能更难以跟上错误。

在Intel和AMD处理器上,设计了L1D和L2缓存,以确保同一4K页内的所有缓存行都映射到不同的缓存集。因此,如果使用了页面的所有缓存行,例如,为了将缓存行扩展到10个不同的页面中,则可以减少这些缓存级别中的冲突未命中。也就是说,在所有AMD处理器和Intel Haswell之前的微体系结构上,当访问更多地分布在缓存集之间时,发生银行冲突的可能性就更大。

在Intel和AMD处理器上,硬件数据预取器无法跨4K边界运行。可以由一个或多个预取程序检测到但访问分布在许多页面上的访问模式将从硬件预取中受益较少。

在Windows / Intel上,工作集管理器每秒重置所有当前页面的页面表条目的访问位。因此,当访问不必要地分散在虚拟地址空间中时,每次内存访问需要微码辅助(以设置访问位)的页面遍历数可能会变大。

同样的情况也适用于较小的页面错误(在Intel和AMD上)。 Windows和Linux都使用按需分页,即分配的虚拟页面仅按需映射到物理页面。当访问尚未映射到物理页面的虚拟页面时,会发生次要页面错误。就像访问位一样,每次访问的次要页面错误的数量可能会更大。

在Intel处理器上,随着访问更多页面,在同一逻辑内核上进行4K别名的附近访问的可能性更大。有关4K别名的更多信息,请参见:L1 memory bandwidth: 50% drop in efficiency using addresses which differ by 4096+64 bytes

可能还有其他潜在问题。

子问题:即使您远未填满RAM,是否也有
情况下,现代OS是否仍将分出正在运行的进程? (我认为
90年代的Linux可能这样做是为了增加文件缓存,因为
实例。)

在Windows和Linux上,每个进程都有一个最大工作集大小限制。在Linux上,这称为RLIMIT_RSS,并且未强制执行。在Windows上,此限制可以是软限制(默认)或硬限制。仅在硬限制时才强制执行限制(可以通过调用SetProcessWorkingSetSizeEx函数并传递QUOTA_LIMITS_HARDWS_MIN_ENABLE标志来指定限制)。当某个进程达到其严格的工作集限制时,即使可用的物理内存可用,也可以通过将其某些页面调出到页面文件中来满足其他内存分配请求。

我不了解90年代的Linux。

脚注:

(1)英特尔优化手册在第2.2.3节中提到,与Haswell和早期的微体系结构中的一个相比,Skylake可以并行执行两次页面遍历。据我所知,该手册并未明确提及Broadwell是否可以并行进行一或两页步行。但是,根据these Intel幻灯片的第10张(标题为“Intel Xeon处理器D:针对密集型解决方案进行了优化的第一个Xeon处理器”),Xeon Broadwell支持两次页面遍历。我认为这也适用于所有Broadwell型号。

关于performance - x86 Windows/Linux应用程序在减少页面数方面是否有性能提升?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56620925/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com