web-dev-qa-db-ja.com

「Shmem」を分解する方法RAM Linuxでの使用

大量のメモリを消費するゲームの問題をデバッグしています。基本的に、24 GBのすべてが利用可能RAMであり、8 GBのスワップが開始後数分でなくなります。メモリは、プロセス自体(topのRSSに従って)、ただし/proc/meminfoShmemに分類されるようです。これは、このプロセスの実行中に値を記録することに基づいています。グラフをご覧ください ここ (生データ ここ )。

現在、私はShmemをより具体的なものに分解しようとしています。私は投稿を見てきました here は、以下がShmemに含まれていることを言及しています:

  1. tmpfsメモリ
  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))

私は現在、RAMを食べる途中でSIGSTOPpedのプロセスを実行しています。

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のスワップが構成されている)
  • インテルCore i3-6100
  • 500 GB SSD
  • サファイアRadeon RX470 4GB(AMDGPU-PROドライバー、v17.10)
5
Chris Hunt

shmemメモリ使用量(およびその他)の詳細については、ipcsコマンドを使用します。

から man ipcs

Ipcsの名前-IPCファシリティに関する情報を表示

SYNOPSIS ipcs [オプション]

説明ipcsは、呼び出しプロセスが読み取りアクセス権を持つプロセス間通信機能に関する情報を示します。デフォルトでは、3つすべてのリソース(共有メモリセグメント、メッセージキュー、セマフォ配列)に関する情報が表示されます。

例として、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       
1
Rui F Ribeiro