获取控制台消息:ipc_kmsg_copyout_header:无法增加用户ipc空间。这里有Mac OS X内核大师吗?


2

自从从Mac OS X 10.6.5升级到10.6.7后,我的计算机已经开始频繁锁定(通常至少每两天一次)。我将获得旋转风车,系统将无响应(gui和ssh等)。此状态将无限期持续,需要强制重启。当我积极使用计算机时,甚至在我不在的情况下“闲置”数小时或数天时,它将进入这种无法恢复的旋转。这不是内核恐慌。

重新启动后,我检查控制台日志以查看可能出错的地方。在每种情况下,始终在系统启动消息开始之前出现相同的消息。它读起来像:

2011/6/06 9:41:51 AM内核ipc_kmsg_copyout_header:无法增长用户ipc空间

当然,还有计算机响应的最后一个实例的日期和时间。此消息之前没有其他异常。只是标准的控制台东西

谷歌搜索这条消息,我只遇到了这个消息出现在源代码ipc_kmsg.c中的地方,它似乎是freebsd和mach内核的组件

以下是相关来源的链接:

1)http://fxr.watson.org/fxr/source/osfmk/ipc/ipc_kmsg.c?v=xnu-1456.1.26

    2963                 if (kr != KERN_SUCCESS) {
    2964                     /* space is unlocked */
    2965 
    2966                     if (kr == KERN_RESOURCE_SHORTAGE) {
    2967                         printf("ipc_kmsg_copyout_header: can't grow kernel ipc space\n");
    2968                         return (MACH_RCV_HEADER_ERROR|
    2969                             MACH_MSG_IPC_KERNEL);
    2970                     } else {
    2971                         printf("ipc_kmsg_copyout_header: can't grow user ipc space\n");
    2972                         return (MACH_RCV_HEADER_ERROR|
    2973                             MACH_MSG_IPC_SPACE);
    2974                     }
    2975                 }

2)http://fxr.watson.org/fxr/ident?v=xnu-1456.1.26;im=excerpts;i=MACH_MSG_IPC_SPACE

    658 #define MACH_MSG_IPC_SPACE              0x00002000
    659                 /* No room in IPC name space for another capability name. */

3)(不能发布第3个链接。新用户-_-)

    720 #define MACH_RCV_HEADER_ERROR           0x1000400b
    721                 /* Error receiving message header.  See special bits. */

我不想假装确切地知道这里发生了什么,但看起来内核的ipc开放端口用完了?如果是这种情况,可能导致这个问题的原因是什么?系统不应该释放未使用的端口吗?我想不出我安装的任何可能耗尽所有ipc端口的东西。

我没有在互联网上看到有关其他人遇到这个问题的任何其他帖子,但我无法想象我是唯一拥有它的人。

谢谢,任何帮助将不胜感激。

Answers:


1

这是一个黑暗中的镜头,但你是否使用Mozy进行备份?我帮助了另一个用户遇到问题,他的内核耗尽了与IPC相关的资源(特别是他的情况下是Mach端口),最后他将其跟踪到了Mozy。

请参阅某些Mac应用程序频繁崩溃,并在回溯中使用“__THE_SYSTEM_HAS_NO_PORT_SETS_AVAILABLE__”

即使您没有使用Mozy,也可以尝试他所做的并打开Activity Monitor中的“Ports”列,看看谁正在使用Mach端口。显然你必须在问题发生之前做到这一点,也许要把它打开,这样你就可以监视事情,看看事情即将失败的早期迹象。您还可以打开“已发送消息”和“已接收消息”列,以查看哪个进程正在发送和接收最多的IPC消息。但是在你对来自/来自kernel_task的所有消息感到惊讶之前,一定要比较一台正常工作的机器,它几乎同时重启,以获得基线。您还可以查看活动监视器中的进程列表,以查看是否存在运行的给定二进制文件的过多副本。

由于您似乎愿意深入研究内核源代码,因此您可能还想了解如何调试内核问题:

在阅读了内核调试之后,您可以尝试设置sudo nvram boot-args="debug=0x144"启用几个流行的内核调试选项,然后,下次遇到问题时,您可以按电源键强制内核出现紧急情况,这样您就可以从另一台机器上连接GDB了。闲逛。如果您希望电源键恢复正常运行,请使用sudo nvram boot-args="debug=0x140"(保留其他很酷的选项,但禁用电源键黑客)或sudo nvram -d boot-args(删除整个“boot-args”NVRAM变量)。


谢谢!我写了一个小脚本来记录给定时间间隔内有多少个开放端口进程,这样我就可以在重启后检查日志。我没有必要运行它很长时间才发现一个进程耗尽了过多的端口。在启动的几分钟内,我发现HandsOffDaemon已经使用了超过1000个端口。几个小时后,它使用超过57,000!(进程的下一个最高计数不超过500)。我将不得不联系开发人员,看看他们有什么要说的。谢谢,我在2011
6

@bowmasters你可以和这个人分享你的剧本吗?:superuser.com/questions/310931 / ...
Spiff 2011年

对不起,我有一段时间了。我已经继续并在那个问题线程中发布了剧本
bowmasters 2011年
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.