每隔几个小时重新启动服务器是否值得追踪内存或线程泄漏?

And*_*row 0 multithreading garbage-collection memory-leaks thread-safety

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

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

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

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

Gra*_*ray 5

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

对不起,我最初错过了这个问题的全部内容.我会说是的,因为以下内容确实很重要:

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

  2. 如果这是一个需要扩展的服务,那么当您需要每30分钟,然后是20,然后是所有时间重新启动它时,可能会出现这种情况.当这一点出现时,你很可能会在没有工程时间的情况下在枪口下找到并解决问题.因此,垂直缩放到更大的盒子是您自己的机会.

  3. 通常,您的工程团队可能会从练习中学到一些东西.一般来说,您应该了解如何诊断这些问题的最新信息 - 特别是运行剖面仪和检漏仪.

  4. 如果此产品目前正在开发则是非常难预测未来的功能是否会改变记忆曲线,使这个问题更加严重.然后你的脚将在火中解决问题,然后你可以推动下一个版本.

但是,如果这是维护模式中的一些低使用率产品,那么可能没有任何资源来修复它 - 但不是最佳的.


在确定它是否是线程或内存中的泄漏方面,它实际上取决于你用完了什么.如果你做了一个ps并且看到它正在分配大量的线程,就是为什么你的内存不足(因为堆栈),那么你将不得不解决这个问题.

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

如果你在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
Run Code Online (Sandbox Code Playgroud)

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