多くのメモリを消費するゲームの問題をデバッグしていますが、基本的に使用可能な24GBのRAMと8GBのスワップ領域が起動後数分以内にすべて消えます。メモリはプロセス自体に関連付けられていませんが(のRSSによる)とtop
分類されているようです。これは、プロセスが実行されたときの値を記録することに基づいており、写真で見ることができますShmem
/proc/meminfo
ここ(生データここ)。
Shmem
今私はそれをより具体的なものに分解しようとしています。私は投稿を読んだ。ここ次の内容が含まれていると言われていますShmem
。
- 一時ファイルシステムメモリ
- SysV共有メモリ
- POSIX 共有メモリ
- 共有匿名マッピング
- 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スワップ構成)
- インテルCore i3-6100
- 500GBソリッドステートドライブ
- Sapphire Radeon RX470 4GB(AMDGPU-PROドライバ、v17.10を含む)
答え1
メモリ使用量(および追加情報)の詳細については、shmem
このコマンドを使用できますipcs
。
~から人間IPCS
名前 ipcs - IPC 施設に関する情報を表示します。
要約 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