gpt4 book ai didi

sockets - 许多客户端连接到 Go 服务器时出错

转载 作者:IT王子 更新时间:2023-10-29 01:46:30 24 4
gpt4 key购买 nike

完整代码可以在 https://groups.google.com/forum/#!topic/golang-nuts/e1Ir__Dq_gE 下载

谁能帮我把这个示例代码改进到零错误?我认为这将有助于我们开发无错误的客户端/服务器代码。

我的开发步骤:

  1. 创建一个可以通过 goroutine 处理多个连接的服务器。
  2. 构建一个可以使用简单协议(protocol)正常工作的客户端。
  3. 扩展客户端以模拟多个客户端(默认选项 -n=1000 个客户端)
  4. TODO:尝试减少服务器的锁定
  5. TODO:尝试使用 bufio 来提高吞吐量

我发现这段代码非常不稳定,包含三个问题:

  1. 启动 1000 个客户端,其中一个在从服务器读取时发生 EOF。
  2. 启动 1050 个客户端,很快打开的文件太多(没有打开任何客户端)。
  3. 启动 1020 个客户端,出现长跟踪堆栈的运行时错误。

    Start pollServer: pipe: too many open files
    panic: runtime error: invalid memory address or nil pointer dereference

    [signal 0xb code=0x1 addr=0x28 pc=0x4650d0]

在这里我粘贴了我更简化的代码。

const ClientCount = 1000
func main() {
srvAddr := "127.0.0.1:10000"
var wg sync.WaitGroup
wg.Add(ClientCount)
for i := 0; i < ClientCount; i++ {
go func(i int) {
client(i, srvAddr)
wg.Done()
}(i)
}
wg.Wait()
}
func client(i int, srvAddr string) {
conn, e := net.Dial("tcp", srvAddr)
if e != nil {
log.Fatalln("Err:Dial():", e)
}
defer conn.Close()
conn.SetTimeout(proto.LINK_TIMEOUT_NS)
defer func() {
conn.Close()
}()

l1 := proto.L1{uint32(i), uint16(rand.Uint32() % 10000)}
log.Println(conn.LocalAddr(), "WL1", l1)
e = binary.Write(conn, binary.BigEndian, &l1)
if e == os.EOF {
return
}
if e != nil {
return
}
// ...
}

最佳答案

关于 serverfault [1] 的回答表明,对于可以处理大量连接的服务器,应该设置更高的 ulimit。还可以使用 lsof 检查应用程序内存泄漏或文件描述符泄漏。

ulimit -n 99999

[1] https://serverfault.com/a/48820/110909

关于sockets - 许多客户端连接到 Go 服务器时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8088853/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com