如何在 Linux 中细分“Shmem”RAM 使用情况

如何在 Linux 中细分“Shmem”RAM 使用情况

我正在调试一个消耗大量内存的游戏的问题,基本上所有 24GB 可用 RAM 和 8GB 交换空间在启动后几分钟就消失了。内存与进程本身没有关联(根据 中的 RSS top),但似乎被分类在Shmem/proc/meminfo。这是基于记录该过程执行时的值,您可以在图中看到这里(原始数据这里)。

现在我正试图分解Shmem成更具体的东西。我看过帖子这里其中提到以下内容包含在Shmem

  1. 临时文件系统内存
  2. SysV共享内存
  3. POSIX 共享内存
  4. 共享匿名映射
  5. 用于 GEM 的页面

我很快整理了这个脚本:

import glob
import os
import re


import psutil


shmem_users = []
# tmpfs memory
disks = psutil.disk_partitions(all=True)
paths = [d.mountpoint for d in disks if d.fstype == 'tmpfs']
tmpfs_usage = sum(psutil.disk_usage(p).used for p in paths)
shmem_users.append({
    'name': 'tmpfs',
    'size': tmpfs_usage
})

# /dev/shm
dev_shm_size = 0
for p in glob.glob('/dev/shm/*'):
    try:
        sz = os.stat(p).st_size
        dev_shm_size += sz
    except:
        # e.g. permission errors
        pass
shmem_users.append({
    'name': '/dev/shm',
    'size': dev_shm_size
})

# TODO: SysV shared memory

# TODO: shared anonymous mappings

# TODO: GEM allocated pages

with open('/proc/meminfo') as f:
    m = re.search(r'Shmem: *(?P<kbs>\d+)', f.read())
    if not m:
        raise RuntimeError('Could not find Shmem value.')
    total_shmem = int(m.group('kbs')) * 1024

print('Total shmem: {}'.format(total_shmem))
total_shmem_accounted_for = sum(u['size'] for u in shmem_users)
print('Total shmem found: {}'.format(total_shmem_accounted_for))
print('Shmem unknown: {}'.format(total_shmem - total_shmem_accounted_for))

我的进程目前SIGSTOP正在吃掉我的 RAM,它返回:

Total shmem: 8450904064
Total shmem found: 681805504
Shmem unknown: 7769098560

因此仍有 7 GB 下落不明,距离了解内存消耗情况还差得很远。

我已经研究了几个小时的内核代码,但在弄清楚 2、4 和 5 方面进展甚微。如果需要,我可以提供注释。我的问题:这些是唯一可以归类为“共享内存”的其他值吗?我如何获取它们的具体值?

如果重要的话我的系统是:

  • Ubuntu 16.04.2 LTS(带有 KDE 5.5.5)
  • 24 GB RAM(+8 GB 交换配置)
  • 英特尔酷睿 i3-6100
  • 500GB 固态硬盘
  • 蓝宝石 Radeon RX470 4GB(带 AMDGPU-PRO 驱动程序,v17.10)

答案1

要详细了解shmem内存使用情况(以及更多信息),您可以使用该ipcs命令。

人IPCS

NAME ipcs - 显示有关 IPC 设施的信息

概要 ipcs [选项]

说明 ipcs 显示有关调用进程具有读取访问权限的进程间通信设施的信息。默认情况下,它显示有关所有三种资源的信息:共享内存段、消息队列和信号量数组。

作为示例,我在 Apache 服务器中运行它:

$ipcs

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages    

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0xf4123d98 20643870   root       600        3294       12                      
0xfb123d9b 20676639   root       600        1242       12                      
0x0a123d9d 20709408   root       600        3294       12                      
0x91123da0 20742177   root       600        1242       12                      
0x75123da2 20774946   root       600        3294       12                      
0xbc123da5 20807715   root       600        1242       12                      
0x3d123da7 20840484   root       600        3294       12                      
0x84123daa 20873253   root       600        1242       12                      
0x47123dac 20906022   root       600        3294       12                      
0x0e123daf 20938791   root       600        1242       12                      
0xa6123db1 20971560   root       600        3294       12                      
0x2d123db4 21004329   root       600        1242       12                      
0x77123db6 21037098   root       600        3294       12                      
0x3e123db9 21069867   root       600        1242       12                      
0x80123dbb 21102636   root       600        3294       12                      
0x87123dbe 21135405   root       600        1242       12                      
0xa4123dc0 21168174   root       600        3294       12                      
0xab123dc3 21200943   root       600        1242       12                      
0xfd123dc5 21233712   root       600        3294       12                      
0x44123dc8 21266481   root       600        1242       12                      
0x96123dca 21299250   root       600        3294       12                      
0x1d123dcd 21332019   root       600        1242       12                      
0xa4123dcf 21364788   root       600        3294       12                      
0xab123dd2 21397557   root       600        1242       12                      
0x7a123dd4 21430326   root       600        3294       12                      
0x01123dd7 21463095   root       600        1242       12                      
0xd9123dd9 21495864   root       600        3294       12                      
0x20123ddc 21528633   root       600        1242       12                      
0x86123dde 21561402   root       600        3294       12                      
0x0d123de1 21594171   root       600        1242       12                      

------ Semaphore Arrays --------
key        semid      owner      perms      nsems     
0x00000000 425984     www-data   600        1         
0x00000000 1441793    www-data   600        1         
0x00000000 1474562    www-data   600        1       

相关内容