O que poderia estar usando 6GB do meu swap?

2

Eu tenho um mistério: o que está usando 6GB do meu swap? Minha versão do kernel é 4.15.9-300.fc27.x86_64 .

Isso aconteceu depois de algumas falhas. dmesg mostra que eu tinha um segfault em um processo do gnome-shell (que pertencia ao gdm) e mais tarde alguns processos do firefox (Chrome_ ~ dThread, em libxul.so). coredumpctl -r não mostra outras falhas na minha inicialização atual.

1. free e 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

Eu também verifiquei manualmente o namespace de montagem de cada processo, para qualquer tmpfs extra. Não havia outros tmpfs montados (ou eram os mesmos - portanto, apenas 17M e havia menos de 10 namespaces de montagem diferentes).

2. %código%

# 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. Memória de processo

O swap por processo script de uso diz que a memória de processo é responsável por apenas 54MB de swap:

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. Até agora eu estou supondo que não há nenhum programa negligente que usou ipcs em um tmpfs completo. Eu não tentei raspar / proc / * / fd para qualquer um que tenha um tmpf como esse escondido.

  2. Suponho que eu também esteja assumindo que ninguém construiu um umount -l gigante e o está mantendo aberto ... haha por que eu suspeitaria de tal coisa ... soluço.

Os nomes memfd anexados aos processos parecem inocentes para mim:

# 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)

Esses memfds parecem inocentes porque: Process 20889 é o meu atual memfd , que pós-data os 6GB de swap. Da mesma forma, o processo 21004 é de fato meu processo pulseaudio, e o tempo de criação desse processo é posterior ao fato de que os 6 GB de swap foram criados.

Em teoria, os que eu estou preocupado também podem estar no limbo, anexados a uma mensagem unix de socket e nunca ler.

EDIT1

Depois de parar o Xorg - ao qual o Xorg nativo responde morrendo - e reiniciar o Xorg, vejo todos os 6GB de swap apagados.

Note que eu esqueci que precisava iniciar o login novamente. Embora lennart me tenha dito que o logind não deveria ser ativado pelo barramento, o logind foi imediatamente reiniciado. Isso é de systemd-logind , ou seja, o log do sistema, sem nenhuma mensagem removida entre:

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...

Isso é relevante nesse logind e passou por um ciclo de algumas falhas. Isso é esperado para esta versão do logind (os PRs para corrigi-lo foram mesclados no upstream, seguindo meus relatórios de problemas).

Então isso não isola completamente uma causa individual, e eu realmente deveria ter verificado se o find logind estava em espera antes de matá-lo.

Pergunta

Existe algum usuário de swap possível que eu perdi nas verificações acima? (As não destrutivas, anteriores a EDIT1).

Existe uma maneira melhor de obter relatórios de uso para qualquer um dos possíveis usuários listados acima? Ou seja, uma alternativa que corrige alguma imprecisão que eu não notei? Ou algo que será mais fácil de executar e obter um resultado rápido quando isso acontecer novamente?

Alguém tem um bom script para verificar se há fds segurando um tmpfs "oculto" (um tmpfs que foi separado com journalctl -b )?

Alguém tem uma maneira legal de verificar o uso de memória do memfds?

Existe alguma maneira de verificar se memfds massivos foram deixados no limbo em uma mensagem de soquete unix não lida? (Algum desses gênios pensou sobre isso ao implementar memfds, que foram explicitamente destinados a passar por sockets unix?)

EDIT2 : Estou certo em adivinhar que um descritor de arquivo de um dispositivo gráfico (DRM) pode conter uma referência à memória intercambiável? Nota umount -l contém esses descritores de arquivos.

    
por sourcejedi 19.03.2018 / 00:12

1 resposta

0

EDIT1 After stopping systemd-logind - which native Xorg responds to by dying - and restarting Xorg, I see the entire 6GB of swap wiped out.

Após a segunda vez, posso confirmar que isso é um bug no systemd-logind. logind se lembra de fechar a cópia do DRM fd que ele contém, mas não consegue fechar a cópia que é mantida em PID1 (usado o suporte "reinicialização contínua" do 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

Isso parece muito com um bug conhecido, que já deve estar corrigido na v238 do systemd .

De fato, o logind parece estar vazando um DRM fd dessa forma toda vez que eu entro e saio do GNOME. Presumivelmente, esse bug só se torna óbvio quando você tem servidores de exibição desligados impuros, para que eles não tenham a chance de desalocar os buffers anexados ao seu DRM fd.

EDIT2: Am I right to guess that a file descriptor of a graphics device (DRM), can hold a reference to swappable memory? Note logind holds such file descriptors.

Resposta: sim.

filp

SHMEM file node used as backing storage for swappable buffer objects.

- link

Pelo que entendi, "nó do arquivo SHMEM" aqui é algo que faz exatamente o mesmo trabalho que um arquivo tmpfs / memfd. A citação acima é referente a um "objeto buffer GEM" ...

The mmap system call can't be used directly to map GEM objects, as they don't have their own file handle. Two alternative methods currently co-exist to map GEM objects to userspace... The second method uses the mmap system call on the DRM file handle.

- link

CONCLUSÃO: alguém deve realmente checar novamente o código atual no logind no que se refere ao fechamento de identificadores de arquivo:).

Apêndice: como você pode tentar descartar memfds

Does anyone have a nice way to check memory usage of memfds?

O uso de memória dos memfds pode ser lido usando stat --dereference ou du -D no link simbólico mágico em /proc/$PID . Em fd/$FD para um descritor de arquivo ou - que você esqueceu - map_files/... para objetos mapeados pela memória.

Eu não tenho uma conveniência muito boa para isso, mas você pode pelo menos procurar os FDs individuais mais maciços ou arquivos mapeados. (O exemplo abaixo não é uma evidência adicional; foi tirado depois que os 6GB de uso de troca foram embora).

$ 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
    
por 19.03.2018 / 02:08