AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 431982
Accepted
sourcejedi
sourcejedi
Asked: 2018-03-19 15:12:12 +0800 CST2018-03-19 15:12:12 +0800 CST 2018-03-19 15:12:12 +0800 CST

什么可以使用我的 6GB 交换空间?

  • 772

我有一个谜:什么在使用我的 6GB 交换空间?我的内核版本是4.15.9-300.fc27.x86_64.

这发生在一些崩溃之后。 dmesg显示我在 gnome-shell 进程(属于 gdm)和后来的一些 firefox 进程(Chrome_~dThread,在 libxul.so 中)中有段错误。 coredumpctl -r在我当前的启动中没有显示其他崩溃。

1.free和df -t tmpfs

# free -h
              total        used        free      shared  buff/cache   available
Mem:           7.7G        1.2G        290M        5.4G        6.1G        761M
Swap:          7.8G        6.0G        1.8G

# swapoff -a
swapoff: /dev/dm-1: swapoff failed: Cannot allocate memory

# df -h -t tmpfs
Filesystem      Size  Used Avail Use% Mounted on
tmpfs           3.9G   17M  3.9G   1% /dev/shm
tmpfs           3.9G  1.9M  3.9G   1% /run
tmpfs           3.9G     0  3.9G   0% /sys/fs/cgroup
tmpfs           3.9G   40K  3.9G   1% /tmp
tmpfs           786M   20K  786M   1% /run/user/1000

我还手动检查了每个进程的挂载命名空间是否有任何额外的 tmpfs。没有其他挂载的 tmpfs(或者它们是相同的 - 所以只有 17M,并且有不到 10 个不同的挂载命名空间)。

2.ipcs

# ipcs --human

------ Message Queues --------
key        msqid      owner      perms      size         messages    

------ Shared Memory Segments --------
key        shmid      owner      perms      size       nattch     status      
0x00000000 20643840   alan-sysop 600          512K     2          dest         
0x00000000 22970369   alan-sysop 600           36K     2          dest         
0x00000000 20774914   alan-sysop 600          512K     2          dest         
0x00000000 20905987   alan-sysop 600          3.7M     2          dest         
0x00000000 23461892   alan-sysop 600            2M     2          dest         
0x00000000 20873221   alan-sysop 600          3.7M     2          dest         
0x00000000 22511622   alan-sysop 600            2M     2          dest         
0x00000000 28278791   alan-sysop 600           60K     2          dest         
0x00000000 23003144   alan-sysop 600           36K     2          dest         
0x00000000 27394057   alan-sysop 600           60K     2          dest         
0x00000000 29622282   alan-sysop 600          156K     2          dest         
0x00000000 27426828   alan-sysop 600           60K     2          dest         
0x00000000 28246029   alan-sysop 600           60K     2          dest         
0x00000000 29655054   alan-sysop 600          156K     2          dest         
0x00000000 29687823   alan-sysop 600          512K     2          dest         

------ Semaphore Arrays --------
key        semid      owner      perms      nsems     
0x002fa327 98304      root       600        2

3.进程内存

每个进程的交换使用脚本说进程内存只占 54MB 的交换:

PID=1 swapped 2292 KB (systemd)
PID=605 swapped 4564 KB (systemd-udevd)
PID=791 swapped 324 KB (auditd)
PID=793 swapped 148 KB (audispd)
PID=797 swapped 232 KB (sedispatch)
PID=816 swapped 120 KB (mcelog)
PID=824 swapped 1544 KB (ModemManager)
PID=826 swapped 152 KB (rngd)
PID=827 swapped 300 KB (avahi-daemon)
PID=829 swapped 1688 KB (abrtd)
PID=830 swapped 836 KB (systemd-logind)
PID=831 swapped 432 KB (dbus-daemon)
PID=843 swapped 368 KB (chronyd)
PID=848 swapped 312 KB (avahi-daemon)
PID=854 swapped 476 KB (gssproxy)
PID=871 swapped 1140 KB (abrt-dump-journ)
PID=872 swapped 1280 KB (abrt-dump-journ)
PID=873 swapped 1236 KB (abrt-dump-journ)
PID=874 swapped 14196 KB (firewalld)
PID=911 swapped 592 KB (mbim-proxy)
PID=926 swapped 1356 KB (NetworkManager)
PID=943 swapped 17936 KB (libvirtd)
PID=953 swapped 200 KB (atd)
PID=955 swapped 560 KB (crond)
PID=1267 swapped 284 KB (dnsmasq)
PID=1268 swapped 316 KB (dnsmasq)
PID=10397 swapped 160 KB (gpg-agent)
PID=14862 swapped 552 KB (systemd-journal)
PID=18131 swapped 28 KB (login)
PID=18145 swapped 384 KB (bash)
Overall swap used: 54008 KB

  1. 到目前为止,我假设没有umount -l在完整的 tmpfs 上使用过的程序。我没有尝试为任何持有这种隐藏 tmpfs 打开的人抓取 /proc/*/fd 。

  2. 我想我也假设没有人建造了一个巨人memfd并把它打开……哈哈,我为什么会怀疑这样的事情……呜咽。

附加到进程的 memfd 名称对我来说似乎是无辜的:

# ls -l /proc/*/fd/* 2>/dev/null|grep /memfd:
lrwx------. 1 alan-sysop alan-sysop 64 Mar 18 22:52 /proc/20889/fd/37 -> /memfd:xshmfence (deleted)
lrwx------. 1 alan-sysop alan-sysop 64 Mar 18 22:52 /proc/20889/fd/53 -> /memfd:xshmfence (deleted)
lrwx------. 1 alan-sysop alan-sysop 64 Mar 18 22:52 /proc/20889/fd/54 -> /memfd:xshmfence (deleted)
lrwx------. 1 alan-sysop alan-sysop 64 Mar 18 22:52 /proc/20889/fd/55 -> /memfd:xshmfence (deleted)
lrwx------. 1 alan-sysop alan-sysop 64 Mar 18 22:52 /proc/20889/fd/57 -> /memfd:xshmfence (deleted)
lrwx------. 1 alan-sysop alan-sysop 64 Mar 18 22:52 /proc/20889/fd/60 -> /memfd:xshmfence (deleted)
lrwx------. 1 alan-sysop alan-sysop 64 Mar 18 22:52 /proc/21004/fd/6 -> /memfd:pulseaudio (deleted)

这些 memfd 看起来是无辜的,因为: Process 20889 是我当前的Xorg,它在 6GB 交换之后。同样,进程 21004 确实是我的 pulseaudio 进程,并且该进程的创建时间晚于建立 6GB 的交换。

理论上,我担心的那些也可能处于不确定状态,附加到 unix 套接字消息并且从未阅读过。


编辑1

在停止systemd-logind(本地 Xorg 通过死亡来响应)并重新启动 Xorg 之后,我看到整个 6GB 的交换空间都被清除了。

注意我忘了我需要重新开始登录。虽然 lennart 告诉我 logind 不应该被总线激活,但 logind 立即重新启动。这是来自journalctl -b,即系统日志,中间没有删除任何消息:

Mar 18 23:14:12 alan-laptop systemd[1]: Stopped Login Service.
Mar 18 23:14:12 alan-laptop dbus-daemon[831]: [system] Activating via systemd: service name='org.freedesktop.login1' unit='dbus-org.freedesktop.login1
Mar 18 23:14:12 alan-laptop systemd[1]: Starting Login Service...

这与 logind 相关,然后经历了几次崩溃的循环。这是这个版本的 logind 的预期结果(修复它的 PR 已在上游合并,在我的问题报告之后)。

所以这并不能完全隔离一个单独的原因,我真的应该在杀死它之前检查 fds logind 所持有的。

问题

我在上述检查中是否遗漏了任何可能的交换用户? (非破坏性的,在 EDIT1 之前)。

有没有更好的方法来获取我上面列出的任何可能的用户的使用报告?也就是说,是否有一种替代方法可以纠正我没有注意到的一些不准确之处?或者更容易运行,并在再次发生这种情况时获得快速结果的东西?

有没有人有一个很好的脚本来检查 fds 打开一个“隐藏的”tmpfs(一个与 tmpfs 分离的 tmpfs umount -l)?

有没有人有一个很好的方法来检查 memfds 的内存使用情况?

有什么方法可以检查在未读的 unix 套接字消息中是否存在大量 memfds?(这些天才中的任何一个在实现 memfds 时是否考虑过这一点,memfds 是明确用于传递 unix 套接字的?)

EDIT2:我是否正确猜测图形设备(DRM)的文件描述符可以包含对可交换内存的引用?Notelogind包含这样的文件描述符。

swap resources
  • 1 1 个回答
  • 633 Views

1 个回答

  • Voted
  1. Best Answer
    sourcejedi
    2018-03-19T17:08:40+08:002018-03-19T17:08:40+08:00

    EDIT1在停止 systemd-logind(本机 Xorg 通过死亡来响应)并重新启动 Xorg 之后,我看到整个 6GB 的交换空间都被清除了。

    第二次之后,我可以确认这是 systemd-logind 中的一个错误。 logind记得关闭它持有的 DRM fd 的副本,但它无法关闭保存在 PID1 中的副本(用于支持 logind 的“无缝”重启):

    $ sudo lsof /dev/dri/card0 | grep systemd
    [sudo] password for alan-sysop: 
    lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
          Output information may be incomplete.
    systemd      1       root   16u   CHR  226,0      0t0 14690 /dev/dri/card0
    systemd      1       root   87u   CHR  226,0      0t0 14690 /dev/dri/card0
    systemd      1       root  101u   CHR  226,0      0t0 14690 /dev/dri/card0
    systemd      1       root  106u   CHR  226,0      0t0 14690 /dev/dri/card0
    systemd      1       root  110u   CHR  226,0      0t0 14690 /dev/dri/card0
    systemd-l  860       root   21u   CHR  226,0      0t0 14690 /dev/dri/card0
    systemd-l  860       root   25u   CHR  226,0      0t0 14690 /dev/dri/card0
    

    这感觉很像一个已知的错误,应该已经在 systemd 的 v238 中修复。


    实际上,每次我登录和退出 GNOME 时,logind 似乎都会以这种方式泄漏 DRM fd。大概只有当显示服务器不干净地关闭时,此错误才会变得明显,因此它们没有机会释放附加到其 DRM fd 的缓冲区。

    EDIT2:我是否正确猜测图形设备(DRM)的文件描述符可以包含对可交换内存的引用?注意 logind 持有这样的文件描述符。

    回答:是的。

    菲尔普

    SHMEM 文件节点用作可交换缓冲区对象的后备存储。

    -- https://www.kernel.org/doc/html/v4.15/gpu/drm-mm.html

    据我了解,这里的“SHMEM 文件节点”与 tmpfs 文件/memfd 的工作完全相同。上面的引用是关于“GEM 缓冲区对象”...

    mmap 系统调用不能直接用于映射 GEM 对象,因为它们没有自己的文件句柄。目前有两种替代方法可以将 GEM 对象映射到用户空间……第二种方法使用 DRM 文件句柄上的 mmap 系统调用。

    -- https://01.org/linuxgraphics/gfx-docs/drm/drm-memory-management.html#id-1.3.4.6.6.8

    结论:有人真的应该仔细检查 logind 中的当前代码,因为它与文件句柄的关闭有关:)。


    附录:如何尝试排除 memfds

    有没有人有一个很好的方法来检查 memfds 的内存使用情况?

    memfds 的内存使用情况可以stat --dereference通过. 要么是文件描述符,要么 - 你忘记了 -内存映射对象。du -D/proc/$PIDfd/$FDmap_files/...

    我对此并没有非常好的便利,但您至少可以搜索最大的单个 FD 或映射文件。(下面的示例不是额外的证据;它是在 6GB 的交换使用量消失后拍摄的)。

    $ sudo du -aLh /proc/*/map_files/ /proc/*/fd/ | sort -h | tail -n 10
    du: cannot access '/proc/self/fd/3': No such file or directory
    du: cannot access '/proc/thread-self/fd/3': No such file or directory
    108M    /proc/10397/map_files/7f1e141b4000-7f1e1ad84000
    111M    /proc/14862/map_files/
    112M    /proc/10397/map_files/
    113M    /proc/18324/map_files/7efdda2fb000-7efddaafb000
    121M    /proc/18324/map_files/7efdea2fb000-7efdeaafb000
    129M    /proc/18324/map_files/7efdc82fb000-7efdc8afb000
    129M    /proc/18324/map_files/7efdd42fb000-7efdd4afb000
    129M    /proc/18324/map_files/7efde52fb000-7efde5afb000
    221M    /proc/26350/map_files/
    3.9G    /proc/18324/map_files/
    
    $ ps -x -q 18324
      PID TTY      STAT   TIME COMMAND
    18324 pts/1    S+     0:00 journalctl -b -f
    
    $ ps -x -q 26350
      PID TTY      STAT   TIME COMMAND
    26350 ?        Sl     4:35 /usr/lib64/firefox/firefox
    
    $ sudo ls -l /proc/18324/map_files/7efde52fb000-7efde5afb000
    lr--------. 1 root root 64 Mar 19 00:32 /proc/18324/map_files/7efde52fb000-7efde5afb000
    -> /var/log/journal/f211872a957d411a9315fd911006ef03/user-1001@c3f024d4b01f4531b9b69e0876e42af8-00000000002e2acf-00055bbea4d9059d.journal
    
    • 0

相关问题

  • 为什么 Linux 在 VM 中需要交换空间?

  • 当根分区和 RAM 足够大时,是否需要交换分区?[复制]

  • Linux 交换分区是否支持修剪?

  • 在 Arch Linux 中手动安装交换文件而不是交换分区

  • 使用 zswap 和 max_pool_percent = 100 防止 zram LRU 反转

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve