0

这是我在许多大型项目中发现的常见问题:

  1. 它在开发中运行良好,因为您总是在停止并重新启动服务器
  2. 在生产中运行数小时后,就会发现内存或线程问题。

一个非常简单的生产解决方案是每隔几个小时就终止并重新启动该过程。

如果这 100% 的时间都有效,并且试图让程序运行数小时(数天)而没有这个问题是非常困难的,那么为什么要花费工程资源来解决这个问题呢?

4

1 回答 1

5

如果这 100% 的时间都有效,并且试图让程序运行数小时(数天)而没有这个问题是非常困难的,那么为什么要花费工程资源来解决这个问题呢?

抱歉,我最初错过了这个问题的全部要点。我会说是的,这确实很重要,因为以下原因:

  1. 程序员一直在复制代码。您的服务器中运行的错误模式或库可能正在传播到系统的其他部分。

  2. 如果这是一项需要扩展的服务,那么您可能需要每 30 分钟重新启动一次,然后是 20 分钟,然后一直重新启动。当这一点到来时,您很可能会在没有工程时间来实际发现和解决问题的情况下处于困境。垂直缩放到更大的盒子就是你自己的机会。

  3. 一般来说,您的工程团队可能会从练习中学到一些东西。一般来说,您应该及时了解如何诊断这些问题——尤其是运行分析器和泄漏检测器。

  4. 如果这个产品目前正在开发中,那么很难预测下一个特性是否会改变内存曲线并使这个问题变得更糟。然后你的脚会在你推动下一个版本之前解决问题。

但是,如果这是维护模式下的一些低使用率产品,那么不投入任何资源来修复它可能很好——但不是最佳的。


就确定是线程泄漏还是内存泄漏而言,这实际上取决于您用完了什么。如果您执行 aps并看到它正在分叉大量线程,就是您内存不足的原因(因为堆栈),那么您将不得不解决这个问题。

如果正在生成的线程数量似乎相对稳定,但内存继续增加,那么内存泄漏就是您需要关注的问题。

如果你在 linux 上,你可以看到线程进程 ID ps auxf

root      2501  0.0  0.3 244448 25576 ?    Ss   Jul03   0:11 /usr/sbin/httpd
apache    2716  0.0  0.5 384776 46696 ?    S    Oct14   0:17  \_ /usr/sbin/httpd
apache    2717  0.0  0.5 382208 44304 ?    S    Oct14   0:11  \_ /usr/sbin/httpd

要么子线程的数量在增长,要么ps将显示进程的虚拟内存在增加,直到它交换或命中一些ulimit但线程相对恒定。

于 2013-03-18T21:28:38.857 回答