Indy 10.6 - idHTTP连接到网络流时的100%CPU使用率

时间:2014-08-23 14:06:32

标签: delphi cpu indy indy10 idhttp

我多年来一直在使用Indy 10.5和几个旧版本。为了支持HTTP摘要式身份验证,我已经从他们的SVN下载了最新版本。

这是修复我正在使用的HTTP摘要身份验证问题......

问题是自10.6以来所有版本的CPU使用率。

我能够并行创建20个线程来检索HTTP Streams(网络摄像机MJPEG Streams是精确的),并且每个任务使用大约1-3%的cpu,具体取决于分辨率和帧速率。 (包括解析和解码)

我已经清理了我的代码,它通常使用IOHandler,CookieManager并依赖于InternalWork方法,直到我留下最基本的idHttp用法,可能就是:

procedure TForm1.Button1Click(Sender: TObject);
var
    HTTPClient : TidHTTP;
begin
  HTTPClient := TidHTTP.Create(nil);
  HTTPClient.Get('http://plazacam.studentaffairs.duke.edu/axis-cgi/mjpg/video.cgi?resolution=640x480');
  HTTPClient.Free();
end;

即使上面的代码没有改变任何设置也消耗了25%的CPU(因此它使我的计算机的核心饱和)。

这是一个无限的流,所以它没有返回到客户端是正常的,但是因为流可能是< 100kb / s,检索它的cpu用法应该接近于零......

我在德语的另一个论坛上看到,添加这个HTTPOptions可以解决高CPU的问题,但在我的情况下它对CPU没有影响: HTTPOptions:= [hoNoParseMetaHTTPEquiv]

我已尝试使用Indy SVN的先前版本,以确保它不是每日构建的特定内容。

XE4,XE5和X6附带的10.6.0版本具有相同的问题,但如果我回滚到: Indy 10.5.5 - RS2010 RTM

然后一切都很好(除了HTTP摘要身份验证),它只使用了大约2%的cpu ......

是否有人遇到过相同的问题并且当前版本的indy使用合理数量的CPU来实现此目的?

谢谢!

1 个答案:

答案 0 :(得分:2)

想想你在做什么。您正在调用返回TIdHTTP.Get()的{​​{1}}版本,但您正在下载“无限”流。这意味着String不断地从套接字读取数据并分配越来越多的内存来保存该数据,以期最终将其转换为Get()。因此,有意义的是CPU使用率可能会随着时间的推移而变高,特别是如果多个线程在多个线程中工作。

作为测试,请尝试告诉String丢弃它下载的数据而不是在内存中缓冲它,看看CPU使用情况如何:

Get()

HTTPClient.Get('http://plazacam.studentaffairs.duke.edu/axis-cgi/mjpg/video.cgi?resolution=640x480', TStream(nil)); 并非真正用于处理“无限”流,除非您提供能够接收“无限”数据的TIdHTTP(例如TStream),或启用{ {1}}标记服务器是否使用MIME来传递流数据,在这种情况下,您可以自己阅读流数据,如本博客文章所述:

New TIdHTTP hoNoReadMultipartMIME flag