失控的分散过程


116

有时,我看到一个distnoted进程突然启动,消耗了100%的CPU(在一个内核上)和大量的内存,通常在1.5G左右。从一个月左右开始,这种情况每天发生几次。

命令行是/usr/sbin/distnoted agent,由开头launchd,这两个命令都没有太大帮助。它通常运行4小时至24小时之间,然后旋转并固定CPU。

网络搜索说可以distnoted管理通知的传递,很多其他人都报告了同样的问题,但是我还没有找到解决方法。有人发现关闭恶意应用程序(例如Skype)会阻止它,但我还没有在我的机器上找到恶意软件。我通常只运行一些应用程序:Emacs(来自Homebrew的24.2),Firefox,Adium和Dash。

我在2012年末推出13英寸Retina MBP上的小牛。在此先感谢!

更新:

我已经distnoted通过触摸开启了登录系统日志的功能/var/log/do_dnserver_log,但是并没有太大帮助。我看到这样的行(uid 501是我,还没有找到89):

distnoted[80011]: # distnote server agent  absolute time: 48754.144787848   civil time: Wed Nov 20 10:52:03 2013   pid: 80011 uid: 501  root: no
distnoted[20]: # distnote server daemon  absolute time: 2.808112262   civil time: Tue Nov 19 09:52:24 2013   pid: 20 uid: 0  root: yes
distnoted[444]: # distnote server agent  absolute time: 16.656997509   civil time: Tue Nov 19 09:52:38 2013   pid: 444 uid: 501  root: no
distnoted[1271]: # distnote server agent  absolute time: 52.518265717   civil time: Tue Nov 19 09:53:14 2013   pid: 1271 uid: 89  root: no
distnoted[689]: Interruption - exiting now.

我还运行sudo dtruss -p PID了一个加速distnoted过程,它会喷出如下代码:

kevent64(0x3, 0x7FFF7C3FD130, 0x1)       = 1 0
workq_kernreturn(0x20, 0x0, 0x1)         = 0 0
workq_kernreturn(0x20, 0x0, 0x1)         = 0 0
kevent64(0x3, 0x7FFF7C3FD130, 0x1)       = 1 0
workq_kernreturn(0x20, 0x0, 0x1)         = 0 0
workq_kernreturn(0x20, 0x0, 0x1)         = 0 0
kevent64(0x3, 0x7FFF7C3FD130, 0x1)       = 1 0
workq_kernreturn(0x20, 0x0, 0x1)         = 0 0
__disable_threadsignal(0x1, 0x0, 0x0)    = 0 0
__disable_threadsignal(0x1, 0x0, 0x0)    = 0 0
__disable_threadsignal(0x1, 0x0, 0x0)    = 0 0
kevent64(0x3, 0x7FFF7C3FD130, 0x1)       = 1 0
workq_kernreturn(0x20, 0x0, 0x1)         = 0 0
...

就在这里捕鱼,但任何改变,你所有正在运行的流量?对我来说,它们似乎是相关的。如果我在emacs变得狂躁时退出流量,那么emacs要么崩溃要么恢复正常。我不确定这是a幸(仅发生过两次),但是如果每个人都在运行它,可能会有一些问题。

我没有助焊剂,但也许其他人正在助焊剂。
ryan 2013年

水族引起这个过程向我扑倒。
马拉松比赛

我有一个非常类似的问题(可能是相同的问题),而我的问题在10.9.4 OS更新中消失了。
克里斯·奎内尔

今天注意到这一点。罪魁祸首是OS X(10.9)Google云端硬盘应用(1.17.7290.4094)。我第一次看到这个。
jordanpg 2014年

Answers:


24

OP的摘要:这是调试的绝佳工具。最初它使我指向Spotlight重新索引文件系统,但是我缩小了它允许索引的范围,但仍然看到了问题。我最终建立了一个cron工作来杀死经常发散的人。参见答案更远的地方。


您可以通过创建文件来调试distnoted。/var/log/do_dnserver_log 这将导致CFNotificationCenter服务器(distnoted)将有关所有通知的信息记录到系统日志中。

我将从那里开始,重新启动,然后在CPU出现峰值时查看系统日志。这应该是罪魁祸首。

CFNotificationCenter可在以下官方开发人员文档中找到有关调试的更多信息:技术说明TN2124> CFNotificationCenter


谢谢!好电话,我现在已经做到了。我没有在中看到任何分散的条目/var/log/system.log,但是自从我开始记录以来,它也没有旋转。手指交叉。
ryan

我现在看到分散的日志行,但是它们并不太有用。叹。例如:Nov 23 07:56:15 hell.local distnoted[2644]: # distnote server agent absolute time: 77.445654904 civil time: Sat Nov 23 07:56:15 2013 pid: 2644 uid: 89 root: no
ryan

尝试将DTrace脚本附加到该进程,并查看其实际作用,开始sudo dtruss -p PID并查看该进程实际尝试执行的系统调用,以及是否有任何失败的脚本(状态不为0)。
Temikus

另外,您的系统上的UID 89是什么?通知中的UID是否更改?pid 2644是否对应于distnoted或其他进程?
Temikus

谢谢你的想法!我熟悉strace,但是我不知道dtruss。下次我一定会尝试的。pids只是对应的分散进程,而唯一的uid是me和_appserveradm,我对它不是很了解。
瑞安

33

我也看到了 Emacs 24.3.1,小牛10.9。

我发现退出Emacs后几秒钟内,分散的过程就会平静下来。

我在这里提交了Emacs错误:http : //permalink.gmane.org/gmane.emacs.bugs/80836


2
也可以在Emacs v23.4.1中看到。
WilliamKF 2014年

1
同样在这里。没想到这是由Emacs引起的!谢谢
Lionel Henry

1
对我来说,我一直遇到相反的问题-Emacs开始使用所有CPU,并且杀死用户的分散指令可以暂时解决问题。在这种情况下,查看Emacs进程,我看到很多线程-非Emacs起源的线程-都在com.apple.root.default-overcommit-priority队列/互斥体上等待(运行lldb,“进程附加--pid <pid>”,然后通过“ thread backtrace all”全部查看)
jrg 2014年

这是关于所有这些线程实际上是什么的有趣读物:newosxbook.com/articles/GCD.html(我的被打死的杀手可能是“魔术羽毛”,而不是使它恢复正常的东西)
jrg

也可以在OS X 10.11.3上的Emacs v24.5中看到
Michael

23

我知道我参加聚会迟到了,但这是特定于Mavericks上可可emacs的内存泄漏,该泄漏已修复在后备箱中。现在有一个修补程序,您可以使用该修补程序来构建emacs 24.3。

https://gist.github.com/anonymous/8553178



1
我从Mac OS X的Emacs更新为每晚构建一次(三月),但仍然有问题。如果我为R或Clojure(编程语言)创建交互式会话,则似乎会发生这种情况。分散的进程将缓慢爬升到GB的RAM,并在我退出Emacs时将其释放。
mattrepl

@mattrepl提到的同样的问题。
Amelio Vazquez-Reina 2014年

1
自制软件似乎已集成了此补丁程序。因此brew reinstall emacs --cocoa --with-gnutls也可以解决问题。还应该在24.4中修复它,但尚未达到稳定状态。
mblakele 2014年

刚刚在Emacs 24.5中遇到了这个问题(修复程序应该在24.4中)..在我的情况下,Emacs显示出旋转的球并且发散了将近400%的CPU(每个top),并且杀死-9个emacs无效,但是杀死-HUP之后,emacs对杀死做出了回应。
迈克尔

17

distnoted在El Capitan上遇到了同样的问题已有一段时间了。我的解决方案并不像定期杀死它那样苛刻,而是我检查它是否失控(CPU使用率很高),然后杀死它。我使用以下脚本:

#!/bin/sh
#
# check for runaway distnoted, kill if necessary
#
PATH=/bin:/usr/bin
export PATH

ps -reo '%cpu,uid,pid,command' | 
    awk -v UID=$UID '
    /distnoted agent$/ && $1 > 100.0 && $2 == UID { 
        system("kill -9 " $3) 
    }
    '

脚本每分钟从cron运行一次,并在crontab中显示以下行:

*   *  *   *  *   sh "$HOME/bin/checkdistnoted"

在实践中,脚本distnoted每天杀死一次或两次,通常是在backupd启动后发生。

对于不习惯使用OS X Shell(命令行)的用户,以下脚本将安装该checkdistnoted脚本和crontab条目:

#!/bin/sh
#
# install $HOME/bin/checkdistnoted
# setup crontab to run every minute
# 
# MWR Apr 2016
#

INSTALLCMD=bin/checkdistnoted
cd "$HOME"
[ ! -d bin ] && mkdir bin
[ -f $INSTALLCMD ] || {
    cat > $INSTALLCMD <<-"!!"
    #!/bin/sh
    #
    # check for runaway distnoted, kill if necessary
    #

    PATH=/bin:/usr/bin
    export PATH

    ps -reo '%cpu,uid,pid,command' | 
        awk -v UID=$UID '
        /distnoted agent$/ && $1 >= 100.0 && $2 == UID { 
            # kill distnoted agent with >= 100% CPU and owned by me
            system("kill -9 " $3) 
        }
        '
!!
    chmod +x $INSTALLCMD 
    echo installed $INSTALLCMD
}

INSTALLCRON="# check for runaway distnoted every minute:
* * * * * sh \"\$HOME/$INSTALLCMD\""
crontab -l | grep -q '$HOME'/$INSTALLCMD || {
    crontab -l > mycron
    echo "$INSTALLCRON" >> mycron
    crontab mycron
    rm mycron
    echo updated crontab
}

您需要将以上内容保存为install_checkdistnoted.sh您的桌面,然后运行Applications/Utilities/Terminal并键入:

cd Desktop
sh install_checkdistnoted.sh 

如果可以正常运行,它将打印每个步骤的确认。该脚本不会覆盖现有checkdistnoted脚本或crontab条目。


2
谢谢!很棒的解决方案,可以让我保持清醒,但是在失去控制时将其关闭。对于像我这样可能对Unixy做事方式不熟悉的其他人:1)。您的主文件夹将没有bin目录,在您的用户名下创建一个bin文件夹,并将脚本作为一个名为“ checkdisnoted”的文本文件放置在该目录中。2)。要创建cron条目,请在终端中运行“ crontab -e”,按“ i”键进入插入模式,并用星号粘贴整行,然后按“ esc”以返回命令模式,然后输入“:wq”保存文件并退出编辑器。
迈克,

@Michael Rourke:这是一个很好的解决方案。但是,安装脚本在Mac的内置bash“ GNU bash,版本3.2.57(1)-发行版(x86_64-apple-darwin15)”下包含语法错误。“ ||” 逻辑快捷方式和“ <<-”在这里似乎不起作用。
kakyo

@kakyo-非常抱歉,脚本失败,因为制表符变成了空格-现在已修复。
Michael Rourke

8

我放弃了,采取了大锤的方法:每分钟自动将其杀死。叹。

我把这个放在~/Library/LaunchAgents/org.snarfed.pkill_distnoted.plist

<plist version="1.0">
<dict>
  <key>Label</key>
  <string>org.snarfed.pkill_distnoted</string>
  <key>ProgramArguments</key>
  <array>
    <string>pkill</string>
    <string>-KILL</string>
    <string>-f</string>
    <string>distnoted</string>
  </array>
  <key>StartInterval</key>
  <integer>60</integer>  <!-- every minute -->
</dict>
</plist>

然后使用进行安装launchctl load ~/Library/LaunchAgents/org.snarfed.pkill_distnoted.plist


1
迈克尔·罗克(Michael Rourke)的以下方法是一种轻巧的清洁剂,因为它只有在开始吃cpu时才会被忽略。
迈克,

@mike,但Michael Rourke的方法无法处理disnoted正在消耗RAM的情况。
心教堂

@Cœur-是的。我还没有遇到不注意吃RAM的问题。这是您所看到的一个问题吗?
迈克

1
@mike是的,disnoted昨天在我的High Sierra上吃了63 GB的RAM。在他的问题中,甚至赖安(Ryan)都说这个过程正在消耗大量记忆
心教堂

@Cœur-好点!我投票给他们。
麦克

4

为了缩小这种行为,我一直在进行剥离自定义的不同组合。我认为这是通勤模式。从Homebrew(或来自emacsforosx)使用emacs 24.3.1的10.9上,打开一个shell模式缓冲区会发生明显的+ emacs泄漏(它们都缓慢增加内存消耗)。如果您只是访问文件,则不会。

只是想在这里注意,gmane似乎已停滞,我在每周两次寻找该问题的后续活动中一直在寻找此讨论。


谢谢!我可能实际上看到的是同一件事。我以为毫无节制的聚光灯(公认的答案)对我有用,但是毕竟我仍然看到失控的人散发出来。再次感谢您的领导,我可能会继续关注并进行更多调试。
ryan 2013年

我相信这也是处理我的Emacs流程的问题。我杀死Emacs之后,立刻就平静下来了。我有server.el,edit-server.el和一个python shell一直在运行以进行记录。
张敬轩

看到同一件事!埃马克斯要怪!
justingordon

我什至不知道什么是comint模式,而且有时会遇到emacs的明显问题。因此,也许没有什么具体的方案值得指责。
huyz 2014年

2

我想我只记得2次出现混乱的情况。在这种情况下,其中有2位坐在CPU排行榜的首位,而其中一位超过400%。回到办公室并插入几个外部显示器(其中之一是USB供电)后不久发生了这种情况,我猜测这可能与之相关。在拉出USB显示屏(立即恢复正常状态)之前,我没有做任何其他尝试来解决问题。然后将其插回不会导致重复问题。

哪个证明了什么?不知道!

我将它们插入了数百次,这是我第一次想到它可能与之相关。而且由于并非每次插入它们时都会发生,因此这可能与将它们插入彼此的速度过快或类似的随机性有关。以任何方式想我都会分享,以防其他人发现与插入外围设备有关(如果那是外部屏幕的话)


我也有类似的情况。当我拔出USB显示适配器时,发现它不再消耗过多的CPU(根据“顶部”),并且当我重新插入它时,问题没有立即出现。
Dalbergia 2015年

原来这也是我的问题。谢谢!
埃里克·西蒙顿

2

当应用程序以某种方式错误地使用了macOS提供的通知API时,似乎会发生这种情况。就我而言,罪魁祸首是iTerm2。退出后,distnoted进程退出。其他被发现的罪魁祸首是Emacs和iTunes。


1
iTerm2也对我造成了影响。
ctc


0

这也发生在我身上,发疯了。关闭一堆应用程序后,没有任何帮助。

然后,我注意到一个崩溃的Python进程中的“向苹果报告”对话框之一一直处于打开状态。

尽管可能只是巧合,但在关闭对话框后,分散的过程平静了下来。


0

几个月前,我遇到了一个类似的问题,并且被弄清了,无法追查为什么CPU使用率飙升至100%以上。最后,我killall distnoted每隔2分钟在crontab中添加一个条目,从而解决了我的问题。

最近,我遇到了Sublime Text的问题,其中键入subl path/to/file无法在Sublime Editor中正确打开文件。重新启动该应用程序可以解决此问题,但很快又再次发生了此问题。

在绞尽脑汁之后,我发现我每两分钟就会杀死一个分散的进程,这就是为什么subl命令神秘地停止工作的原因。

结论:CPU使用率过高可能与升华有关。现在,sublime已更新,希望我的结论是正确的,CPU使用率仍然很低,并且既然distnoted再次运行而我的crontab每2分钟不会杀死该进程,那么我的subl命令恢复了预期的工作。


0

我也有这个问题,已经有一段时间了,但断断续续。显然是iTunes的一部分,也已在Windows引起问题。当我杀死iTunes(正在播放歌曲)时,distonted使用我400%CPU(我有4个内核)的进程不再是问题。

因此,我的答案(直到我进一步了解为止)是建议您(而不是)杀死iTunes distnoted,并让我们知道会发生什么。


-1

我还看到杂乱无章的杂草丛生,就我而言,这似乎与字体有关。我运行了三种分布式通知,一种用于_spotlight,一种用于_distnote,一种用于我的用户。

distnoted   0,0 6:39,85 2   0   101 _distnote   0 bytes 0 bytes     No      -   No  No  No  0 bytes 0 bytes 64 bit
distnoted   0,0 0,05    2   0   642 _spotlight  0 bytes 0 bytes     Yes     -   No  No  No  0 bytes 0 bytes 64 bit
distnoted   82,1    1:19:38,30  49  1   353 nils    0 bytes 0 bytes     No      -   No  No  No  0 bytes 0 bytes 64 bit

每当有区别的人吃cpu(30-90%)时,fontworker和fontd分别吃掉30-60%cpu。一旦我杀死字体用户,字体用户就平静下来了。杀死fontworker没有任何作用。几分钟后,当fontd重新启动并运行了一段时间后,它又重新开始了。

fontworker  27,2    52,81   4   1   1073    nils    0 bytes 0 bytes     No      -   No  No  No  0 bytes 0 bytes 64 bit
fontd   32,6    1:07,41 6   0   1072    nils    0 bytes 0 bytes     No      -   No  No  No  0 bytes 0 bytes 64 bit

我不知道为什么会这样...


-2

彼得·巴克利(Peter Buckley)是对的,我错了。那样的话我讨厌。

不要删除distnoted,下次启动将毫无乐趣。

错误>我采取了更大刀的方法
错误> 
错误> sudo mv / usr / sbin / distnoted /usr/bin/distnoted.unwanted
错误>
错误>这是一台工作机,我对与iTunes同步没有兴趣。


真是的 正如苹果在distnoted页面上所指出的那样,distnoted是OS X的一部分,处理分布式通知,并且至少自2005
。– jfmercer

无论您做什么,都不要动 distnoted像ConorR所说的那样(后来改正了,谢谢!),它需要引导OSX(在我的情况下为10.9.5)。
彼得·巴克利

尽管这并不是一个真正的答案,但我认为在页面的某处保持注释很重要,这一点很重要。我几乎考虑过尝试偏离方向。
Zenexer
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.