gpt4 book ai didi

Linux 内核 - 页缓存、结构地址空间和内存 cgroup 之间的关系是什么?

转载 作者:行者123 更新时间:2023-12-04 17:16:33 25 4
gpt4 key购买 nike

我试图了解 Linux 页面缓存以及它与内存 cgroups (v2) 的关系。我知道使用 cgroupsv1,内存 cgroups 可以是 isolated and have independent LRU lists (我假设 cgroupsv2 是一样的)。这和事实mm/vmscan.c有很多对 mem_cgroups 的引用并有 a functionshrink_node_memcgs ,让我觉得每个 cgroup 都有自己的页面缓存。这个假设是真的吗?页面缓存中的所有页面都属于一个 cgroup 吗?
如果是真的,我知道页面缓存是由 struct address_space 表示的。 ( here )。如何找出与给定 struct address_space 相关联的 cgroup ?我是否必须在 struct address_space 中找到第一页?然后从页面中找到cgroup?

最佳答案

经过大量的调查,我原来的理解有几个问题。
首先,页面缓存是驻留在内存中的非连续页面的集合。很容易陷入将“页面缓存”视为单个连续内存块/页面(类似于硬件缓存)的陷阱,但页面缓存只是内存中一些可用页面的集合供以后访问。
“页面缓存”中的这些页面甚至没有虚拟存储在一起。如,内核 doesn't将页面缓存中的所有页面保存在一个全局结构或列表中。相反,更好的思考方式是页面缓存实际上是内核中所有 LRU 列表的联合。

This and the fact that mm/vmscan.c has many references to mem_cgroups and has a function called shrink_node_memcgs, makes me think that each cgroup has its own page cache.


如前所述,每个 cgroup 都有自己的 LRU 列表。但是,每个 cgroup 都没有自己的页面缓存。但是,如果您整理所有 cgroup 中的所有 LRU,您将保留页面缓存的所有页面。

I know that a page cache is represented by struct address_space


这是不正确的。 A struct address_space确实代表页面缓存中的一些页面,但它本身并不代表整个页面缓存。 struct address_space实际上代表来自单个 inode 的缓存页面(文件)或块设备(参见 host 结构中的 address_space member)。事实上, one原始帖子中的链接有这样的引用:“更好的名称 [for struct address_space] 可能是 page_cache_entity
或 physical_pages_of_a_file。”( pg.327 ,第 16 章)

How can you find out what cgroup is associated with a given struct address_space?


address_space对应单个 inode (file) 而不是单个 cgroup,情况并非此结构中的所有页面都归入相同的 cgroup 并因此驻留在相同的 cgroup LRU 列表中。例如,假设 cgroup 1 中的一个进程读取一个大文件的开头,但是 cgroup 2 中的另一个进程读取该文件的结尾。每个进程访问的页面都来自同一个 inodestruct address_space ,但其中一些页面将在 cgroup 1 的 LRU 列表中,而其他页面将在 cgroup 2 中。
所以不可能从 struct address_space 中找到 cgroup .相反,理论上,您可以遍历 struct address_space pages ,然后找到对应于每个单独页面的 cgroup ( page->mem_cgroup->css.cgroup )。
请记住,向一个 cgroup 收费的页面仍有可能被不同 cgroup 中的另一个进程共享/访问。在此处查看有关 v1 ( Section 2.3 ) 和 v2 ( "Memory Ownership" ) 的共享内存收费规则。
附录:
在我的研究中,我遇到了 this article这导致了我的困惑,并让我想到了 address_space与单个 cgroup 相关联。图像 4.2 使它看起来像 address_space被埋在 mm_struct 内;自 mm_struct特定于一个进程,那么这个 address_space还应该对应于一个进程,进而对应于那个进程的 cgroup。在现实中,这个过程 mm_struct对应持有文件的文件描述符(由 struct file 表示),该文件描述符指向文件 inode及其对应的 address_space .此 address_space需要在“页面缓存”中专门从该文件中查找页面。

关于Linux 内核 - 页缓存、结构地址空间和内存 cgroup 之间的关系是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68593830/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com