在现代计算操作系统中,Linux内存管理机制的高效运转离不开锁的使用。然而,锁机制在确保资源访问安全的同时,也可能成为限制系统性能的瓶颈。本文将深入分析Linux内存管理中的锁的使用情况,并总结几个开放社区和企业的典型优化案例,以期为读者揭示Linux内核在内存管理方面面临的挑战和其优化方向。

锁机制在Linux内存管理中的作用

锁在Linux内存管理中起到了至关重要的作用。通过对多线程访问内存资源的限制,锁保证了数据的一致性和完整性。然而,不同类型的锁在不同情景下表现出的性能各异。对这种锁的研究和优化也显得尤为重要。

1. PG_Locked:page结构体上的锁

在Linux内核中,物理内存通过page结构体来管理。当某一页面处于被使用状态时,其PG_locked标志位将被设置。在内核中,这一标志通过lock_page函数进行管理,但这一函数的特点是其可能引发进程睡眠,因而不能在不可睡眠的上下文中使用。

典型案例:当页面发生缺页异常(page fault)时,系统会设置PG_locked标志,并等待IO操作完成后,再清除这一标志。其过程如下:分配页面、发起IO读操作、等待IO完成并清除PG_locked。这一流程确保了页面的正确使用和数据的完整性。

2. lru_lock:LRU算法中的锁

在内存回收时,Linux内核使用了LRU(Last Recently Used)算法,该算法通过扫描维护在LRU链表中的页面实现内存回收。lru_lock是一种自旋锁,用于保护LRU链表的并发操作。这一锁的争用在内存回收过程中表现得尤为明显,尤其是在多个任务并发访问LRU链表时。

3. mmap_lock:进程地址空间访问的锁

mmap_lock是定义在mm_struct中的读写信号量,保护了进程的虚拟地址空间。当进程发生缺页异常或执行mmap、mprotect等操作时,mmap_lock确保了多线程环境下数据的安全访问。然而,这一锁的争用在高并发场景下也可能导致性能问题。

典型优化案例 案例一:per-memcg lru_lock优化

阿里巴巴的Alex Shi在2020年提交了一组patchset,针对memcg(内存控制组)的lru_lock争用问题进行了优化。通过在每个memcg的lruvec中增加一个自旋锁,大幅度减少了不同memcg之间的锁争用。这一优化在Linux 5.11内核中合并,通过细化锁的粒度,系统性能提升了62%。

案例二:mmap_lock在IO情景下的优化

Josef Bacik在2018年针对page fault时的IO操作路径,对mmap_lock进行了优化。在需要执行耗时IO操作时,系统将会释放mmap_lock,并通过retry机制重新获取锁。这一改动在Linux 5.1内核中合并,有效减少了mmap_lock的持有时间,提升了系统响应速度和并发性能。

展开全文

案例三:Speculative Page Fault处理(SPF)

SPF机制首先尝试在不持有mmap_lock的情况下处理page fault,改进了高并发下的性能。然而,由于复杂性和稳定性问题,该patchset直到2019年才被重新提交。测试表明,SPF在一些大型应用的启动时间上提升显著,达到了20%的优化效果。

案例四:Per-VMA Lock(PVL)

Google的Suren Baghdasaryan在2023年提出的PVL优化,通过在每个VMA(虚拟内存区域)中增加锁,使不同VMA之间的操作可以并发进行。这一优化方案在Linux 6.4内核中合并,从而显著提升了多线程应用的并发性能。

案例五:Fault Around优化

Vinayak Menon在2016年提交了一组patchset,通过将fault_around_bytes配置为64K,减少了page fault数量,从源头上减少了mmap_lock的争用。具体而言,通过提前建立地址映射,系统减少了需要处理的缺页异常数,提高了整体内存管理的效率。

总结

通过对Linux内存管理中的锁使用情况及其优化案例的分析,我们可以看到,锁优化大致可分为以下方向:

无锁化操作:借助新的机制和方法,尽量避免使用锁,例如通过RCU(Read-Copy Update)机制。

缩小锁的粒度:将大锁拆分成小锁,减少锁的争用范围。

提前释放锁:在长时间操作前尽早释放锁,完成后再重新获取。

锁等待优化:在锁竞争激烈时,通过trylock等策略,减少关键路径上的性能影响。

减少持锁操作:通过配置参数优化,减少需要持锁的频率。

最后,强烈建议大家, 日常一定要学习使用先进生产力,要把AI用起来。不管任何人,不论你是多熟悉你的业务,也不要排斥AI。聪明的人已经把像chatgpt这样的AI工具用得风生水起了,但大部分职场人还只知道埋头苦干,结果就是吃了信息闭塞的亏。会用AI和不会用AI的人,工作效率真的是天壤之别!其实只要愿意花点时间学学怎么用,简单的操作就能让工作效率翻个好几倍,省下大把时间做自己的事情。比如我常用的AI工具——简单AI,就是一个全能型AI创作助手,功能包括AI绘画、文生图、图生图、AI文案、AI头像、AI素材、AI设计等。可以一键生成创意美图、动漫头像、种草笔记、爆款标题、活动方案等。 文末附工具链接,可以点击体验。

全网玩儿疯了的美女/游戏角色生成神器,这里一分钱不花!点击一键生成我的AI游戏女友 →

全网玩儿疯了的美女/游戏角色生成神器,这里一分钱不花!点击一键生成我的AI游戏女友 →

返回搜狐,查看更多