共享内存占用 GB

共享内存占用 GB

我遇到了一个未知实体占用大量 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

相关内容