首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >TIdHTTPServer和100%的CPU使用率

TIdHTTPServer和100%的CPU使用率
EN

Stack Overflow用户
提问于 2022-05-11 12:01:49
回答 1查看 129关注 0票数 0

我在Delphi11中使用TIdHTTPServer在VPS上运行一个简单的web服务器。

它的工作很好,除非不时我的应用程序将开始使用100%的CPU,并永远保持这种方式,我无法确定是什么导致了这一点。

当发生这种情况时,服务器仍然处于活动状态,并响应请求,但速度非常慢。解决这个问题的唯一方法是强制关闭应用程序并再次打开它。

我没有任何代码要显示,因为我的代码只是使用TIdHTTPServerTIdHTTPServer事件的一般响应。此事件将处理URL上的GET参数,并在AResponseInfo.ContentText中返回一些内容。

我知道这很难,但我有什么办法解决这个问题吗?

EN

Stack Overflow用户

发布于 2022-05-11 16:30:11

我们经常使用TIdHttpServer,没有问题。我们在Delphi10.3-10.4.2中使用了它,但这不是问题的原因。程序可以工作几个月而不重新启动。

根据我们的经验,我们可以说,这种意外行为的问题可以(按概率排序):

  • 代码不是线程安全。事件OnCommandGet不是在主线程中运行的,因此必须通过某种同步机制(锁、TEvent、同步、互斥、信号量或其他)来访问全局对象/资源/etc。如果代码不使用同步-它可能破坏逻辑,抛出异常或做一些其他意想不到的操作(如高CPU usage).
  • Connections计数超过限制。TIdHttpServer具有像ListenQueueMaxConnections这样的属性。可能是您提出了更多服务器可以处理的请求。在这种情况下,您的新请求将等待,直到代码能够处理它们,并且它可以进行一些额外的CPU使用。要诊断这一点--尝试在事件开始时增加一些内部变量,并在事件结束时减少它。发出一些服务请求以返回此变量,您将知道所有变量是否都正常工作。其他类似的情况-连接不关闭后,使用内部事件和留在内存,然后你也可以超越限制。尝试解决属性TIdHttpServer.ReuseSocket := rsFalse.
  • Memory和TIdHttpServer.KeepAlive := false泄漏的问题。尝试设置变量ReportMemoryLeaksOnShutdown := true并启动应用程序,发出一些请求并关闭它。如果您将看到一条带有泄漏的消息--那么您会做一些错误的事情,尝试以正确的方式处理这些对象。在生产过程中,这些小泄漏可能占用大量内存,而Windows将将部分内存转储到交换文件中,因此您的新请求将需要更多的时间来处理。

没有一个例子,我们不能说更多。

票数 4
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72200726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档