我在Delphi11中使用TIdHTTPServer
在VPS上运行一个简单的web服务器。
它的工作很好,除非不时我的应用程序将开始使用100%的CPU,并永远保持这种方式,我无法确定是什么导致了这一点。
当发生这种情况时,服务器仍然处于活动状态,并响应请求,但速度非常慢。解决这个问题的唯一方法是强制关闭应用程序并再次打开它。
我没有任何代码要显示,因为我的代码只是使用TIdHTTPServer
的TIdHTTPServer
事件的一般响应。此事件将处理URL上的GET
参数,并在AResponseInfo.ContentText
中返回一些内容。
我知道这很难,但我有什么办法解决这个问题吗?
发布于 2022-05-11 16:30:11
我们经常使用TIdHttpServer
,没有问题。我们在Delphi10.3-10.4.2中使用了它,但这不是问题的原因。程序可以工作几个月而不重新启动。
根据我们的经验,我们可以说,这种意外行为的问题可以(按概率排序):
OnCommandGet
不是在主线程中运行的,因此必须通过某种同步机制(锁、TEvent、同步、互斥、信号量或其他)来访问全局对象/资源/etc。如果代码不使用同步-它可能破坏逻辑,抛出异常或做一些其他意想不到的操作(如高CPU usage).TIdHttpServer
具有像ListenQueue
和MaxConnections
这样的属性。可能是您提出了更多服务器可以处理的请求。在这种情况下,您的新请求将等待,直到代码能够处理它们,并且它可以进行一些额外的CPU使用。要诊断这一点--尝试在事件开始时增加一些内部变量,并在事件结束时减少它。发出一些服务请求以返回此变量,您将知道所有变量是否都正常工作。其他类似的情况-连接不关闭后,使用内部事件和留在内存,然后你也可以超越限制。尝试解决属性TIdHttpServer.ReuseSocket := rsFalse
.TIdHttpServer.KeepAlive := false
泄漏的问题。尝试设置变量ReportMemoryLeaksOnShutdown := true
并启动应用程序,发出一些请求并关闭它。如果您将看到一条带有泄漏的消息--那么您会做一些错误的事情,尝试以正确的方式处理这些对象。在生产过程中,这些小泄漏可能占用大量内存,而Windows将将部分内存转储到交换文件中,因此您的新请求将需要更多的时间来处理。没有一个例子,我们不能说更多。
https://stackoverflow.com/questions/72200726
复制相似问题