Linux 以/proc/smap为单位的大型输出
我正在查看使用libasan(-fsanize=address)编译的程序的/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
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的数量除以用户的数量(所以当两个程序共享内存时,可以避免重复计算)