psycheqiqi 发表于 2009-10-19 15:09:30

proactor传文件的测试

测试的是服务器的发送时间
文件大小    100k          2m            10m
连接数

100          94ms         390ms      1453ms


200          78ms         703ms         30000ms左右

500          219ms       2329ms         内存不足


问题1:为什么在连接数为200,大小10m的时候时间跨度如此大。是不是有类似于瓶颈之类的问题?
问题2:在服务器端为什么会出现内存不足的提示。

需要哪些地方的代码?我再贴出来

psycheqiqi 发表于 2009-10-20 10:11:41

我的电脑内存2G的,
在发送的文件大小*连接数<<内存的情况下,发送都是很高效的。

是不是我的程序在发送时申请的内存没有释放?还是别的原因。

传100k的文件,几千的连接都没有问题。

大神们,来看下。

这是发送的函数
void CPserverDlg::OnFileSend()
{
// TODO: Add your control notification handler code here
CString str;
sendFile.Abort();
    sendFile.Open(sendFileName,CFile::modeRead| CFile::typeBinary);
sendFileLen = sendFile.GetLength();
CPserverDlg *dlg = (CPserverDlg*)AfxGetApp()->GetMainWnd();
str.Format("%d",sendFileLen);
dlg->MessageBox(str);
SYSTEMTIME time1;
    GetSystemTime(&time1);
int size=8100;
while(sendFileLen>size)
{
char *membuf=new char ;
sendFile.Read(membuf,size);
membuf = '%';
membuf = '\0';
list <HA_Proactive_Service *> ::iterator its;
for(its=HA_Proactive_Service::List.begin();its!=HA_Proactive_Service::List.end();its++)
{
   HA_Proactive_Service *curSvr = *its;
   curSvr->WriteDate(membuf,size+1);
}
sendFileLen = sendFileLen-size;
delete []membuf;
membuf=null;
}
    CHAR *membuf = new CHAR;
sendFile.Read(membuf,sendFileLen);
sendFile.Close();
membuf = '^';
membuf = '\0';
list <HA_Proactive_Service *> ::iterator its;
for(its=HA_Proactive_Service::List.begin();its!=HA_Proactive_Service::List.end();its++)
{
HA_Proactive_Service *curSvr = *its;
curSvr->WriteDate(membuf,sendFileLen+1);
}
SYSTEMTIME time2;
    GetSystemTime(&time2);
str.Format("文件已发送,耗时%d毫秒",time2.wMinute*60*1000+time2.wSecond*1000+time2.wMilliseconds
-(time1.wMinute*60*1000+time1.wSecond*1000+time1.wMilliseconds));
MessageBox(str);
delete []membuf;
membuf=null;
}

int WriteDate(char *szSendBuf, int nSendCnt)
{
ACE_Message_Block *smb = new ACE_Message_Block(nSendCnt+1);
smb->copy(szSendBuf,nSendCnt+1);      
int nResult = this->writer_.write(*smb,nSendCnt+1);
if ( nResult != 0)
{
   ACE_TRACE("Write data failed!");
}

return nResult;
}

[ 本帖最后由 psycheqiqi 于 2009-10-20 14:09 编辑 ]

psycheqiqi 发表于 2009-10-20 14:53:58

怎么这两天没人啊
modern wiston你们都去哪了?

psycheqiqi 发表于 2009-10-20 16:17:45

问题3:
在发送9.2M的文件的时候,连接数<=16时可以正确的发送,但当连接数>16时则不能正确的接受,只收到很少的数据。

modern 发表于 2009-10-20 16:44:12

错误信息是什么?
走到ACE_TRACE("Write data failed!");这个分支里面了么?

psycheqiqi 发表于 2009-10-21 09:58:03

回复 #5 modern 的帖子

在发9.2M文件连接超过17个的时候程序跳到了
ACE_TRACE("Write data failed!");里
我怎么知道错误信息和错误代码

psycheqiqi 发表于 2009-10-21 10:56:23

回复 #6 psycheqiqi 的帖子

modern,帮我看下。
是write()没有成功,但为什么会有个数限制。
我实在想不通哪错了

modern 发表于 2009-10-21 11:11:10

走到那里就对了。
你的程序问题比较多,主要原因是因为你对IOCP的机制以及Socket基础知识了解得不够深刻。
1.socket缓冲区是有大小限制的,即便你把他调到最大,就算异步I/O性能再高,
你几兆的文件往里面不停的写,早晚肯定会缓冲区溢出的。
2.一定要理解一件事情,write成功只是说明把数据写到缓冲区中了,而不是发到对端。
楼主测试这个发送时间的意义有多大,希望楼主再仔细考虑一下。
3.我记得楼主上次有问过ACE使用Proactor异步传文件的例子,
看样子楼主对里面的逻辑还是没有理解透,建议楼主再仔细研究一下。

psycheqiqi 发表于 2009-10-21 11:25:18

回复 #8 modern 的帖子

1:就是说在多连接时发送几M的文件,缓冲区肯定会溢出。
   既然缓冲区的太小是一定的,是不是可以分批次来发送。
   
   给个思路....
   
2:我想测试的是发送+传输+接受的时间,中间有交互的处理会占用时间所以我考虑分开来测。
   这个我会再考虑。

modern 发表于 2009-10-21 12:38:06

纠正一下,
不是多连接传几M的文件缓冲区肯定会溢出。
而是按照楼主的处理逻辑,才肯定会溢出。
思路我已经说过了,见3。
页: [1] 2 3 4 5 6
查看完整版本: proactor传文件的测试