开源改变世界

LinuxCNC 状态显示 (linuxcnctop.py) 是一个内存消耗大户! #347

推推 grbl 3年前 (2023-01-29) 223次浏览

Warning: Undefined variable $output in /www/wwwroot/grbl.cc/wp-content/themes/Git-alpha/include/shortcode.php on line 321

Warning: Undefined variable $output in /www/wwwroot/grbl.cc/wp-content/themes/Git-alpha/include/shortcode.php on line 321
关闭
KurtJacobson 打开了这个问题 2017 年 11 月 6 日 · 7条评论
关闭

LinuxCNC 状态显示 (linuxcnctop.py) 是一个内存消耗大户!#347

KurtJacobson 打开了这个问题 2017 年 11 月 6 日 · 7条评论

注释

LinuxCNC 状态显示 (linuxcnctop.py) 是一个内存消耗大户! #347

以下是我重现该问题所遵循的步骤:

  1. 使用任何配置和界面启动 LinuxCNC
  2. 启动 LinuxCNC 状态查看器
    • 在轴Machine > Show LinuxCNC Status
    • 或者在终端$ linuxcnctop
  3. 打开终端运行$ top查看内存使用情况
  4. 看linuxcnctop爬上顶峰

这是我期望发生的事情:

将在轻量级 Tkinter 界面中显示的 LinuxCNC 状态。

这是发生了什么:

显示 LinuxCNC 状态,我的 PC 变慢了,因为应用程序被移动到交换空间为内存贪婪的 linuxcnctop 腾出空间。运行大约 10-15 分钟后,它使用了超过 6 GB 的内存,此时 PC 变得不可用,必须关闭 linuxcnctop。

我通过 linuxcnctop.py 进行了简短的浏览,但我没有看到任何会导致内存如此贪婪的磷灰石的东西,但是我对 Tkinter 不是很熟悉。

在此之前它工作正常:

我不知道,但我已经证实 LinuxCNC 2.7.11 和最近的 RIP 版本的 master 都会发生这种情况。

有关我的硬件和软件的信息:

  • 操作系统:debian 9.2 LinuxCNC ISO
  • LinuxCNC:v2.7.11,大师
  • 用户界面:轴,模糊
LinuxCNC 状态显示 (linuxcnctop.py) 是一个内存消耗大户! #347
成员

我在 debian stretch 上确认

LinuxCNC 状态显示 (linuxcnctop.py) 是一个内存消耗大户! #347
成员

最大泄漏之一的典型回溯

$ valgrind --tool=memcheck --leak-check=full --show-leak-kinds=all linuxcnctop 
[ctrl-c after waiting about 30 seconds]
[at the end of the diagnostics list]
==10487== 14,434,304 bytes in 881 blocks are possibly lost in loss record 891 of 891
==10487==    at 0x4C2BBAF: malloc (vg_replace_malloc.c:299)
==10487==    by 0xBB3D971: GetBlocks (tclThreadAlloc.c:1044)
==10487==    by 0xBB3D971: TclpAlloc (tclThreadAlloc.c:358)
==10487==    by 0xBA60607: Tcl_Alloc (tclCkalloc.c:1059)
==10487==    by 0xB7753A3: TkTextIsElided (tkTextBTree.c:3502)
==10487==    by 0xB77F89B: IsStartOfNotMergedLine.part.9 (tkTextDisp.c:6911)
==10487==    by 0xB77BF9E: IsStartOfNotMergedLine (tkTextDisp.c:4790)
==10487==    by 0xB77BF9E: TextChanged (tkTextDisp.c:4793)
==10487==    by 0xB77BEFD: TkTextChanged (tkTextDisp.c:4736)
==10487==    by 0xB76F76B: DeleteIndexRange (tkText.c:3185)
==10487==    by 0xB6E93AA: TextReplaceCmd (tkText.c:1825)
==10487==    by 0xB76BE0A: TextWidgetObjCmd (tkText.c:1501)
==10487==    by 0xBA576D6: TclNRRunCallbacks (tclBasic.c:4390)
==10487==    by 0xB13FEEF: ??? (in /usr/lib/python2.7/lib-dynload/_tkinter.so)
LinuxCNC 状态显示 (linuxcnctop.py) 是一个内存消耗大户! #347
成员

以下是问题的独立重现者wish

proc x {} {
    for {set k0 0} {$k0 < 100} {incr k0} {
        set k _$k0
        set vranges [.t tag ranges $k]
        if {$vranges == {}} {
            .t insert end $k key "\t" {} xyzzy 
    "\n" } else { .t replace $k.first $k.last "hi mom"
      } } after 1 x } text .t pack .t x
      $ valgrind --tool=memcheck --leak-check=full --show-leak-kinds=all wish textleak.tcl 
      [as above, much snippage]
      ==10826== 49,971,200 bytes in 3,050 blocks are possibly lost in loss record 608 of 608
      ==10826==    at 0x4C2BBAF: malloc (vg_replace_malloc.c:299)
      ==10826==    by 0x52C1971: GetBlocks (tclThreadAlloc.c:1044)
      ==10826==    by 0x52C1971: TclpAlloc (tclThreadAlloc.c:358)
      ==10826==    by 0x51E4607: Tcl_Alloc (tclCkalloc.c:1059)
      ==10826==    by 0x4EF93A3: TkTextIsElided (tkTextBTree.c:3502)
      ==10826==    by 0x4F0389B: IsStartOfNotMergedLine.part.9 (tkTextDisp.c:6911)
      ==10826==    by 0x4EFFF9E: IsStartOfNotMergedLine (tkTextDisp.c:4790)
      ==10826==    by 0x4EFFF9E: TextChanged (tkTextDisp.c:4793)
      ==10826==    by 0x4EFFEFD: TkTextChanged (tkTextDisp.c:4736)
      ==10826==    by 0x4EF43C4: InsertChars (tkText.c:2683)
      ==10826==    by 0x4EF43C4: TextInsertCmd (tkText.c:3691)
      ==10826==    by 0x4E6D3EA: TextReplaceCmd (tkText.c:1827)
      ==10826==    by 0x4EEFE0A: TextWidgetObjCmd (tkText.c:1501)
      ==10826==    by 0x51DB6D6: TclNRRunCallbacks (tclBasic.c:4390)
      ==10826==    by 0x52C373F: AfterProc (tclTimer.c:1191)
      
      LinuxCNC 状态显示 (linuxcnctop.py) 是一个内存消耗大户! #347
      成员

      当使用我的独立复制器和从标签“core_8_6_7” https://github.com/tcltk/的源代码构建的 tcl/tk 版本时,这个错误没有出现

      我的受影响版本是 debian 的 8.6.6-1+b1。

      这是上游的相关错误:https
      ://core.tcl.tk/tk/info/28a3c366e6 该修复可能不完整,如果是这样,修复可能是https://core.tcl.tk/tk/info/62c5b7a1d7(只是因为它也适用于文本替换)

      看起来 Debian 测试有 8.6.7,因此如果适用,您可能希望采用的一种选择是安装该版本。https://packages.debian.org/buster/tk8.6

      关闭此错误,因为问题出在上游库上,可以通过安装固定版本来解决。