macOSx / 内核变量 os_refcnt 计数是多少以及可能导致其溢出的原因是什么?

macOSx / 内核变量 os_refcnt 计数是多少以及可能导致其溢出的原因是什么?

试图弄清楚为什么运行我正在开发的某些软件会导致我的 Mac 每 16 小时左右就会紧急重启一次,并且在运行 tcsh 脚本时总是出现“os_refcnt”内核变量溢出。在测试用例中,从中断处重新启动并重新运行代码会给出正确的结果。起初我以为这是对 shell 变量的引用,但是在脚本使用完它们之后,以几种不同的方式取消设置所有这些变量,没有任何效果。

最大的问题是“os_refcnt”正在计算的“引用”是什么类型的事件?

为什么计数值会溢出?为什么不重置? “引用”数量的溢出是否是由于“竞争条件”导致内存因存在许多并发线程而无法重置? (程序在 12 个独立分支上的不同数据上同时运行,这是可以使用的最大值,同时仍然会导致运行时间更短。)

Mac 技术支持没有提供任何好的建议。

除了类似 UNIX 的系统调用之外,脚本还使用由 GNU 项目的编译器编译的程序,以防与此有关。主程序,就CPU时间而言,是由脚本编写和编译的。该程序保存一个大的常量数据数组,该数组是由脚本中的另一个程序计算的。 4 个输入值是 4 个整数,指定数组 2 个元素的索引,程序将这 2 个元素的值相乘。

由于“紧急报告窗口”中的错误与“os_refcnt”(内核使用的整数值系统变量)溢出有关,而且由于我不知道内核在做什么,所以我进行了谷歌搜索并发现了一个内核所做的事情之一是减慢作业速度以控制 CPU 温度。看起来很奇怪,所以为了检查温度,我下载了一个CPU温度显示应用程序,发现CPU温度相当高,在崩溃之前徘徊在84°C和86°C之间。在圆柱形 MacPro“Stack”上安装了一些额外的外部风扇,并且能够在大多数时间将最大持续 T 保持在 82-84°C。在 16 小时,2 个作业已同步,因此作业内段之间几乎没有 CPU 停机时间,并且 CPU 可能有理由稍微热一些。然而,使用外部风扇时,即使在温度稍低的情况下,电脑在 16.5 小时后就死机了,这与 16 小时似乎没有显着差异。如果冷却是问题所在,我也许可以故意添加延迟来尝试冷却 CPU,看看是否有帮助。

我尝试用谷歌搜索 os_refcount,但没有成功。我对引用计数溢出可能导致恐慌重启的原因做出了很多其他猜测。我设置了脚本,以便使用“tcsh”命令而不是“source”命令来实现主脚本中调用的所有二级和三级脚本,以便在退出二级脚本时变量值应该被“忘记”,我也在我使用的每个 shell 变量上显式添加“unset”。

还有其他人知道什么可能导致内核变量“os_refcnt”持续溢出吗? (正在考虑将我使用的脚本从 tcsh 翻译为 bash,看看这是否会改善情况,但这似乎也有点牵强,并且想在执行所有必需的操作之前检查一下这是否是一个合理的尝试调试。)目前,我只需每 16 小时重新启动一次计算机即可获得我需要的结果。

问题已经存在有一段时间了。目前运行在 MacOS10.15.4 Catalina 上。相同的程序不会像旧版 Mac 上那样经常导致操作系统崩溃,但会导致 ~10^8 个“egrep -c”命令中的 1 个返回 NaN(错误值)。这些 NaN 值可以在运行的脚本中捕获,然后当egreps立即重新运行时,它们会给出正确的数字。不过,较旧的 Mac 速度大约慢 5 - 20 倍。他们还有更典型的矩形盒子形状的烟囱而不是圆柱体,并且还有可以听到呼呼声的风扇。较旧的 Mac 在大约 1 周或 2 周后确实崩溃了,这可能是在大约相同数量的程序周期之后,所以也许我看到了同样问题的延续。 (为了避免崩溃,我尝试了使用“awk”等效项而不是“egrep”的其他版本;“awk”或“egrep”也发生了同样的崩溃,但有趣的是在某些操作系统版本上,“awk” “版本要快得多,在其他版本上,“egrep”要快得多,运行时间差异为 2 到 3 倍——除了使用旧操作系统之外,还使用其他类型的 Mac 硬件。)

当我致电 Apple 技术支持寻求帮助时,得到的答复是“由于您的程序(即第 3 方软件)而崩溃”,但除了“不要运行您的程序”之外,我几乎没有什么办法可以防止这种情况发生。

相关内容