IT虾米网

memcached 显然重置连接

rubylouvre 2023年11月22日 编程语言 135 0

更新:

不是memcached,是很多套接字处于TIME_WAIT状态:

% ss -s 
Total: 2494 (kernel 2784) 
TCP:   43323 (estab 2314, closed 40983, orphaned 0, synrecv 0, timewait 40982/0), ports 16756 

顺便说一句,我修改了以前的版本(如下)以使用 Brad Fitz 的内存缓存客户端并重用相同的内存缓存连接:

http://dpaste.com/1387307/

旧版本:

我用 Go 拼凑了最基本的网络服务器,它的处理函数只做一件事:

  • 从 memcached 检索 key
  • 将其作为 http 响应发送给客户端

这是代码: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)的迹象。

请您参考如下方法:

我猜那是因为你的套接字用完了 - 你永远不会在这里关闭 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 相关的事情。


评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!