原始套接字发送自己封装的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也没有占满啊
如果要使用零拷贝技术应该如何处理,求指点
...全文
1115 14 打赏 收藏 举报
写回复
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、视频、图片等,压缩跟没压缩过差不多(关于压缩的命题,你也要多咨询专业人士,我瞎扯的)。
相关推荐
发帖
高性能WEB开发

2.5w+

社区成员

高性能WEB开发
社区管理员
  • 高性能WEB开发社区
加入社区
帖子事件
创建了帖子
2014-06-06 10:06
社区公告
暂无公告