use*_*468 1 tcp go microservices
我正在用golang编写两个服务,它们需要每秒互相发送约200万条消息。每个消息大约为50个字节,因此吞吐量应仅为大约100MB / s。我想为此使用tcp。但是,结果非常缓慢。我配置了SetNoDelay(false)以确保在发送之前对数据进行缓冲,但这没有任何区别。
我每秒只能发送约5万条消息,消息的大小并不太重要,因此我假设代码在某处阻塞。这是我的测试代码:
package main
import "net"
import "fmt"
import "bufio"
import (
//"strings"
"time"
)
func startserver() {
fmt.Println("Launching server...")
ln, _ := net.Listen("tcp", ":8081")
conn, _ := ln.Accept()
for {
bufio.NewReader(conn).ReadString('\n')
//fmt.Println(message)
//newmessage := strings.ToUpper(message)
//conn.Write([]byte(newmessage + "\n"))
}
}
func startclient() {
time.Sleep(time.Second) // so that server has time to start
servAddr := "127.0.0.1:8081"
tcpAddr, _ := net.ResolveTCPAddr("tcp", servAddr)
conn, _ := net.DialTCP("tcp", nil, tcpAddr)
conn.SetNoDelay(false)
conn.SetWriteBuffer(10000)
msg := "abc\n"
start := time.Now()
for i := 0; i < 1000000; i++ {
conn.Write([]byte(msg))
//bufio.NewReader(conn).ReadString('\n')
//fmt.Print("Message from server: ", response)
}
fmt.Println("took:", time.Since(start))
}
func main() {
go startserver()
startclient()
}
Run Code Online (Sandbox Code Playgroud)
有什么建议吗?
系统调用非常昂贵,并且通过环回写入数据的速度非常快,因此从本质上讲,这只是计时您可以对进行100万次调用的速度write。
进行大量的小型读写操作是使用缓冲io的主要用例。将法线换成net.TCPConna bufio.Writer将提供预期的性能提升。