unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
From: Eli Zaretskii <eliz@gnu.org>
To: Trevor Bentley <trevor@trevorbentley.com>
Cc: 43389@debbugs.gnu.org
Subject: bug#43389: 28.0.50; Emacs memory leaks
Date: Fri, 30 Oct 2020 10:00:29 +0200	[thread overview]
Message-ID: <83imasb0te.fsf@gnu.org> (raw)
In-Reply-To: <874kmcvlbj.fsf@mail.trevorbentley.com> (message from Trevor Bentley on Thu, 29 Oct 2020 21:17:20 +0100)

> From: Trevor Bentley <trevor@trevorbentley.com>
> Date: Thu, 29 Oct 2020 21:17:20 +0100
> 
> It doesn't start leaking until it has been active for 2-3 days. 
> It might depends on other factors, such as suspending or losing 
> network connectivity.  Once the leak triggers, it grows at a rate 
> of about 1MB every few seconds. My machine has 32GB, so it gets 
> pretty far before I notice and kill it. I'm not sure if there is a 
> limit.
> 
> I built emacs with debug symbols and dumped some strace logs last 
> time it happened.  This is from the "native-comp" branch, since 
> it's the only one I had built with debug symbols:  GNU Emacs 
> 28.0.50, commit feed53f8b5da0e58cce412cd41a52883dba6c1be.  I see 
> the same with the version installed from my package manager (Arch, 
> GNU Emacs 27.1), and the strace log looks about the same, though 
> without symbols.
> 
> I waited until it was actively leaking, and then ran the following 
> command to print a stack trace whenever the heap is extended with 
> brk():
> 
> $ sudo strace -p $PID -k -r --trace="?brk" --signal="SIGTERM"
> 
> The findings: this particular leak is triggered in libgnutls.  I 
> get large batches of the following (truncated) stack trace

Thanks.  This trace doesn't show how many bytes were allocated, does
it?  Without that it is hard to judge whether these GnuTLS calls could
be the culprit.  Because the full trace shows other calls to malloc,
for example this:

   > /usr/lib/libc-2.32.so(brk+0xb) [0xf6e7b]
   > /usr/lib/libc-2.32.so(__sbrk+0x84) [0xf6f54]
   > /usr/lib/libc-2.32.so(__default_morecore+0xd) [0x8d80d]
   > /usr/lib/libc-2.32.so(sysmalloc+0x372) [0x890e2]
   > /usr/lib/libc-2.32.so(_int_malloc+0xd9e) [0x8ad6e]
   > /usr/lib/libc-2.32.so(_int_memalign+0x3f) [0x8b01f]
   > /usr/lib/libc-2.32.so(_mid_memalign+0x13c) [0x8c12c]
   > /home/trevor/applications/opt/bin/emacs-28.0.50(lisp_align_malloc+0x2e) [0x2364ee]
   > /home/trevor/applications/opt/bin/emacs-28.0.50(Fcons+0x65) [0x237f74]
   > /home/trevor/applications/opt/bin/emacs-28.0.50(store_in_alist+0x5f) [0x5c9a3]
   > /home/trevor/applications/opt/bin/emacs-28.0.50(gui_report_frame_params+0x46a) [0x607f1]
   > /home/trevor/applications/opt/bin/emacs-28.0.50(Fframe_parameters+0x499) [0x5d88b]
   > /home/trevor/applications/opt/bin/emacs-28.0.50(Fframe_parameter+0x381) [0x5dc9c]
   > /home/trevor/applications/opt/bin/emacs-28.0.50(eval_sub+0x7a7) [0x26f964]
   > /home/trevor/applications/opt/bin/emacs-28.0.50(Fif+0x1f) [0x26b590]
   > /home/trevor/applications/opt/bin/emacs-28.0.50(eval_sub+0x38b) [0x26f548]
   > /home/trevor/applications/opt/bin/emacs-28.0.50(Feval+0x7a) [0x26ef45]
   > /home/trevor/applications/opt/bin/emacs-28.0.50(funcall_subr+0x257) [0x271463]
   > /home/trevor/applications/opt/bin/emacs-28.0.50(Ffuncall+0x192) [0x270fe9]
   > /home/trevor/applications/opt/bin/emacs-28.0.50(internal_condition_case_n+0xa1) [0x26d81a]
   > /home/trevor/applications/opt/bin/emacs-28.0.50(safe__call+0x211) [0x73943]
   > /home/trevor/applications/opt/bin/emacs-28.0.50(safe__call1+0xba) [0x73b47]
   > /home/trevor/applications/opt/bin/emacs-28.0.50(safe__eval+0x35) [0x73bd7]
   > /home/trevor/applications/opt/bin/emacs-28.0.50(display_mode_element+0xe32) [0xb5515]

This seems to indicate some mode-line element that uses :eval, but
without knowing what it does it is hard to say anything more specific.

I also see this:

   > /home/trevor/applications/opt/bin/emacs-28.0.50(_start+0x2e) [0x4598e]
       2.870962 brk(0x55f5ed9a4000)       = 0x55f5ed9a4000
   > /usr/lib/libc-2.32.so(brk+0xb) [0xf6e7b]
   > /usr/lib/libc-2.32.so(__sbrk+0x84) [0xf6f54]
   > /usr/lib/libc-2.32.so(__default_morecore+0xd) [0x8d80d]
   > /usr/lib/libc-2.32.so(sysmalloc+0x372) [0x890e2]
   > /usr/lib/libc-2.32.so(_int_malloc+0xd9e) [0x8ad6e]
   > /usr/lib/libc-2.32.so(_int_memalign+0x3f) [0x8b01f]
   > /usr/lib/libc-2.32.so(_mid_memalign+0x13c) [0x8c12c]
   > /home/trevor/applications/opt/bin/emacs-28.0.50(lisp_align_malloc+0x2e) [0x2364ee]
   > /home/trevor/applications/opt/bin/emacs-28.0.50(Fcons+0x65) [0x237f74]
   > /home/trevor/applications/opt/bin/emacs-28.0.50(Fmake_list+0x4f) [0x238544]
   > /home/trevor/applications/opt/bin/emacs-28.0.50(concat+0x5c3) [0x2792f6]
   > /home/trevor/applications/opt/bin/emacs-28.0.50(Fcopy_sequence+0x16a) [0x278d2a]
   > /home/trevor/applications/opt/bin/emacs-28.0.50(timer_check+0x33) [0x1b79dd]
   > /home/trevor/applications/opt/bin/emacs-28.0.50(readable_events+0x1a) [0x1b5d00]
   > /home/trevor/applications/opt/bin/emacs-28.0.50(get_input_pending+0x2f) [0x1bcf3a]
   > /home/trevor/applications/opt/bin/emacs-28.0.50(detect_input_pending_run_timers+0x2e) [0x1c4eb1]
   > /home/trevor/applications/opt/bin/emacs-28.0.50(wait_reading_process_output+0x14ec) [0x2de0c0]
   > /home/trevor/applications/opt/bin/emacs-28.0.50(sit_for+0x211) [0x53e78]
   > /home/trevor/applications/opt/bin/emacs-28.0.50(read_char+0x1019) [0x1b3f62]

This indicates some timer that runs; again, without knowing which
timer and what it does, it is hard to proceed.

Etc. etc. -- the bottom line is that I think we need to know how many
bytes are allocated in each call to make some progress.  It would be
even more useful if we could somehow know which of the allocated
buffers are free'd soon and which aren't.  That's because Emacs calls
memory allocation functions _a_lot_, and it is completely normal to
see a lot of these calls.  What we need is to find allocations that
don't get free'd, and whose byte counts come close to explaining the
rate of 1MB every few seconds.  So these calls need to be filtered
somehow, otherwise we will not see the forest for the gazillion trees.

> I'm not sure if gnutls is giving back buffers that emacs is 
> supposed to free, or if the leak is entirely contained within 
> gnutls, but something in that path is hanging on to a lot of 
> allocations indefinitely.

The GnuTLS functions we call in emacs_gnutls_read are:

  gnutls_record_recv
  emacs_gnutls_handle_error

The latter is only called if there's an error, so I'm guessing it is
not part of your trace.  And the former doesn't say in its
documentation that Emacs should free any buffers after calling it, so
I'm not sure how Emacs could be the culprit here.  If GnuTLS is the
culprit (and as explained above, this is not certain at this point),
perhaps upgrading to a newer GnuTLS version or reporting this to
GnuTLS developers would allow some progress.





  reply	other threads:[~2020-10-30  8:00 UTC|newest]

Thread overview: 110+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-09-14  0:43 bug#43389: 28.0.50; Emacs memory leaks Michael Heerdegen
2020-09-14 19:09 ` Juri Linkov
2020-09-15  0:32   ` Michael Heerdegen
2020-09-15 17:54     ` Russell Adams
2020-09-15 18:52       ` Eli Zaretskii
2020-09-15 21:12         ` Russell Adams
2020-09-16 14:52           ` Eli Zaretskii
2020-09-17 20:47             ` Russell Adams
2020-09-17 21:58               ` Joshua Branson via Bug reports for GNU Emacs, the Swiss army knife of text editors
2020-09-17 23:09                 ` Russell Adams
2020-09-18  6:56                 ` Eli Zaretskii
2020-09-18  7:53                   ` Robert Pluim
2020-09-18  8:13                     ` Eli Zaretskii
2020-09-20 20:08                     ` jbranso--- via Bug reports for GNU Emacs, the Swiss army knife of text editors
2020-09-18  8:22               ` Eli Zaretskii
2020-11-09 20:46                 ` Michael Heerdegen
2020-11-09 21:24                   ` Michael Heerdegen
2020-11-09 21:51                     ` Michael Heerdegen
2020-11-10  3:36                       ` Eli Zaretskii
2020-11-10  8:22                         ` Andreas Schwab
2020-11-10 12:59                           ` Michael Heerdegen
2020-11-10 13:01                             ` Andreas Schwab
2020-11-10 13:10                               ` Michael Heerdegen
2020-11-10 13:20                                 ` Eli Zaretskii
2020-11-10 13:26                                   ` Michael Heerdegen
2020-11-10 14:25                                     ` Michael Heerdegen
2020-11-10 15:36                                       ` Eli Zaretskii
2020-11-10 17:44                                         ` Eli Zaretskii
2020-11-10 18:55                                           ` Michael Heerdegen
2020-11-10 15:34                                     ` Eli Zaretskii
2020-11-10 16:49                                       ` Michael Heerdegen
2020-11-10 17:13                                         ` Eli Zaretskii
2020-12-08  1:07                                         ` Michael Heerdegen
2020-12-08  3:24                                           ` Jose A. Ortega Ruiz
2020-12-08 12:37                                             ` Russell Adams
2020-12-08  5:13                                           ` Jean Louis
2020-12-08 16:29                                             ` Michael Heerdegen
2020-12-10  0:50                                               ` Michael Heerdegen
2020-12-10  5:43                                                 ` Jean Louis
2020-11-10 15:53                           ` Eli Zaretskii
2020-11-10 10:25                         ` Michael Heerdegen
2020-11-10 15:55                           ` Eli Zaretskii
2020-11-10 16:41                             ` Michael Heerdegen
2020-11-09 22:33                   ` Jean Louis
2020-11-10 15:47                     ` Eli Zaretskii
2020-11-10 16:36                       ` Michael Heerdegen
2020-11-10 19:51                       ` Jean Louis
2020-11-10  3:30                   ` Eli Zaretskii
2020-11-26 15:42               ` Russell Adams
2020-11-26 16:34                 ` Eli Zaretskii
2020-11-26 16:54                   ` Russell Adams
2020-11-26 19:20                     ` Eli Zaretskii
2020-11-27 10:45                       ` Russell Adams
2020-11-27 12:38                         ` Eli Zaretskii
2020-11-28 19:56                           ` Russell Adams
2020-11-28 20:13                             ` Eli Zaretskii
2020-11-28 21:52                               ` Basil L. Contovounesios
2020-11-29  3:29                                 ` Eli Zaretskii
2020-09-17 20:59 ` Thomas Ingram
2020-10-29 20:17 ` Trevor Bentley
2020-10-30  8:00   ` Eli Zaretskii [this message]
2020-11-11 21:15     ` Trevor Bentley
2020-11-12 14:24       ` Eli Zaretskii
2020-11-16 20:16         ` Eli Zaretskii
2020-11-16 20:42           ` Florian Weimer
2020-11-17 15:45             ` Eli Zaretskii
2020-11-17 16:32               ` Carlos O'Donell
2020-11-17 17:13                 ` Eli Zaretskii
2020-11-17 17:20                   ` DJ Delorie
2020-11-17 19:52                     ` Eli Zaretskii
2020-11-17 19:59                       ` DJ Delorie
2020-11-17 20:13                         ` Florian Weimer
2020-11-17 20:16                           ` DJ Delorie
2020-11-17 20:27                             ` Eli Zaretskii
2020-11-17 20:35                               ` Florian Weimer
2020-11-17 20:43                                 ` Eli Zaretskii
2020-11-17 20:58                                   ` Florian Weimer
2020-11-17 21:10                                     ` Eli Zaretskii
2020-11-18  5:43                                       ` Carlos O'Donell
2020-11-18  6:09                                         ` Jean Louis
2020-11-18  8:32                                           ` Andreas Schwab
2020-11-18  9:01                                             ` Jean Louis
2020-11-18 16:19                                               ` Russell Adams
2020-11-18 17:30                                                 ` Eli Zaretskii
2020-11-19 15:57                                             ` Carlos O'Donell
2020-11-18 18:01                                         ` Eli Zaretskii
2020-11-18 18:27                                           ` DJ Delorie
2020-11-19 16:08                                             ` Carlos O'Donell
2020-11-22 20:19                                               ` Deus Max
2020-11-23  3:26                                                 ` Eli Zaretskii
2020-11-23 16:45                                                   ` Deus Max
2020-11-23 17:07                                                     ` Eli Zaretskii
2020-11-17 16:33               ` Florian Weimer
2020-11-17 17:08                 ` Eli Zaretskii
2020-11-17 17:24                   ` Florian Weimer
2020-11-17 20:39                   ` Jean Louis
2020-11-17 20:57                     ` DJ Delorie
2020-11-17 21:45                       ` Jean Louis
2020-11-18 15:03                         ` Eli Zaretskii
2020-11-23 18:55                           ` Jean Louis
     [not found]         ` <87wnyju40z.fsf@mail.trevorbentley.com>
2020-11-17 20:36           ` Eli Zaretskii
2020-11-18 21:47 ` Jose A. Ortega Ruiz
2020-11-19 14:03   ` Eli Zaretskii
2020-11-19 14:34     ` Jean Louis
2020-11-19 16:03       ` Carlos O'Donell
2020-11-19 17:25     ` jao
2020-12-09 19:41 ` Jose A. Ortega Ruiz
2020-12-09 20:25   ` Lars Ingebrigtsen
2020-12-09 21:04     ` Jose A. Ortega Ruiz
2020-12-11 13:55       ` Lars Ingebrigtsen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=83imasb0te.fsf@gnu.org \
    --to=eliz@gnu.org \
    --cc=43389@debbugs.gnu.org \
    --cc=trevor@trevorbentley.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).