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

따라서 여전히 7GB가 누락되어 있으며 메모리 소비를 이해하기에는 아직 멀었습니다.

나는 몇 시간 동안 커널 코드 작업을 해왔지만 2, 4, 5를 알아내는 데 거의 진전이 없었습니다. 필요한 경우 의견을 제공할 수 있습니다. 내 질문:"공유 메모리"로 분류될 수 있는 유일한 다른 값인가요? 특정 값을 어떻게 얻을 수 있나요?

중요한 경우 내 시스템은 다음과 같습니다.

  • Ubuntu 16.04.2 LTS(KDE 5.5.5 포함)
  • 24GB RAM(+8GB 스왑 구성)
  • 인텔 코어 i3-6100
  • 500GB 솔리드 스테이트 드라이브
  • Sapphire Radeon RX470 4GB(AMDGPU-PRO 드라이버, v17.10 포함)

답변1

메모리 사용량(및 추가 정보) 에 대해 자세히 알아보려면 shmem이 명령을 사용할 수 있습니다 ipcs.

~에서인간 IPCS

이름 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       

관련 정보