完整代码可以在https://groups.google.com/forum/#!topic/golang-nuts/e1Ir__Dq_gE
下载有没有人可以帮我改进这个示例代码来归零? 我认为它将帮助我们开发一个无错误的客户端/服务器代码。
我的发展步骤:
我发现这段代码非常不稳定包含三个问题:
启动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
}
// ...
}
答案 0 :(得分:1)
关于serverfault [1]的这个答案表明,对于可以处理大量连接的服务器,设置更高的ulimit是可以做的。还使用lsof检查应用程序内存泄漏或文件描述符泄漏。
ulimit -n 99999