- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在过去五年的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/
假设我有父页面。 当我单击“打印”时,会打开一个新选项卡(页面)以进行打印预览。 我想要的是,当我单击“打印”时,父选项卡(页面)上应显示覆盖层,以停止进一步的工作,直到子选项卡关闭。 Because
我知道这是不可能的,但我想我还是会问这个问题。 我有一个 HTTPS 页面,并且正在动态创建一个表单。我想将表单发布到 HTTP 页面。在浏览器不弹出警告的情况下这可能吗?当我在 IE8 上执行此操作
在我的应用程序中,我实现了ajax 4.0客户端模板 目前我的模板位于同一个.aspx页面上。 (例如 Main.aspx) 但我想将它们外部化。(即所有 HTML 都会放在另一个页面上) 为此,我使
我目前正在构建自己的网络应用程序。在此应用程序的标题中有一个导航栏。 我将相同的导航栏添加到我的所有 html 页面,以便在页面之间导航时保持可见,并将导航元素设置为事件到我现在所在的页面。 我的
我们有一个在集成管道下运行的 IIS7 Intranet 站点,该管道主要是 ASP.Net,带有一些传统的经典 ASP 页面。该站点允许匿名访问大多数区域,但使用 Windows 身份验证来保护某些
有一个要求,我需要根据 div 标签的高度超过 700 像素的条件将大型 HTML 页面拆分为多个页面。 我还可以根据字数拆分页面。 下面的示例根据 HTML 标签分割页面,而我需要根据 div 高度
有两个 html 页面,如果在第一个页面中单击特定图像,它将转到第二个 html 页面。如果在第二个 html 页面上的任何地方单击它应该返回到第一页并将第二页完全显示在第一页的一个 div 中 1s
我有一个简单的 hello world Servant 应用程序。我需要向它添加一些静态或动态的 html 页面。我怎样才能做到这一点?在文档中没有提到它。注意我不想在 Haskell 代码中创建 h
我有两个文件 index.html 和 index2.html。这两个文件都在本地机器上的同一目录中(无法访问 PHP 等)。 我正在努力 Page Title 使用 jQuery 从 index.h
假设我有一个 JSP 页面 index.jsp User id:
我面临着一个对我来说非常陌生的情况。我会尽力让事情变得简单来解释它一步一步来。 1)在页面 A(用户表单)中,我从字段中获取一些值并将其作为 jQuery AJAX POST 发送到页面 B。这是主要
我正在尝试弄清楚如何从 buttons.html 获取用户按钮点击动态切换第二个列的可见性 userinput.html 。我正在使用 DataTables userinput.html表并认为我有
我有asp。净 mvc4 项目。 Angularjs 已集成。 我已经按照以前的要求构建了 HTML 页面和 WEB API 2。 现在出于某种原因,我必须使用 CSHTML 页面。以前我只有 web
我的网站包含大约 18 个不同的页面。以管理员身份登录后,我单击“页面”。 我看到了以下内容 All (20) | Mine (19) | Published (19) | Draft (1) No
Haskell 中每个函数都有手册页吗?换句话说,我可以在某处输入 man fst 并获取有关该函数的手册或帮助页面吗?我发现大量的功能势不可挡! 我正在使用 GHC 和 GHCi。 最佳答案 我不知
我一直在用github pages很长一段时间以来,并使用自定义域重定向功能来重定向我的 user website来自 prahladyeri.github.io到我自己的域名 https://www
我对 Github 有一个基本的了解:我知道如何创建、添加、提交、推送和克隆存储库。我也开始探索 Github 页面来托管我的项目。我的最新项目于 3 月开始并将其推送到 gh-page。从那以后,我
在尝试查看日志时,Airflow 会抛出一个带有以下消息的 oops 页面: File "/Users/user/.pyenv/versions/3.5.2/lib/python3.5/locale.
我已经按照此处列出的步骤 (https://pages.github.com/) 为我正在处理的网站设置了一个 GitHub 页面 我设置的站点当前托管在 IIS 下,并使用 URL Rewrite
我想将我的 domain.com 重定向到 openshift 页面 (openshift-app.rhcloud.com)。我已经按照描述完成了 here它有效。唯一的问题是,在任何网站上,我都不会
我是一名优秀的程序员,十分优秀!