LWN:减少vmap 锁冲突!

关注了就能看到更多这么棒的文章哦~

Mitigating vmap lock contention

By Jonathan Corbet
May 26, 2023
LSFMM+BPF
DeepL assisted translation
https://lwn.net/Articles/932396/

"vmap area" 是在 kernel 需要映射一段内存到虚拟地址时可以使用的一段 kernel 地址空间;除此之外,从 vmalloc() 分配而来的内存和 loadable module (动态加载的模块)也都放在这里。在 2023 年 Linux 存储、文件系统、内存管理和 BPF 峰会上,Uladzislau Rezki 在远程演讲中解释了一个与 vmap area 有关的性能问题,并讨论了可能的解决方案。

他说,这里的问题是,vmap 区域是由三个全局 spinlock 所保护的。free_vmap_area_lock 保护了 global free-space area,vmap_area_lock 则用来管理已经 map 了的区域,而 purge_vmap_area_lock 则用来保护延后释放(lazily freed)的区域的 list。他说,这些锁在有很多个 CPU 的系统中会变成一个显著的性能瓶颈。vmap_area_lock 控制了对一个红黑树的访问,该树是用来根据一个地址找到对应的包含了这个地址的已经分配出去的区域。这些区域可以通过查看/proc/vmallocinfo 看到。而 free_vmap_area_lock 则用来管理对 free 区域的访问,可能会出现很高比例的锁争夺的情况。

02ab7734e615be60698aa40d725ef7d1.png

分配路径上必须要能同时获得 free_vmap_area_lock(也就是要找到一个空闲范围)和 vmap_area_lock(需要将该范围标记为 busy)。而释放路径上则需要 vmap_area_lock 和 purge_vmap_area_lock。这种模式意味着这三个区域不能被同时访问。在一台 "超级强大的计算机"上进行的测试中,Rezki 测量了一个基本的 vmalloc() 调用在单线程运行时需要 2µs 左右。在 32 个线程同时调用 vmalloc()的情况下,这个时间增长到 50µs,变成了 25 倍。这种速度上的下降就是由于对 vmap area 的锁竞争而导致的。

他说,最大的问题是 vmap_area_lock。这部分是由于分配的区域经常会有很多碎片(fragment);free 和 purge 的 list 里的 area 更加少,也更加大块,因此竞争就更少。Rezki 建议增加 per-CPU 的 cache 来解决这个问题;每个 CPU 预先准备一些地址空间放到其 cache 中,然后用这些空间来分配 fragment 来满足请求。

一位与会者指出,分配 vmap 区域空间的问题看起来与分配用户空间地址空间很相似,那么是否可以使用相同的基础设施来处理这两者。Rezki 回答说,用户空间分配的困难更大,所以解决方案更加复杂,因此相关的优化方案还在开发中。vmap area 的真正问题是对多个不同 CPU 上的请求进行串行处理,这可以用一个更简单的解决方案。

Liam Howlett 说,vmap_area_lock 被用在做分配和释放操作的时候;如果它可以在两个路径中的任何一个里不用调用,那就可以减少竞争。Rezki 说,理论上来说是是正确的,但无论如何,必须以某种方式进行统计(bookkeeping)。Howlett 重申,这个问题与用户空间的虚拟内存区域的分配很类似。他说,内存管理的开发者应该互相学习,而不是只关注自己的事情。

Rezki 接着谈到了 vmap area 的 free 空间的管理问题。当该区域中的某一段被释放时,实现方法是将地址转换为适当的 per-CPU zone,获取其 lock,然后移除缘由的内存分配。然后可以 lock 这个 lazy-free zone,并将新释放的 area 添加进去。会有另一个独立上下文偶尔来消耗(drain)这个 lazy list;在他的 patch set 中,暂时的做法是把它放回到 global 区域去。

他最后问道,下一步应该怎么做?人们的回答是来发布 patch 并遵循通常的程序。他被要求提供一些性能数据,但目前没有可以合适的可以展示。当被问及在什么情况下观察到这种竞争时,他说这种情况出现在 Android 系统的视频播放场景下。会议结束时,Michal Hocko 建议 Rezki 可能的话可以来加入他的工作,也就是改善用户空间的地址分配。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

format,png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值