我遇到了一个未知实体占用大量 RAM 的问题。它未在 中列出top
,但可用内存量会随着时间的推移而减少,关闭所有程序也无济于事。目前是 3.6 GiB,但情况正在慢慢恶化。可能是因为系统无法换出太多内存,在换出大约 1.5 GiB 内存后,系统就开始出现抖动。
我使用该free -m
命令得到了这个结果:
total used free shared buff/cache available
Mem: 7875 3517 388 3595 3969 481
Swap: 9536 500 9036
看来共享内存占用了 3.5 GB。
这是我运行时得到的结果df -h
:
udev 3,9G 0 3,9G 0% /dev
tmpfs 788M 80M 709M 11% /run
/dev/sdb6 23G 18G 4,1G 81% /
tmpfs 3,9G 168M 3,7G 5% /dev/shm
tmpfs 5,0M 4,0K 5,0M 1% /run/lock
tmpfs 3,9G 0 3,9G 0% /sys/fs/cgroup
/dev/sdb1 356M 76M 281M 22% /boot/efi
/dev/sdb8 37G 33G 2,0G 95% /home
/dev/sda2 746G 269G 477G 37% /data
/dev/sda3 184G 132G 43G 76% /lindata
tmpfs 788M 84K 788M 1% /run/user/1000
/home/dugi/.Private 37G 33G 2,0G 95% /home/dugi
/proc/meminfo/
包含这个,看起来它确实是共享内存中的东西:
MemTotal: 8064776 kB
MemFree: 318880 kB
MemAvailable: 493992 kB
Buffers: 36784 kB
Cached: 3960388 kB
SwapCached: 32776 kB
Active: 3732236 kB
Inactive: 3539036 kB
Active(anon): 3562316 kB
Inactive(anon): 3381848 kB
Active(file): 169920 kB
Inactive(file): 157188 kB
Unevictable: 732 kB
Mlocked: 732 kB
SwapTotal: 9765884 kB
SwapFree: 9253044 kB
Dirty: 516 kB
Writeback: 0 kB
AnonPages: 3269552 kB
Mapped: 493840 kB
Shmem: 3670056 kB
Slab: 264136 kB
SReclaimable: 136840 kB
SUnreclaim: 127296 kB
KernelStack: 23296 kB
PageTables: 82464 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 13798272 kB
Committed_AS: 20782644 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 0 kB
VmallocChunk: 0 kB
HardwareCorrupted: 0 kB
AnonHugePages: 831488 kB
ShmemHugePages: 0 kB
ShmemPmdMapped: 0 kB
CmaTotal: 0 kB
CmaFree: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 1783952 kB
DirectMap2M: 6498304 kB
DirectMap1G: 0 kB
但是,当我使用列出共享内存中的内容时ipcs --human
,我只得到几百兆字节的已删除内存:
------ Message Queues --------
key msqid owner perms size messages
------ Shared Memory Segments --------
key shmid owner perms size nattch status
0x00000000 268959744 dugi 600 386,8K 2 dest
0x00000000 265879554 dugi 600 512K 2 dest
0x00000000 557059 dugi 600 16M 2 dest
0x00000000 6258692 dugi 600 1K 2 dest
0x00000000 271974405 dugi 600 512K 2 dest
0x00000000 31784966 dugi 600 16M 2 dest
0x00000000 819207 dugi 600 16M 2 dest
0x00000000 274464776 dugi 600 512K 2 dest
0x00000000 28704777 dugi 600 512K 2 dest
0x00000000 274694154 dugi 600 512K 2 dest
0x00000000 264372236 dugi 600 512K 2 dest
0x00000000 272465933 dugi 600 4M 2 dest
0x00000000 145522702 dugi 600 16M 2 dest
0x00000000 274563088 dugi 600 7,6M 2 dest
0x00000000 113934353 dugi 600 74K 2 dest
0x00000000 215908370 dugi 600 66,2K 2 dest
0x00000000 35913747 dugi 600 512K 2 dest
0x00000000 274595860 dugi 600 7,6M 2 dest
0x00000000 149946389 dugi 600 512K 2 dest
0x00000000 273842198 dugi 600 128M 2 dest
0x00000000 115015703 dugi 600 29,3K 2 dest
0x00000000 150044696 dugi 600 64M 2 dest
0x00000000 143425561 dugi 600 32,5K 2 dest
0x00000000 150011930 dugi 600 1M 2 dest
0x00000000 149749788 dugi 600 512K 2 dest
0x00000000 149848094 dugi 600 64M 2 dest
0x00000000 149815327 dugi 600 1M 2 dest
0x00000000 166363168 dugi 700 2,2M 2 dest
0x00000000 166395937 dugi 600 384K 2 dest
0x00000000 166428706 dugi 600 512K 2 dest
0x00000000 166461475 dugi 700 53,5K 2 dest
0x00000000 166625316 dugi 700 376,6K 2 dest
0x00000000 166658088 dugi 700 13,5K 2 dest
0x00000000 166690857 dugi 700 88,7K 2 dest
------ Semaphore Arrays --------
key semid owner perms nsems
如果我使用ipcs -m | awk '{sum+=$5} END{print sum}'
,它会显示有 366790104 字节,也就是 366 MB。这比它占用的要少得多。
我正在使用已升级到 17.04 的 Ubuntu 16.04。升级之前就已经存在此问题。我几乎经常使用的程序是 QtCreator、Vivaldi、evince、gcc 以及常用的程序,例如 gnome shell、nautilus 或 gedit。
内存从未被换出,我无法通过 Google 找到原因,或者只能每天删除一次或强制交换内存,或者其他方法,我不想每周重启几次电脑。有什么想法可以解决此问题吗?
编辑:我曾看到它不知为何占用了大约 120 兆字节的内存。我当时关闭了 Vivaldi(它大量使用共享内存),因为我怀疑它导致了这个问题。我当时唯一做的事情就是在上次重启后第一次打开 Firefox(Firefox 本身不可能是原因,因为我没有在这些 GB 被填满之前运行它)。
编辑 #2:重新启动 X 服务器会从共享内存中删除内容,但这不是解决方案,因为 X 服务器正是我不想重新启动的东西(gnome-shell --replace 没有帮助)。如果我没有记错有关共享内存的课程,这意味着内存被与 X 服务器或 Gnome-shell 相关的某个东西占用,它在退出时正确地释放了它,但在运行时从不将其删除(某种损坏的垃圾收集?)。
编辑#3:我想知道这是否与此相关:https://github.com/mpv-player/mpv/issues/3931
答案1
也许 smemstat 会显示内存占用情况。使用:
sudo apt-get install smemstat
sudo smemstat