请教proactor例子的速度问题和无法写文件问题
我用了proactor的那个例子,test_proactor但是传文件到 接收方的时候在 handle_read_stream里的this->wf_.writev (result.message_block (), result.bytes_transferred (), this->file_offset_) 会返回-1 错误提示是 handle is not a socket很奇怪,在 两个系统上编译试过 一个是 xp sp3 一个是windows7, 都是用得vs2008,应该是在asynch_IO里的write返回出错,不知何故
然后把这个写入文件的部分注释掉之后测试 传输文件 尚算正常,但是速度比我想象的慢,在一个 百兆网卡和一个千兆网卡的机器上传输的时候,中间用的是千兆路由,传输速度可以达到5mB/s, 理论瓶颈应该在那个百兆网卡上,理论值应该有 100/8 == 12M 左右啊,同时用了飞秋(原飞鸽传书)这个软件做测试,速度大约可达11M左右,不知道为什么采用proactor异步操作会慢
另外如果传比较大的文件,>50M会出现传输方短时间停止,一段时间后继续刷屏信息,接收方一直刷屏的现象,
新人初来,希望有高手解答疑惑,谢谢 咋连winston 都无视我的帖子,:'( 没有足够信息,我不知道啊。俺也不是神灵。 好的,谢谢,那我补充下问题细节
1.ace文件写入硬盘那个函数不能正常调用,就是asynch_IO里的write返回出错,一调用就返回-1,同时log信息里说handle is not a socket,可是这个handle明明存在
2.刚发现的问题,设置每个messageblock的大小,程序里默认的是512个字节,这个时候传输是没有问题的,但是速度很慢,如果把messageblock的大小设置大,比如10k以上,发送的时候没有问题,但是接收的时候在proactor框架的接受完成的回调函数 handle_read_stream里,readstream变量的size是正确的,但是变量里bytes_transfered的值就很奇怪,远小于这个正常值,这个回调函数的原理不是等待异步操作完成,即这个stream完全读完了才会调用的么,那bytes_transfered为什么这么小
3,总体的效率问题,只是在两台电脑加上一个千兆路由的基础上测试,理论的瓶颈应该在一个百兆网卡上,就是说有10m左右的每秒速度,但是现在传输速度很慢,存在矛盾,如果把messageblock的值设大会加快,但是bytes_transfered变量又小说明发送不一定成功,如果把messageblock的值改大则发送会完成,但是速度很慢,我用飞秋测试速度极限完全可以达到11m,但是自己ace的test_proactor的实例中怎么也达不到这个速度 1、write返回出错,一调用就返回-1,同时log信息里说handle is not a socket
可能是你设置不对头,关联的socket非法。
2、异步操作很特别,你需要理解明白。完成的数量完全可能少于你的期望,很正常。
3、你的程序问题。ACE在windows上面实现了API封装:
BOOL TransmitFile(
SOCKET hSocket,
HANDLE hFile,
DWORD nNumberOfBytesToWrite,
DWORD nNumberOfBytesPerSend,
LPOVERLAPPED lpOverlapped,
LPTRANSMIT_FILE_BUFFERS lpTransmitBuffers,
DWORD dwFlags
);
此API公认效率最佳。 1.问题是我没设置,只是用了ace自带的example里的proactor那个程序,你们用这个都没有问题么?以前有些人说openfile的参数问题,我没有遇到,只是写文件会报错,trace进去发现是这个函数,感到奇怪
2.原来是可以少于期望的,不过还是不明白,既然是异步操作了,那执行read的函数马上返回有个注册地函数即handle_read_stream来响应异步完成,那自然这个函数里就应该读完了啊,不然这个异步原理有什么意义呢?
3.程序不是我写的,只是example里的,我也觉得ace这么多年了封装肯定ok的,但是问题是这个example在大文件的时候效率的确不如意,有什么在ace上实时高效大数据量的传输么? example的例子,N久没变化了,只是展示展示而已。我也忘记了啥情况,明天我自己试试这个例子。 我印象里这个例子好像是有问题的,同一个文件在sender的时候传输了两次,你可以分开测试一下。
一次是通过ACE_Asynch_Read_File读文件,每次读完在handle_read_file内部通过ACE_Asynch_Write_Stream传出去。
另一个是直接调用ACE_Asynch_Transmit_File异步的去读文件传文件,即直到文件全部都传完,才回调handle_transmit_file。
我以前跑的时候也是卡的要死,注释掉一个后测试效果肉眼看起来还不错。 最近也在看这个例子,与楼主有一样的困扰,只是没出现问题1这个现象 感谢8楼的,的确是发了两遍
我一直有 不能写入硬盘的问题,你们都没有么,我使用vs2008编的ace库,难道与版本有关?