Golang 单TCP链接模拟下载,速度为什么很慢?

311 views
Skip to first unread message

Hydra

unread,
Aug 5, 2013, 5:36:19 AM8/5/13
to golang...@googlegroups.com
大家好,
     因公司项目需要,测试局域网内TCP单链接,简单事务逻辑下的吞吐。我用Golang实现了一个,但是搞不懂传输速度为什么上不去,千兆局域网内,速度始终在50MB/S,在自己的机器上与虚拟机进行双网卡直连,速度也上不去。

     整个的业务逻辑如下:
     客户端                                                                  服务端 
        |        建立链接                                                        |
        |    -------------------------------------------------------------------->   |
        |    1、     发送1024字节,模拟请求下载                            |
        |    ---------------------------------------------------------------->       |
        |       2、       发送64K数据到客户端                               |
        |      <------------------------------------------------------------------   |     
按照上图的关系,循环1,2步骤。

请各位前辈指点下,为什么速度上不去?测试还发现,用net/http建立服务端和客户端,传输1GB数据,却能达到90MB/S(局域网内跨网段,双方都是windows 8 x64系统)。
为什么net/http的传输速度那么快?

Leo Jay

unread,
Aug 5, 2013, 5:43:47 AM8/5/13
to golang...@googlegroups.com
2013/8/5 Hydra <xxeag...@gmail.com>:
你round trip太多了。要是一次性发给客户端的数据增加到64MB我相信总速度会提升不少。

--
Best Regards,
Leo Jay

Hydra

unread,
Aug 5, 2013, 5:50:40 AM8/5/13
to golang...@googlegroups.com
你说的round trip太多是因为服务端发送的数据是64K大小,导致TCP的SEND与ACK太多?

在 2013年8月5日星期一UTC+8下午5时43分47秒,Leo Jay写道:

Hydra

unread,
Aug 5, 2013, 6:01:46 AM8/5/13
to golang...@googlegroups.com
还一个更神奇的是,我修改了下main.go的代码,性能能跑到70多MB/S,与虚拟机linux,网卡直连,能跑到100MB/S:

diff --git a/./main.go b/./main_pre.go
old mode 100755
new mode 100644
index 84ec9de..00be699
--- a/./main.go
+++ b/./main_pre.go
@@ -134,6 +134,11 @@ func main() {
  })

  // When recv client's request, send target data.
  buff := make([]byte, buffLength, buffLength)
+ err := writeBuff(conn, buff)
+ if err != nil {
+ handleError(errr)
+ return
+ }
  for {

  // When recv success, the channel will be wakeup.

  <-writeSig



在 2013年8月5日星期一UTC+8下午5时36分19秒,Hydra写道:

steve wang

unread,
Aug 5, 2013, 8:39:41 AM8/5/13
to golang...@googlegroups.com
这和你的交互模式有关系吧。
比如客户端的两种模式:
1.请求1=>接受应答1=>请求2=>接收应答2
2.请求1=>请求2=>接收应答1=>接收应答2
这两种模式的效率就会一样了。

notedit

unread,
Aug 5, 2013, 9:03:32 AM8/5/13
to golang-china
server 端文件读取的时候 改成使用buffer 试试  


--
--
官网: http://golang-china.org/
IRC: irc.freenode.net #golang-china
@golangchina
 
---
您收到此邮件是因为您订阅了 Google 网上论坛的“Golang-China”论坛。
要退订此论坛并停止接收此论坛的电子邮件,请发送电子邮件到 golang-china...@googlegroups.com
要查看更多选项,请访问 https://groups.google.com/groups/opt_out。
 
 

Hydra

unread,
Aug 5, 2013, 10:51:00 AM8/5/13
to golang...@googlegroups.com
目前就是用[]byte 模拟的文件下载。 []byte只创建了一次,反复使用的。

在 2013年8月5日星期一UTC+8下午9时03分32秒,notedit写道:

Hydra

unread,
Aug 5, 2013, 10:52:29 AM8/5/13
to golang...@googlegroups.com
嗯,这两种模式确实不一样,一个是线性化的,一个是相当于投递了N个请求,服务端慢慢回就是了,貌似是类似http pipeline?

在 2013年8月5日星期一UTC+8下午8时39分41秒,steve wang写道:

steve wang

unread,
Aug 5, 2013, 11:02:21 AM8/5/13
to golang...@googlegroups.com
汗,少写了一个“不”字。
在我的测试环境里,同样的服务器,第二种客户端的效率是第一种的差不多10倍。
所以我的意思是,要比较性能的话,需要具有可比性。

Hydra

unread,
Aug 5, 2013, 10:28:08 PM8/5/13
to golang...@googlegroups.com
我是和一个C程序做的比较。是我一个同事写的。流程与我说的方式是一样的。
能否把你的代码共享下瞧瞧。

在 2013年8月5日星期一UTC+8下午11时02分21秒,steve wang写道:

Hydra

unread,
Aug 5, 2013, 10:49:24 PM8/5/13
to golang...@googlegroups.com
我修改了下代码,把客户端相关的代码中,把writeSig这个channel去掉,实现N次Sent,使其send/recv分离,速度会上去很多.速度可以达到100MB/S

在 2013年8月5日星期一UTC+8下午11时02分21秒,steve wang写道:

Hydra

unread,
Aug 6, 2013, 1:11:39 AM8/6/13
to golang...@googlegroups.com
各位兄弟姐妹们,我错了...拿到了同事的代码查看并测试后,速度相差不是太大。在我同事的两台机器上,他的程序大概会跑到88-89MB/S, 在我的两台测试机上大概跑到43-45MB/S的样子。用Go写的该测试程序在他的机器上大概是72-77MB/S的样子。在我的测试机上是45-50MB/S的样子。虽然有几MB的差距,但是还在可以接受范围内。关键是编码简单太多.

在 2013年8月5日星期一UTC+8下午5时36分19秒,Hydra写道:

steve wang

unread,
Aug 6, 2013, 1:13:39 AM8/6/13
to golang...@googlegroups.com
你把C和go的代码贴出来看看?

Hydra

unread,
Aug 6, 2013, 1:31:20 AM8/6/13
to golang...@googlegroups.com
IOCP.RAR是C代码
testTCP.zip是Go代码

在 2013年8月6日星期二UTC+8下午1时13分39秒,steve wang写道:
IOCP.rar
testTcp.zip

steve wang

unread,
Aug 6, 2013, 7:59:19 AM8/6/13
to golang...@googlegroups.com
还以为你说linux下gcc和go。。。
vc++玩不起。
不过go在windows下目前网络性能是比较差一些,这个不用比了。

chai2010

unread,
Aug 6, 2013, 8:23:07 AM8/6/13
to golang...@googlegroups.com
Windows下的网络性能得到Go1.2才能改进.

--
--
官网: http://golang-china.org/
IRC: irc.freenode.net #golang-china
@golangchina
 
---
您收到此邮件是因为您订阅了 Google 网上论坛的“Golang-China”论坛。
要退订此论坛并停止接收此论坛的电子邮件,请发送电子邮件到 golang-china...@googlegroups.com
要查看更多选项,请访问 https://groups.google.com/groups/opt_out。
 
 



--
chaishushan
http://my.oschina.net/chai2010
Reply all
Reply to author
Forward
0 new messages