原始套接字发送自己封装的TCP/IP包,加线程后速度也上不去是什么原因

hit100330125 2014-06-06 10:06:15
情况是这样,我需要发送自己构造的数据包,将数据封在TCP包中,然后再封在IP包中,最后再发送出去
现在要尽可能达到最快的发送速度,我的方案是先创建一个字符串数组,用于存放已经构造好的数据包,然后程序运行时先把数据包构造好并保存在数组中,然后在启动发包的线程
我的带宽是1000M,当启动一个线程时,发包速度大约是170M,CPU占用率40%左右,但是加到10个进程时速度也就是190M,cpu 50%---60%,加到50个或更多是速度也就是200M,cpu 60%+,不是线程越多速度应该越快吗,这是为什么,CPU也没有占满啊
如果要使用零拷贝技术应该如何处理,求指点
...全文
1234 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
skgary 2014-08-22
  • 打赏
  • 举报
回复
另外,是不是你用的是windows呢?如果是windows,也可以考虑换成linux试试看。 …… 还有一个问题,就是你单线程40%CPU,10线程50-60% CPU,说明你线程之间还是有其他的锁争用的。这多增加的CPU开销基本上都在线程调度上了,而不是在你真正的数据收发上。
skgary 2014-08-22
  • 打赏
  • 举报
回复
引用 楼主 hit100330125 的回复:
情况是这样,我需要发送自己构造的数据包,将数据封在TCP包中,然后再封在IP包中,最后再发送出去 现在要尽可能达到最快的发送速度,我的方案是先创建一个字符串数组,用于存放已经构造好的数据包,然后程序运行时先把数据包构造好并保存在数组中,然后在启动发包的线程 我的带宽是1000M,当启动一个线程时,发包速度大约是170M,CPU占用率40%左右,但是加到10个进程时速度也就是190M,cpu 50%---60%,加到50个或更多是速度也就是200M,cpu 60%+,不是线程越多速度应该越快吗,这是为什么,CPU也没有占满啊 如果要使用零拷贝技术应该如何处理,求指点
我觉得是你代码的问题吧。 一个线程170M,居然要达到40%,那你的线程除了网络收发还干了什么啊? 你可以另外做一个更简单的测试,你在你的机器上装一个tomcat,放几个大一点的文件,直接用迅雷这样子的软件去下载tomcat下的文件。如果tomcat的性能也和你自己的程序一样,那么说明你的机器性能就差了点。否则的话,就是你自己的代码问题了。根本不关线程什么事。
deng1234 2014-08-21
  • 打赏
  • 举报
回复
楼上大错,BiologyPianoProgram 为兄弟说的才是正确的做法,我们有好几个系统,就是用的对数据加密压缩后再发送 来提高性能的。
探花 2014-08-16
  • 打赏
  • 举报
回复
引用 2 楼 BiologyPianoProgram 的回复:
首先,发送网络数据是一个网络IO密集型的活,CPU计算量不大,所以CPU占用率不高。如果你开十个线程,每个线程都进行复杂的科学计算,试试看CPU是不是占满了。 其次,你哪怕开1万个线程,但是同一时刻也只有一个线程在运行,所以理论上开单个线程与开多个线程,能够发送的数据库速度是一致的,所以你发现多增加线程后,网络流量没有同步增加。 如果真要提高速度的话,可以构造套接字,这样单位时间内就能发送跟多有用的数据(不过关于这点可能纯属个人胡扯,我的网络基础不是太好)。 另一个办法是,对数据加密压缩后再发送,例如原来190M的数据,压缩十倍,变成19M,理论上原来要10秒钟才能传完的数据,现在只要1秒钟就可以了。不过不是所有的数据都能压缩到十倍的,例如PDF、视频、图片等,压缩跟没压缩过差不多(关于压缩的命题,你也要多咨询专业人士,我瞎扯的)。
纯粹SB 讲什么不知道
herelsp 2014-07-18
  • 打赏
  • 举报
回复
可以看看代码,分析下优化,如果不是耗时的计算,多开线程没有多大的改善
qqqq764065388 2014-07-08
  • 打赏
  • 举报
回复
1000M的速度不等于每秒可以传送1000M,是不是只有1/8?
taoguangye 2014-06-14
  • 打赏
  • 举报
回复
110MB/s 也就是近900Mbps 也比较接近1000M的速度了
taoguangye 2014-06-14
  • 打赏
  • 举报
回复
要看你用的什么模型,我的程序在1000M环境可以到110MB/s的速度,而CPU占用在20-30%(intel i5)
M依然 2014-06-09
  • 打赏
  • 举报
回复
引用 5 楼 ldh911 的回复:
引用 4 楼 cears 的回复:
能否拜个师呢。
路走天下~~~~ 师遍四海~~~~ 有一个算一个~~~~
MiceRice 2014-06-06
  • 打赏
  • 举报
回复
光增加线程不够,要多开端口。否则都在竞争一个端口,意义不大。
MiceRice 2014-06-06
  • 打赏
  • 举报
回复
引用 4 楼 cears 的回复:
能否拜个师呢。
三人行,必有我师~~~~~ 所以,拜不过来的~~~
M依然 2014-06-06
  • 打赏
  • 举报
回复
引用 3 楼 ldh911 的回复:
学习了。能否拜个师呢。
MiceRice 2014-06-06
  • 打赏
  • 举报
回复
有几个问题是需要关注的: 1、接收方处理速度,根据TCP协议,接收方如果来不及接收导致缓冲区满,发送方也是发不动的,这个其实是性能测试过程中最常见的问题,不是服务器不牛B而是测试机已经满负荷了; —— 具体略 2、发送方的发送缓冲区,因为你发送数据实际上还是先把数据送入系统的发送缓冲区,然后才是网卡的工作; —— 发送缓冲区是根据端口来的,也就是给每个端口配备发送缓冲区;从你给出的信息来看,你是多个线程共享一个端口(Socket)来进行发送,那么就是多个线程争用发送缓冲区的过程,所以多线程与单线程的差异不大(远低于线性期望);合理的做法应该是多开端口,想想P2P和多线程下载是怎么回事? 最后友情提醒:网卡是 Mbps,这里是小b,不是大B;不知道跟你检测吞吐量时的单位是否一致?
pricks 2014-06-06
  • 打赏
  • 举报
回复
首先,发送网络数据是一个网络IO密集型的活,CPU计算量不大,所以CPU占用率不高。如果你开十个线程,每个线程都进行复杂的科学计算,试试看CPU是不是占满了。 其次,你哪怕开1万个线程,但是同一时刻也只有一个线程在运行,所以理论上开单个线程与开多个线程,能够发送的数据库速度是一致的,所以你发现多增加线程后,网络流量没有同步增加。 如果真要提高速度的话,可以构造套接字,这样单位时间内就能发送跟多有用的数据(不过关于这点可能纯属个人胡扯,我的网络基础不是太好)。 另一个办法是,对数据加密压缩后再发送,例如原来190M的数据,压缩十倍,变成19M,理论上原来要10秒钟才能传完的数据,现在只要1秒钟就可以了。不过不是所有的数据都能压缩到十倍的,例如PDF、视频、图片等,压缩跟没压缩过差不多(关于压缩的命题,你也要多咨询专业人士,我瞎扯的)。
内容概要:本文针对无刷直流电机驱动的电子机械制动(EMB)执行器,建立了考虑Stribeck摩擦特性的非线性耦合动力学模型,并在Simulink环境中完成了系统级仿真分析。研究综合集成了电机动力学、齿轮传动机构与制动执行机构的动力学特性,构建了高保真的机电一体化系统模型。重点引入Stribeck摩擦模型以精确描述低速工况下执行器内部存在的静摩擦、粘滞摩擦与库仑摩擦之间的过渡行为,有效提升了系统在启停、反向运动等瞬态过程中的动态响应仿真精度。通过多工况仿真验证了模型的有效性,能够准确反映摩擦引起的爬行、滞后与定位误差等非线性现象,为EMB系统的高性能控制算法设计(如摩擦补偿、滑模控制)与结构优化提供了高可信度的仿真平台。; 适合人群:从事汽车电子制动系统、电机驱动控制、机电系统建模与仿真研究的研究生、科研人员及工程技术人员,需具备扎实的机械动力学、自动控制理论基础和MATLAB/Simulink仿真能力。; 使用场景及目标:①用于高精度电子机械制动系统的设计验证与性能预测;②为消除摩擦非线性影响的先进控制策略(如自适应控制、智能控制)提供精确的被控对象模型;③深入探究Stribeck摩擦等非线性因素对系统动态性能(如响应延迟、稳态误差)的作用机理; 阅读建议:读者应结合提供的Simulink模型文件,深入剖析Stribeck摩擦模块的数学实现与参数辨识方法,建议通过改变输入指令(如阶跃、正弦)和负载条件进行对比仿真,以直观理解非线性摩擦对系统动态特性的影响。

25,980

社区成员

发帖
与我相关
我的任务
社区描述
高性能WEB开发
社区管理员
  • 高性能WEB开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧