锁定老帖子 主题:socket 优化传输效率!!高手进
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-04-24
最后修改:2011-04-25
1.将服务器,和客户端都在本机上进行传输 很快 本机很快,1s可发几万次 2.将服务器放到 局域网内另一台 linux 机器,客户端放到windows 上进行发送的时候就很慢 将服务器放到 局域网内另一台 windows 机器,客户端放到windows 进行发送,发送效率一样慢 客户端: while(true){ 一次发送的数据为 (8+15)=23字节,write(23字节); 等服务端得响应 read(16字节); } 服务端: while(true){ 接受, 然后返回 响应 12+4 = 16的字节 } 客户端发送23字节,循环发送1000次,用时 60s。 将socket TcpNodelay设置为true后效率有所提升 发送23字节,循环发送1000次,用时 3s。 settcpnodelay(true) 我定位影响效率的原因是 in.read()阻塞导致的. settcpnodelay(flase)即默认情况下 每次read()耗时 202ms左右,write() 0ms settcpnodelay(true)即禁用negal算法, 每次read()耗时 1ms 左右,write() 1-3ms左右 偶尔出现一次40ms的情况 请教各位大侠,该如何优化,网络传输,read阻塞的情况啊 是JVM虚拟机的对socket的网络发送,有限制?? 小弟先在此谢过!! 最新测试结果.. settcpnodelay(flase) 情况下 在一次发送 1536字节 获取响应70字节 循环一1000。。只需1500ms左右 在发送<1500字节的时候 获取响应70字节 循环一1000。。竟然达到 41000ms左右 settcpnodelay(true) 情况下 在一次发送 1536字节 获取响应70字节 循环一1000。。只需1500ms左右 在发送<1500字节的时候 获取响应70字节 循环一1000。。只需800ms左右 附带测试的小程序.. jar包中,包含源程序! 等待各位大侠优化~~ 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-04-24
20921556 写道 一个服务单 一个客户端
1.将服务器,和客户端都在本机上进行传输 很快 本机很快,1s可发几万次 2.将服务器放到 局域网内另一台 linux 机器,客户端放到windows 上进行发送的时候就很慢 将服务器放到 局域网内另一台 windows 机器,客户端放到windows 进行发送,发送效率一样慢 客户端: while(true){ 一次发送的数据为 (8+15)=23字节,write(23字节); 等服务端得响应 read(16字节); } 服务端: while(true){ 接受, 然后返回 响应 12+4 = 16的字节 } 客户端发送23字节,循环发送1000次,用时 60s。 将socket TcpNodelay设置为true后效率有所提升 发送23字节,循环发送1000次,用时 3s。 settcpnodelay(true) 我定位影响效率的原因是 in.read()阻塞导致的. settcpnodelay(flase)即默认情况下 每次read()耗时 202ms左右,write() 0ms settcpnodelay(true)即禁用negal算法, 每次read()耗时 1ms 左右,write() 1-3ms左右 偶尔出现一次40ms的情况 请教各位大侠,该如何优化,网络传输,read阻塞的情况啊 是JVM虚拟机的对socket的网络发送,有限制?? 小弟先在此谢过!! lz 求解 服务器这段时间不间断的出现这个问题 2011-4-24 9:01:51 org.apache.jk.core.MsgContext action 警告: Unable to send headers java.net.SocketException: Broken pipe at java.net.SocketOutputStream.socketWrite0(Native Method) |
|
返回顶楼 | |
发表时间:2011-04-24
Broken pipe: 难道并发超过处理能力了。
|
|
返回顶楼 | |
发表时间:2011-04-24
lz的问题,可能跟交换机有关,两个机器用网线连上试试。
|
|
返回顶楼 | |
发表时间:2011-04-25
JMS_Exception 写道 20921556 写道 一个服务单 一个客户端
1.将服务器,和客户端都在本机上进行传输 很快 本机很快,1s可发几万次 2.将服务器放到 局域网内另一台 linux 机器,客户端放到windows 上进行发送的时候就很慢 将服务器放到 局域网内另一台 windows 机器,客户端放到windows 进行发送,发送效率一样慢 客户端: while(true){ 一次发送的数据为 (8+15)=23字节,write(23字节); 等服务端得响应 read(16字节); } 服务端: while(true){ 接受, 然后返回 响应 12+4 = 16的字节 } 客户端发送23字节,循环发送1000次,用时 60s。 将socket TcpNodelay设置为true后效率有所提升 发送23字节,循环发送1000次,用时 3s。 settcpnodelay(true) 我定位影响效率的原因是 in.read()阻塞导致的. settcpnodelay(flase)即默认情况下 每次read()耗时 202ms左右,write() 0ms settcpnodelay(true)即禁用negal算法, 每次read()耗时 1ms 左右,write() 1-3ms左右 偶尔出现一次40ms的情况 请教各位大侠,该如何优化,网络传输,read阻塞的情况啊 是JVM虚拟机的对socket的网络发送,有限制?? 小弟先在此谢过!! lz 求解 服务器这段时间不间断的出现这个问题 2011-4-24 9:01:51 org.apache.jk.core.MsgContext action 警告: Unable to send headers java.net.SocketException: Broken pipe at java.net.SocketOutputStream.socketWrite0(Native Method) 操作系统是怎样的 什么情况下出现的?? |
|
返回顶楼 | |
发表时间:2011-04-25
kimmking 写道 lz的问题,可能跟交换机有关,两个机器用网线连上试试。
摁,我试试先!! 不过交换机是 100M的..应该也不会这么慢的传输效率吧? 用飞鸽传递都还挺快的! |
|
返回顶楼 | |
发表时间:2011-04-25
设置发送缓存大点。接受缓存也设置大点。好象在默认的情况下。
如:socket.setBuff* |
|
返回顶楼 | |
发表时间:2011-04-25
read是阻塞的,write是非阻塞的,比较它们的执行时间有意义吗。
|
|
返回顶楼 | |
发表时间:2011-04-25
有没有改成异步read试过?
|
|
返回顶楼 | |
发表时间:2011-04-25
tanjiazhang 写道 有没有改成异步read试过?
貌似 java NIO 就是适合于这种短连接,I/O频繁的场景吧 |
|
返回顶楼 | |