Linux Slab 分配器和缓存性能

2024-04-20

来自指南理解Linux内核第三版,第 8.2.10 章,板坯着色 -

从第 2 章我们知道,同一个硬件缓存行映射许多不同的 RAM 块。在这个 在本章中,我们还看到相同大小的对象最终存储在缓存中的相同偏移量处。 不同板内具有相同偏移量的对象将以相对较高的概率最终被映射 在同一个缓存行中。因此,缓存硬件可能会浪费内存周期来传输两个对象 从同一缓存线来回到不同的 RAM 位置,而其他缓存线则未得到充分利用。 板分配器尝试通过称为板着色的策略来减少这种令人不快的缓存行为:不同 称为颜色的任意值被分配给板。

(1)我无法理解平板着色试图解决的问题。当正常进程访问数据时,如果数据不在高速缓存中并且遇到高速缓存未命中,则数据会与进程尝试访问的数据的周围地址中的数据一起提取到高速缓存中,以提高性能。为什么会发生相同的特定缓存行不断交换的情况?一个进程在两个不同内存区域的内存区域内不断访问相同偏移量的两个不同数据地址的概率非常低。即使确实发生了,缓存策略通常会根据某些议程(例如 LRU、随机等)选择要交换的行。不存在根据正在访问的地址的最低有效位的匹配来选择逐出行的策略。

(2)我无法理解平板着色(它从平板末尾到开头获取空闲字节,并导致第一个对象具有不同偏移量的不同平板)如何解决缓存交换问题?

[SOLVED]经过一番小小的调查后,我相信我找到了问题的答案。答案已发布。


经过多次学习和思考,我得到了看似更合理的解释,而不仅仅是具体的地址示例。 首先,你必须学习缓存、标签、集合、行分配等基础知识。

从linux内核代码可以肯定,colour_off的单位是cache_line_size。colour_off是基本偏移单位,colour是struct中color_off的数量kmem_cache.

int  __kmem_cache_create (struct kmem_cache *cachep, unsigned long flags)
   cachep->align = ralign;
   cachep->colour_off = cache_line_size();  // colour_off's unit is cache_line_size
    /* Offset must be a multiple of the alignment. */
   if (cachep->colour_off < cachep->align)
      cachep->colour_off = cachep->align;
   .....
   err = setup_cpu_cache(cachep, gfp);

https://elixir.bootlin.com/linux/v4.6/source/mm/slab.c#L2056 https://elixir.bootlin.com/linux/v4.6/source/mm/slab.c#L2056

So we can analyse it in two cases. The first is cache > slab. enter image description here You see slab 1 slab2 slab3 ... has no possibility to collide mostly because cache is big enough except slab1 vs slab5 which can collide. So colouring mechanism is not so clear to improve performance in the case. But with slab1 and slab5 we just ignore to explain it why, I am sure you will work it out after reading the following.

The second is slab > cache. enter image description here A blank line means a color_off or cache line. Clearly, slab1 and slab2 has no possibility to collide on the lines signed by tick as well as slab2 slab3. We make sure colouring mechanism optimize two lines between two adjacent slabs, much less slab1 vs slab3 which optimize more lines, 2+2 = 4 lines, you can count it.

总结一下,着色机制通过尽可能使用原本无用的内存来优化缓存性能(具体来说只是优化开头和结尾的一些colour_off行,而不是其他仍然可能发生冲突的行)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux Slab 分配器和缓存性能 的相关文章

随机推荐

  • 使用“npm install”安装 jquery-ui

    我从这里看到https github com jquery jquery ui https github com jquery jquery uijquery ui 的最新版本是 1 11 4 但是 当我使用 npm install jqu
  • 为什么构造函数被调用两次

    我不明白怎么办constructors work 这里我声明了一个对象obj2 它调用构造函数abc 这完全没问题 但是当我分配时 obj2 100 为什么编译器允许将整数初始化为类对象 如果它允许的话 那么它是如何销毁对象的 然后是如何调
  • `__asm nop` 在 Windows 中相当于 GCC 编译器中的 `asm volatile("nop");`

    在 Windows 中 可以 asm nop被交换为asm volatile nop 在 GCC 编译器中使用 并产生相同的结果 我读过volatile 在 GCC 中 保证调用不会被优化掉 然而 它不能直接移植到 Windows 我很好奇
  • 如何将日期时间四舍五入到最接近的 5 分钟?

    我需要一个Python3函数来四舍五入datetime datetime反对精确到 5 分钟 是的 这已经在之前的 SO 帖子中讨论过here https stackoverflow com questions 32723150 round
  • 在 PHP 中的任意位置插入数组中的新项目

    如何将新项目插入到数组的任意位置 例如数组的中间 您可能会发现这更直观一些 它只需要一个函数调用array splice http www php net manual en function array splice php origin
  • 为什么我无法重写 Java 中的 wait() 方法? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我找到方法了wait 在课堂里Object 它是最终的 这意味着该方法不能被重写 有什么想法为什么是最终的吗 Flavio 这实际上是一个非常好
  • Android 列表视图与部分

    您好 我在尝试了解分段列表视图的工作原理时遇到问题 我让它工作到正常的列表视图中 但现在我想将部分添加到我的列表中 如何在其中添加节标题 这是我有效的代码 public class ChooseTeamActivity extends Li
  • R数据表:移动列表类型的行[重复]

    这个问题在这里已经有答案了 我有一个 data table 其中包含list type x data table k seq 1 5 l list c 4 5 gt x k l 1 1 4 5 2 2 4 5 3 3 4 5 4 4 4 5
  • Rails 3.2.3 无法在 ubuntu 12.0.4 中使用 webrick 在 https 上工作

    一直在尝试在 ubuntu 12 0 4 中使用 webrick 获得一个新的 刚刚创建的 Rails 应用程序来在 ssl 上工作 已经尝试了我所知道的所有可能的方法 尝试使用config force ssl true in 应用程序 r
  • 相对文件路径问题

    我正在开发一个尝试读取配置文件的 portlet 我正在 eclipse 项目中开发它 我目前将配置文件放置在 WEB INF 文件夹 位于 root WEB INF 中 中 其名称为 config properties 如何使用 java
  • node.js - 如何将数组写入文件

    我有一个示例数组如下 var arr 1373628934214 3 1373628934218 3 1373628934220 1 1373628934230 1 1373628934234 0 1373628934237 1 13736
  • 查找 A 中与 B 中没有关联行的行,其中 FK 位于 B 上?

    我一直在做的是 SELECT FROM a LEFT JOIN b ON b a id a id WHERE b id IS NULL 基本上 我试图找到的行a没有关联的b 外键存储在b 这是执行此操作的正确方法 还是有其他类型的连接来执行
  • 使用 getCollection 和 addLevelFilter 列出 Magento 类别,但排除默认根类别

    我使用以下代码来获取集合并使用 addLevelFilter 2 在级别上进行过滤 这会完美地输出第 2 级的所有类别 除了它还会提取列表中的默认根类别之外 我想从视图中排除它 但在查看了所有可用的方法后 我没有看到任何可以帮助我删除 排除
  • 如何在最新版本的 Tensorflow 中使用 MultiVariateNormal 分布

    I need to use the MultiVariateNormal distribution from the tf contrib distributions MultivariateNormal However in the la
  • Backbone.View“el”混淆

    视图应该如何el被处理 必须设置它 否则事件不会触发 请参阅here https stackoverflow com questions 4909564 backbone js why isnt this event bound 但它应该是
  • MySQL - 按 count() 和 GROUP BY 排名

    我有我的 mysql 表posts 我的论坛的所有帖子都存储在其中 就像这样 id uid thread post title text time int int varchar int varchar text int 现在我想显示用户个
  • 使用 3.0 SDK 在 FB 墙上发布

    各位程序员大家好 我在使用新的 Facebook SDK 时遇到了困难 场景是 我使用片段 所以我按照以下步骤操作 为什么 Android Facebook 界面不支持 Fragments https stackoverflow com q
  • xcode 4.5,视图大小在界面生成器中不可编辑

    我从 xcode 4 4 开始我的项目 并且我已经使用界面生成器 使用 xib 文件 创建了几个视图控制器 前几天 我把xcode升级到了4 5版本 今天 我突然发现我可以在界面生成器中修改视图大小了 这是 xcode 4 5 的预期功能还
  • 生产构建中的错误:索引 html 生成失败 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 升级了角10项目到角12 但现在在运行生产构建时 出现错误 索引 HTML 生成失败 未定义 6 720366 缺少 n
  • Linux Slab 分配器和缓存性能

    来自指南理解Linux内核第三版 第 8 2 10 章 板坯着色 从第 2 章我们知道 同一个硬件缓存行映射许多不同的 RAM 块 在这个 在本章中 我们还看到相同大小的对象最终存储在缓存中的相同偏移量处 不同板内具有相同偏移量的对象将以相