`
20921556
  • 浏览: 94768 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

socket 优化传输效率!!高手进

阅读更多
一个服务单 一个客户端

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包中,包含源程序!
等待各位大侠优化~~


更多解决方案请进入code110技术导航站


方案优化1. 小数据包请将setNodelay(true);能够明显提升速度,此为TCP不延迟发送
  • 大小: 72 KB
  • 大小: 27.2 KB
  • send.jar (14.3 KB)
  • 描述: send.jar(客户端发送小程序)
  • 下载次数: 269
  • server.jar (14.3 KB)
  • 描述: server.jar(服务端接收小程序)
  • 下载次数: 212
分享到:
评论
25 楼 ray_linn 2011-04-25  
本机就根本不走网卡,当然快。
24 楼 20921556 2011-04-25  
kimmking 写道
dennis_zane 写道
首先,你传输的都是十几个字节,所以一定要禁用nagle算法,也就是tcpNoDelay设置为true,提高响应速度。

其次,你的读写应该是批量的吧,发送接受都是搞一个byte数组缓冲区

其实感觉最大的问题不是nagle,也不是batch或buffer、async或sync,
这些都不会有那么大的差别。

目前 不到2k*1000次,1.5s的速度还是慢,
吞吐量不到2M/s

如果网络问题排除,则测试机器可能有问题,换一个机器+新装的系统试试。



用飞鸽传递..能达到 11-12MB/S

这样是否能排除机器的可能呢??
23 楼 20921556 2011-04-25  
kimmking 写道
dennis_zane 写道
首先,你传输的都是十几个字节,所以一定要禁用nagle算法,也就是tcpNoDelay设置为true,提高响应速度。

其次,你的读写应该是批量的吧,发送接受都是搞一个byte数组缓冲区

其实感觉最大的问题不是nagle,也不是batch或buffer、async或sync,
这些都不会有那么大的差别。

目前 不到2k*1000次,1.5s的速度还是慢,
吞吐量不到2M/s

如果网络问题排除,则测试机器可能有问题,换一个机器+新装的系统试试。



测试机器应该没有问题,
其它部门用C写的
转发这种频繁接收发送小数据包的时候,性能没有这么低呢!!
22 楼 20921556 2011-04-25  
dennis_zane 写道
kimmking 写道
dennis_zane 写道
首先,你传输的都是十几个字节,所以一定要禁用nagle算法,也就是tcpNoDelay设置为true,提高响应速度。

其次,你的读写应该是批量的吧,发送接受都是搞一个byte数组缓冲区

其实感觉最大的问题不是nagle,也不是batch或buffer、async或sync,
这些都不会有那么大的差别。

目前 不到2k*1000次,1.5s的速度还是慢,
吞吐量不到2M/s

如果网络问题排除,则测试机器可能有问题,换一个机器+新装的系统试试。


大量发这种小数据包,nagel算法的对响应的影响是非常大的,楼主自己测试的结果就可以看出来。


是的,,小数据包的情况下 竟用nagel算法,能明显看到效果!

没有禁用nagel
在字节数小于 1536的情况下 耗时竟然达到 41000ms左右




21 楼 dennis_zane 2011-04-25  
kimmking 写道
dennis_zane 写道
首先,你传输的都是十几个字节,所以一定要禁用nagle算法,也就是tcpNoDelay设置为true,提高响应速度。

其次,你的读写应该是批量的吧,发送接受都是搞一个byte数组缓冲区

其实感觉最大的问题不是nagle,也不是batch或buffer、async或sync,
这些都不会有那么大的差别。

目前 不到2k*1000次,1.5s的速度还是慢,
吞吐量不到2M/s

如果网络问题排除,则测试机器可能有问题,换一个机器+新装的系统试试。


大量发这种小数据包,nagel算法的对响应的影响是非常大的,楼主自己测试的结果就可以看出来。
20 楼 kimmking 2011-04-25  
dennis_zane 写道
首先,你传输的都是十几个字节,所以一定要禁用nagle算法,也就是tcpNoDelay设置为true,提高响应速度。

其次,你的读写应该是批量的吧,发送接受都是搞一个byte数组缓冲区

其实感觉最大的问题不是nagle,也不是batch或buffer、async或sync,
这些都不会有那么大的差别。

目前 不到2k*1000次,1.5s的速度还是慢,
吞吐量不到2M/s

如果网络问题排除,则测试机器可能有问题,换一个机器+新装的系统试试。
19 楼 fk! 2011-04-25  
楼主是服务器端用了多线程后,响应还这么慢??
18 楼 dennis_zane 2011-04-25  
首先,你传输的都是十几个字节,所以一定要禁用nagle算法,也就是tcpNoDelay设置为true,提高响应速度。

其次,你的读写应该是批量的吧,发送接受都是搞一个byte数组缓冲区
17 楼 antjava 2011-04-25  
用 mina 吧 ,效率不错。
16 楼 Rager 2011-04-25  
坐等解决方法
15 楼 lyy3323 2011-04-25  
1. 参数优化,参考socketAPI。
2. 网络问题,read方法 并没有其他多余逻辑操作,
14 楼 20921556 2011-04-25  
几乎都是在 read()的阻塞造成的!
各位大侠,如何在优化这个read阻塞问题???
13 楼 20921556 2011-04-25  
jnduan 写道
你的jk配置了多少链接数啊?不会都堵在那里了吧?


连接数高了的情况下,应该从那几个方面进行优化呢??
12 楼 20921556 2011-04-25  
jnduan 写道
你的jk配置了多少链接数啊?不会都堵在那里了吧?


连接数多的情况下,确实更慢!!

贴出来的情况,是只有1个客户端连接在发送数据的!
11 楼 jnduan 2011-04-25  
你的jk配置了多少链接数啊?不会都堵在那里了吧?
10 楼 20921556 2011-04-25  
tanjiazhang 写道
read是阻塞的,write是非阻塞的,比较它们的执行时间有意义吗。


并不是比较,
只是在2种不同情况下,他们执行的时间不一样..

问题在于,只有几个字节,write()需要1-3ms嘛?
9 楼 神之小丑 2011-04-25  
tanjiazhang 写道
有没有改成异步read试过?

貌似 java NIO 就是适合于这种短连接,I/O频繁的场景吧
8 楼 tanjiazhang 2011-04-25  
有没有改成异步read试过?
7 楼 tanjiazhang 2011-04-25  
read是阻塞的,write是非阻塞的,比较它们的执行时间有意义吗。
6 楼 lzj0470 2011-04-25  
设置发送缓存大点。接受缓存也设置大点。好象在默认的情况下。
如:socket.setBuff*

相关推荐

    C# 高性能Socket编程

    - **性能优化**:合理配置缓冲区大小,减少不必要的数据拷贝,提高传输效率。 - **线程安全**:在多线程环境下,确保数据访问的安全性。 总结起来,"C#高性能Socket编程"涉及的关键知识点包括:C# Socket编程基础、...

    java高手真经:网络开发卷源码

    1. **Java网络编程基础**:了解Socket编程是关键,Java通过Socket类提供TCP/IP通信,ServerSocket用于服务器端监听连接,Socket则用于客户端发起连接。同时,DatagramSocket和MulticastSocket则对应UDP协议,提供无...

    Java高手真经(网络开发卷)源码

    - 网络延迟优化:源码可能包含如何减少网络延迟,提高网络通信效率的策略。 - 错误处理与日志记录:良好的错误处理和日志记录对网络程序至关重要,源码会展示如何进行这些实践。 通过阅读和分析这份源码,开发者...

    java高手真经 网络部分 代码

    在Java编程领域,网络编程是不可或缺的一部分,它允许程序通过网络进行通信,实现数据的传输。"java高手真经 网络部分 代码"这个主题涵盖了Java中的网络编程技术,包括TCP/IP协议、套接字(Socket)编程、HTTP协议以及...

    AS3高手之路

    - **性能优化**:作者还提到了BitmapData对象的内存管理问题,比如如何避免过多的垃圾回收,以确保程序运行效率。 - **Sprite 类**:Sprite 类是AS3中最常用的显示对象容器之一,它可以包含多个子项,并提供了一...

    C# 网络应用编程基础

    5. **异步编程**:在网络编程中,为了提高程序的响应性和效率,常常需要使用异步操作。C#的`async/await`关键字使得异步编程变得简洁且易于理解。 6. **网络流(Network Stream)**:在网络通信中,数据通常以流的...

    易语言网络通讯系列教程

    最后,教程还会涉及网络通讯中的性能优化策略和安全防护措施,比如如何减少网络延迟、提高数据传输效率,以及防止DDoS攻击、数据被窃听等常见网络安全问题,确保学员在实际工作中能够构建出既高效又安全的网络应用。...

    Practical Java Source Code

    《实用Java源代码》 Java作为一种广泛使用的编程语言,其源代码是理解并掌握其精髓的关键。本资源“Practical Java Source Code”旨在提供...在学习过程中,不断实践、调试和优化代码,是成为Java开发高手的必经之路。

    Java学习材料(499篇文章)

    这可能涵盖了一些实践性的建议,如如何有效地学习,如何调试代码,以及如何提高编程效率。 "Java语言的Socket编程.txt"涉及到网络编程,是Java应用中不可或缺的一部分。Socket编程允许Java程序与其他网络上的程序...

    node.js开发指南.pdf

    Node.js的生态系统非常丰富,拥有大量的开源库和框架,如Express用于快速搭建Web应用,Socket.IO实现跨平台的实时通信,Webpack和Babel用于前端模块管理和代码转换。这些工具和框架的使用也会在书中有所提及,帮助...

    c++邮件发送系统开题报告

    5. 性能优化:优化系统性能,降低延迟,提高发送效率。 五、拟采用的方法 1. 使用C++进行系统开发,利用其强大的面向对象特性设计模块化的代码结构。 2. 引入TCP/IP库,实现网络通信功能,如socket编程。 3. 阅读...

    java 从入门到精通

    Java自动管理内存,程序员无需手动释放,但理解何时对象被创建和何时被垃圾回收有助于优化代码性能。 进一步深入,你将接触到多线程编程。Java提供了Thread类和Runnable接口来实现并发执行,理解线程同步和通信机制...

    VB远控源码

    "国外高手写的vb远控"意味着这个源码是由一位经验丰富的程序员编写的,可能包含了高级技术和优化的代码结构。对于学习VB和远程控制技术的人来说,这是一个宝贵的资源。通过研究和理解源码,开发者可以学习到如何实现...

    java的一些学习心得

    6. 网络编程:Java提供了Socket和ServerSocket类进行网络编程,可以实现客户端-服务器通信,是构建分布式系统的基础。 7. JDBC数据库连接:Java Database Connectivity(JDBC)允许Java程序与各种数据库进行交互,...

    c#做的一个QQ程序,还有不足的地方...适合菜鸟下载下去消化,老鸟不要笑

    《C#实现的QQ程序初探:从新手到高手的成长之路》 在编程的世界里,C#语言以其高效、安全和面向对象的特性,成为开发桌面应用和游戏的热门选择。而对于初学者而言,通过实践编写一个简单的QQ程序,无疑是一个极好的...

    javaBook:【java面试汇总&java知识体系结构】记录工作中遇到问题以及总结自己对java的理解

    5. **IO流**:输入/输出流是Java处理数据传输的核心,包括字符流和字节流,以及缓冲流、转换流、对象流等高级用法,用于读写文件、网络通信等场景。 6. **多线程**:Java提供了丰富的多线程支持,包括Thread类、...

Global site tag (gtag.js) - Google Analytics