忘记密码   免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 2862 | 回复: 6

[内存管理] 关于slab着色问题 [复制链接]

论坛徽章:
0
发表于 2018-01-28 10:16 |显示全部楼层
本帖最后由 zhangku0 于 2018-01-28 10:20 编辑

关于slab着色 我的理解是 在slab开头加一些空的cache行(下文中cache指的都是硬件高速缓存) 使得slab内相同位置的对象在cache中尽量映射到不同的cache行中
有以下几个问题

1. 如果cache采用的是k路组相连,cache行大小为s,那么着色的一个重要的前提就是,slab的大小应该等于k*s(或者是其整数倍)。因为内存映射到cache中的位置跟k和s有关,所以slab的大小跟这两个值也应该有关系吧。在ulk以及大家的讨论中,为什么都没有强调这一点呢。

2. 在ulk的335页提到,slab着色解决的是,相同类型slab可能映射到同一cache行的问题(网上也有人说是不同的类型),那么相同的类型映射到同一缓存行会有什么问题呢(或者说为什么相同cache行会频繁的访问,导致频繁调入调出)。相反,不同类型的slab映射到同一个cache行就不会有这个问题吗。

3. cache的索引号是地址的中间位,使得内存中相邻的块会映射到不同的cache行。也就是说slab内部的对象已经映射到了不同的cache行中了,这也一定程度避免了问题2引出的问题。而着色的加入即使避免了不同slab内相同偏移的对象映射到同一cache行的问题,却可能恰恰因为着色导致与slab中另外一些位置的对象映射到了相同的cache行中。原因是slab内部的对象会映射到不同cache行中。

昨天想了下slab着色问题,发现有很多矛盾的地方,应该是自己的理解出了问题,还请内核前辈们指点一下。



论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
发表于 2018-02-02 21:23 |显示全部楼层
如果是专用slab,并且object数量不是那么多的话,着色与否的影响似乎不大?(数量一旦上去就另说了)

如果是公用slab,类似kmalloc使用的各种size,因为会被很多模块引用,page的分布也就更离散,估计color在这种情况下更有意义?

一般检测cache大小的代码,都是隔了很多的page才会出现false sharing的情况。

论坛徽章:
0
发表于 2018-02-05 20:45 |显示全部楼层
本帖最后由 mattwu 于 2018-02-05 20:58 编辑
zhangku0 发表于 2018-01-28 10:16
关于slab着色 我的理解是 在slab开头加一些空的cache行(下文中cache指的都是硬件高速缓存) 使得slab内相 ...

>1. 如果cache采用的是k路组相连,cache行大小为s,那么着色的一个重要的前提就是,slab的大小应该等于k*s(或者是其整数倍)。因为内存映射到cache中的位置跟k和s有关,所以slab的大小跟这两个值也应该有关系吧。在ulk以及大家的讨论中,为什么都没有强调这一点呢。

cache的位置本质上和slab大小无关,只和这个slab object的地址相关,此处的地址简单理解就是线性地址,即虚拟地址。但CPU内部真正用的可能是物理地址,这个是由CPU决定的,并且具体实现映射的hash算法也没有公开。以Intel core I7 7820HQ为例来说,cache line大小是64字节,L1 data是4x32k (每个内核有32k的cache),8-way (即同时可以容纳8个相冲突地址)。每一个cache set的大小为32k/8 = 4K,简单理解就是slab object在其相应page中所处的偏移就决定了它的cache line。

>2. 在ulk的335页提到,slab着色解决的是,相同类型slab可能映射到同一cache行的问题(网上也有人说是不同的类型),那么相同的类型映射到同一缓存行会有什么问题呢(或者说为什么相同cache行会频繁的访问,导致频繁调入调出)。相反,不同类型的slab映射到同一个cache行就不会有这个问题吗。

slab着色要解决的问题是主要是slab内部的竞争。slab在先在内存中分配page页面(4K),然后再将page分割,在分割的时候会在每个页面的头部加个偏移,这个头部就是所谓的着色区。


>3. cache的索引号是地址的中间位,使得内存中相邻的块会映射到不同的cache行。也就是说slab内部的对象已经映射到了不同的cache行中了,这也一定程度避免了问题2引出的问题。而着色的加入即使避免了不同slab内相同偏移的对象映射到同一cache行的问题,却可能恰恰因为着色导致与slab中另外一些位置的对象映射到了相同的cache行中。原因是slab内部的对象会映射到不同cache行中。

竞争总是存在的,总的资源就这么多,你多了我就少了,本身就是0和游戏,所以slab着色未必会带来总体性能的提升。

回复 1# zhangku0



论坛徽章:
9
程序设计版块每日发帖之星
日期:2016-02-13 06:20:00数据库技术版块每日发帖之星
日期:2016-06-15 06:20:00数据库技术版块每日发帖之星
日期:2016-06-16 06:20:00数据库技术版块每日发帖之星
日期:2016-06-18 06:20:00程序设计版块每日发帖之星
日期:2016-06-27 06:20:00程序设计版块每日发帖之星
日期:2016-07-09 06:20:00IT运维版块每日发帖之星
日期:2016-07-15 06:20:00IT运维版块每日发帖之星
日期:2016-07-27 06:20:00程序设计版块每日发帖之星
日期:2016-08-18 06:20:00
发表于 2018-02-07 10:39 |显示全部楼层
本帖最后由 mordorwww 于 2018-02-07 14:26 编辑

现在的内核版本slab都不着色了吧, 着色很麻烦,但是用处又不大

论坛徽章:
0
发表于 2018-02-14 22:33 |显示全部楼层
本帖最后由 zhangku0 于 2018-02-14 22:35 编辑

回复 3# mattwu 多谢前辈耐心解答,由于概念上有些区别,也可能是自己表述的不太清楚,所以想再继续请教下:

  • 您在问题1和问题2中提到“每一个cache set的大小为32k/8 = 4K slab先在内存中分配page页面(4K)”  ,这里的cache setpage大小都是4kslab大小为1页),问题1可以转述为:这两个值相等或者成比例是不是必然的,是不是也可以说是着色的前提条件?
  • slab未必在所有情况下都有性能的提升,那么最理想的被优化的情境是不是这样:某种slab对象大小刚好大于page大小的一半,这样page内部不会容纳另外的同类别对象,同时也有足够的空间去着多种颜色(除去对象大小的一小半page)。可以这样理解吗?


论坛徽章:
0
发表于 2018-02-27 15:30 |显示全部楼层
zhangku0 发表于 2018-02-14 22:33
回复 3# mattwu 多谢前辈耐心解答,由于概念上有些区别,也可能是自己表述的不太清楚,所以想再继续请教下 ...

> 问题1和问题2中提到“每一个cache set的大小为32k/8 = 4K” “slab先在内存中分配page页面(4K)”  ,这里的cache set和page大小都是4k(slab大小为1页),问题1可以转述为:这两个值相等或者成比例是不是必然的,是不是也可以说是着色的前提条件?


在分配新slab对象的时候,如果当前cache中已没有可用对象(即空闲空间),系统会从内存池中申请新page,最多可达10个page,在创建cache时系统会根据slab object的大小计算并选择最优值。前面举例中只是假设分配了一个page, 两个值没有直接关联。着色的前提是 有“用不着的剩余空间”,如果slab object正好是PAGE_SIZE/2的话,就没有“剩余空间”了,毕竟slab的根本目的还是为了减小内存碎片。


> slab未必在所有情况下都有性能的提升,那么最理想的被优化的情境是不是这样:某种slab对象大小刚好大于page大小的一半,这样page内部不会容纳另外的同类别对象,同时也有足够的空间去着多种颜色(除去对象大小的一小半page)。可以这样理解吗?

slab着色的目的是为了最大化的利用cache line,可以提升操作 同一个slab cache 的性能。但当所有的人都去竞争有限的资源时,“有限的资源”才真正决定着整合性能。建议读一下内核代码,内核在分配slab对象时除了着色外还会考虑地址对齐、内存使用率、管理数据的安排等多种因素。

论坛徽章:
0
发表于 2018-03-08 08:53 |显示全部楼层
回复 6# mattwu
好的  谢谢您了



您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:wangnan@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP