Linux 以/proc/smap为单位的大型输出

Linux 以/proc/smap为单位的大型输出,linux,Linux,我正在查看使用libasan(-fsanize=address)编译的程序的/proc//smap。 我看到一些巨大的尺寸,我试图理解它的含义。 例如: 2008fff7000-10007fff8000 rw-p 00000000 00:00 0 Size: 15032123396 kB Rss: 142592 kB Pss: 142592 kB Shared_Clean: 0 kB Shared_Dir

我正在查看使用libasan(-fsanize=address)编译的程序的/proc//smap。 我看到一些巨大的尺寸,我试图理解它的含义。 例如:

2008fff7000-10007fff8000 rw-p 00000000 00:00 0 
Size:           15032123396 kB
Rss:              142592 kB
Pss:              142592 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:    142592 kB
Referenced:       142592 kB
Anonymous:        142592 kB
AnonHugePages:         0 kB
Shared_Hugetlb:        0 kB
Private_Hugetlb:       0 kB
Swap:                  0 kB
SwapPss:               0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
Locked:                0 kB
VmFlags: rd wr mr mw me nr dd nh 
总尺寸总计为21475147836K

我正在使用内核为4.4.19-29.55.amzn1.x86_64的Amazon Linux AMI 2018.03版


有什么想法吗?

ASAN的工作原理是每8字节用户内存保留一个字节(称为影子字节)。每次访问内存时都会检查卷影字节,每次更改分配状态时都会更新卷影字节

在x86_64上的Linux上运行的进程有大约2^47字节的可用可寻址空间,因此ASAN将这些影子字节映射为大约2^47*1/9~=15TB


这就是您看到的映射。

ASAN的工作原理是每8字节用户内存保留一个字节(称为影子字节)。每次访问内存时都会检查卷影字节,每次更改分配状态时都会更新卷影字节

在x86_64上的Linux上运行的进程有大约2^47字节的可用可寻址空间,因此ASAN将这些影子字节映射为大约2^47*1/9~=15TB


这就是您看到的映射。

我想我不明白阴影字节是如何工作的。就最终导致主机内存不足的实际内存使用而言,这意味着什么?在粘贴中,该程序使用15TB映射中的142592kB RAM作为阴影字节。ASAN内存开销通常为2-4倍,其中此映射中的阴影字节只占一小部分。经常分配和取消分配的程序使用了过多的内存,因为ASAN避免了重复使用内存区域以允许在释放bug后捕获使用。此粘贴中的哪些属性指的是实际使用的内存?这只是smaps输出的一个片段,过去我只是将'Size'属性相加,以了解所使用的总内存。“Size”是为该段保留的虚拟地址空间量。“Rss”是实际使用的内存量。加起来最好的数字是“Pss”,因为它是用RAM的数量除以用户的数量(这样当两个程序共享内存时可以避免重复计算),我想我不明白影子字节是如何工作的。就最终导致主机内存不足的实际内存使用而言,这意味着什么?在粘贴中,该程序使用15TB映射中的142592kB RAM作为阴影字节。ASAN内存开销通常为2-4倍,其中此映射中的阴影字节只占一小部分。经常分配和取消分配的程序使用了过多的内存,因为ASAN避免了重复使用内存区域以允许在释放bug后捕获使用。此粘贴中的哪些属性指的是实际使用的内存?这只是smaps输出的一个片段,过去我只是将'Size'属性相加,以了解所使用的总内存。“Size”是为该段保留的虚拟地址空间量。“Rss”是实际使用的内存量。加起来最好的数字是“Pss”,因为它是用RAM的数量除以用户的数量(所以当两个程序共享内存时,可以避免重复计算)