0

多年来,我一直在使用 Indy 10.5 和几个旧版本。为了支持 HTTP Digest Authentication,我从他们的 SVN 下载了最新版本。

这是解决我遇到的 HTTP 摘要身份验证问题...

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

我能够并行创建 20 个线程来检索 HTTP 流(准确地说是网络摄像机 MJPEG 流),并且每个任务使用大约 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(所以它饱和了我电脑的 1 个核心)。

这是一个无限流,所以它不返回客户端是正常的,但由于流可能 < 100kb/s,检索它的 cpu 使用率应该接近于零......

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

我已经尝试过使用 Indy SVN 的先前版本,以确保它不是特定于日常构建的东西。

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

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

有没有人遇到过同样的情况并且有办法让当前版本的 indy 使用合理数量的 CPU 来执行此操作?

谢谢!

4

1 回答 1

2

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

作为测试,尝试告诉Get()丢弃它下载的数据而不是将其缓冲在内存中,并查看 CPU 使用情况:

HTTPClient.Get('http://plazacam.studentaffairs.duke.edu/axis-cgi/mjpg/video.cgi?resolution=640x480', TStream(nil));

TIdHTTP并非真正设计用于处理“无限”流,除非您提供一个能够接收TStream“无限”数据(如如本博客文章中所述,您自己的流数据:TIdEventStreamhoNoReadMultipartMIME

新的 TIdHTTP hoNoReadMultipartMIME 标志

于 2014-08-23T16:37:55.243 回答