更新:
它不是memcached,它是TIME_WAIT状态下的很多套接字:
% ss -s
Total: 2494 (kernel 2784)
TCP: 43323 (estab 2314, closed 40983, orphaned 0, synrecv 0, timewait 40982/0), ports 16756
BTW,我修改了以前的版本(下面)以使用Brad Fitz的memcache客户端并重用相同的memcache连接:
OLD VERSION:
我把Go中最基本的Web服务器放在一起,它只有一个处理函数:
以下是代码:http://dpaste.com/1386559/
问题是我在memcached上进行了很多连接重置:
2013/09/18 20:20:11 http: panic serving [::1]:19990: dial tcp 127.0.0.1:11211: connection reset by peer
goroutine 20995 [running]:
net/http.func·007()
/usr/local/go/src/pkg/net/http/server.go:1022 +0xac
main.maybe_panic(0xc200d2e570, 0xc2014ebd80)
/root/go/src/http_server.go:19 +0x4d
main.get_memc_val(0x615200, 0x7, 0x60b5c0, 0x6, 0x42ee58, ...)
/root/go/src/http_server.go:25 +0x64
main.func·001(0xc200149b40, 0xc2017b3380, 0xc201888b60)
/root/go/src/http_server.go:41 +0x35
net/http.HandlerFunc.ServeHTTP(0x65e950, 0xc200149b40, 0xc2017b3380, 0xc201888b60)
/usr/local/go/src/pkg/net/http/server.go:1149 +0x3e
net/http.serverHandler.ServeHTTP(0xc200095410, 0xc200149b40, 0xc2017b3380, 0xc201888b60)
/usr/local/go/src/pkg/net/http/server.go:1517 +0x16c
net/http.(*conn).serve(0xc201b9b2d0)
/usr/local/go/src/pkg/net/http/server.go:1096 +0x765
created by net/http.(*Server).Serve
/usr/local/go/src/pkg/net/http/server.go:1564 +0x266
我已经注意设置Linux内核网络,以免妨碍(关闭SYN泛滥保护等)。
... ... 然而,在使用“ab”(下面)进行测试时,我遇到了这些错误。
ab -c 1000 -n 50000 "http://localhost:8000/"
在任何地方我都没有任何迹象表明它是内核(dmesg,/ var / log)。
答案 0 :(得分:1)
我猜这是因为你的套接字耗尽 - 你永远不会在这里关闭memc
。在程序运行时检查netstat
。
func get_memc_val(k string) []byte {
memc, err := gomemcache.Connect(mc_ip, mc_port)
maybe_panic(err)
val, _, _ := memc.Get(k)
return val
}
如果我是你的话,我会使用this go memcache interface - 它是由memcached的作者撰写的,他现在可以在Go上为Google工作。
答案 1 :(得分:1)
试试memcache client from YBC library。与gomemcache不同,它打开并重新使用几个连接到memcache服务器,而不管通过客户端发出的并发请求的数量。它通过在与memcache服务器的少量开放连接上管道并发请求来实现高性能。
可以通过ClientConfig.ConnectionsCount配置到memcache服务器的连接数。