【发布时间】:2014-03-02 07:50:58
【问题描述】:
我遇到了一个奇怪的问题。
我使用 Delphi 和 Indy 上传和备份一些文件。 它在许多计算机(Win7 64bit,WinXP)上运行得很好。 CPU 使用率低于 1% 和最大值。 20MB 内存。
但是有一台计算机(Win 2008 R2)有问题,我不知道为什么。 CPU 使用率为 5-20%,它占用 100MB 以上的 RAM,而且增加了很多。 此外,“页面错误”上升了很多,例如。每秒 100 000 次(在我的计算机上没有增加)
代码很简单
var
IdHTTP: TIdHTTP;
IdPostData: TIdMultiPartFormDataStream;
sResponse: string;
begin
IdHTTP := TIdHTTP.Create(nil);
IdPostData:=TIdMultiPartFormDataStream.Create;
try
IdPostData.AddFile('file', 'C:\data.dat', '');
sResponse:=IdHTTP.Post('http://web.com', IdPostData);
ShowMessage(sResponse);
finally
IdHTTP.Free;
IdPostData.Free;
end;
end;
有人知道为什么“页面错误”会增加很多吗? 是否可能存在一些硬件问题?怎么找?
【问题讨论】:
-
这可能是一个愚蠢的建议,但我首先要考虑的是防病毒软件以及 PC 上可能存在的任何病毒。
-
页面错误通常意味着正在访问保留但未提交的内存,因此操作系统必须提交内存以供使用。例如,操作系统使用它来动态增加线程的可用堆栈空间。但这仅适用于大量堆栈使用(默认最小堆栈大小为 1MB,默认最大大小为 4MB),但 Delphi 中的大多数东西使用堆内存而不是堆栈内存。而且绝对不应该使用 100+ MB 的内存。这表明正在发生泄漏/碎片,但您显示的代码中没有任何内容会导致这种情况。
-
是否有可能某些特定的硬件故障会导致这种情况?操作系统会在任何地方报告吗?
-
我会传输没有文件扩展名的文件,然后在传输完成后重命名。可能是一些影子备份服务或创建还原点的 shananigans!
-
我尝试了一个没有扩展名的文件,没有变化。此外,当我使用更大的上传缓冲区大小时,它会变得更快。
var FStack: TIdIOHandlerStack; FHTTP.IOHandler:=FStack; FStack.SendBufferSize:=512*1024; //512kB buffer每秒 +10MB 内存
标签: delphi indy page-fault