proactor传文件的测试
测试的是服务器的发送时间文件大小 100k 2m 10m
连接数
100 94ms 390ms 1453ms
200 78ms 703ms 30000ms左右
500 219ms 2329ms 内存不足
问题1:为什么在连接数为200,大小10m的时候时间跨度如此大。是不是有类似于瓶颈之类的问题?
问题2:在服务器端为什么会出现内存不足的提示。
需要哪些地方的代码?我再贴出来 我的电脑内存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 编辑 ] 怎么这两天没人啊
modern wiston你们都去哪了? 问题3:
在发送9.2M的文件的时候,连接数<=16时可以正确的发送,但当连接数>16时则不能正确的接受,只收到很少的数据。 错误信息是什么?
走到ACE_TRACE("Write data failed!");这个分支里面了么?
回复 #5 modern 的帖子
在发9.2M文件连接超过17个的时候程序跳到了ACE_TRACE("Write data failed!");里
我怎么知道错误信息和错误代码
回复 #6 psycheqiqi 的帖子
modern,帮我看下。是write()没有成功,但为什么会有个数限制。
我实在想不通哪错了 走到那里就对了。
你的程序问题比较多,主要原因是因为你对IOCP的机制以及Socket基础知识了解得不够深刻。
1.socket缓冲区是有大小限制的,即便你把他调到最大,就算异步I/O性能再高,
你几兆的文件往里面不停的写,早晚肯定会缓冲区溢出的。
2.一定要理解一件事情,write成功只是说明把数据写到缓冲区中了,而不是发到对端。
楼主测试这个发送时间的意义有多大,希望楼主再仔细考虑一下。
3.我记得楼主上次有问过ACE使用Proactor异步传文件的例子,
看样子楼主对里面的逻辑还是没有理解透,建议楼主再仔细研究一下。
回复 #8 modern 的帖子
1:就是说在多连接时发送几M的文件,缓冲区肯定会溢出。既然缓冲区的太小是一定的,是不是可以分批次来发送。
给个思路....
2:我想测试的是发送+传输+接受的时间,中间有交互的处理会占用时间所以我考虑分开来测。
这个我会再考虑。 纠正一下,
不是多连接传几M的文件缓冲区肯定会溢出。
而是按照楼主的处理逻辑,才肯定会溢出。
思路我已经说过了,见3。