找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 9822|回复: 24

请教proactor例子的速度问题和无法写文件问题

[复制链接]
发表于 2009-5-27 17:04:35 | 显示全部楼层 |阅读模式
我用了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会出现传输方短时间停止,一段时间后继续刷屏信息,接收方一直刷屏的现象,

新人初来,希望有高手解答疑惑,谢谢
 楼主| 发表于 2009-5-31 19:07:29 | 显示全部楼层
咋连winston 都无视我的帖子,:'(
发表于 2009-5-31 23:14:43 | 显示全部楼层
没有足够信息,我不知道啊。俺也不是神灵。
 楼主| 发表于 2009-5-31 23:28:32 | 显示全部楼层
好的,谢谢,那我补充下问题细节
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的实例中怎么也达不到这个速度
发表于 2009-5-31 23:40:15 | 显示全部楼层
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公认效率最佳。
 楼主| 发表于 2009-5-31 23:54:15 | 显示全部楼层
1.问题是我没设置,只是用了ace自带的example里的proactor那个程序,你们用这个都没有问题么?以前有些人说openfile的参数问题,我没有遇到,只是写文件会报错,trace进去发现是这个函数,感到奇怪
2.原来是可以少于期望的,不过还是不明白,既然是异步操作了,那执行read的函数马上返回有个注册地函数即handle_read_stream来响应异步完成,那自然这个函数里就应该读完了啊,不然这个异步原理有什么意义呢?
3.程序不是我写的,只是example里的,我也觉得ace这么多年了封装肯定ok的,但是问题是这个example在大文件的时候效率的确不如意,有什么在ace上实时高效大数据量的传输么?
发表于 2009-5-31 23:56:46 | 显示全部楼层
example的例子,N久没变化了,只是展示展示而已。我也忘记了啥情况,明天我自己试试这个例子。
发表于 2009-6-1 08:53:55 | 显示全部楼层
我印象里这个例子好像是有问题的,同一个文件在sender的时候传输了两次,你可以分开测试一下。
一次是通过ACE_Asynch_Read_File读文件,每次读完在handle_read_file内部通过ACE_Asynch_Write_Stream传出去。
另一个是直接调用ACE_Asynch_Transmit_File异步的去读文件传文件,即直到文件全部都传完,才回调handle_transmit_file。
我以前跑的时候也是卡的要死,注释掉一个后测试效果肉眼看起来还不错。
发表于 2009-6-1 10:14:37 | 显示全部楼层
最近也在看这个例子,与楼主有一样的困扰,只是没出现问题1这个现象
 楼主| 发表于 2009-6-1 13:51:51 | 显示全部楼层
感谢8楼的,的确是发了两遍
我一直有 不能写入硬盘的问题,你们都没有么,我使用vs2008编的ace库,难道与版本有关?
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-22 18:28 , Processed in 0.016178 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表