guanqingan / xmemcached

Automatically exported from code.google.com/p/xmemcached
Apache License 2.0
0 stars 0 forks source link

Unable to establish loopback connection #171

Closed GoogleCodeExporter closed 9 years ago

GoogleCodeExporter commented 9 years ago
大家好:

我使用最新版的xmemcached-1.3.5.jar,在使用中遇见这个问题。请
帮忙看看是怎么回事
java.io.IOException: Unable to establish loopback connection
    at sun.nio.ch.PipeImpl$Initializer.run(PipeImpl.java:106)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.nio.ch.PipeImpl.<init>(PipeImpl.java:122)
    at sun.nio.ch.SelectorProviderImpl.openPipe(SelectorProviderImpl.java:27)
    at java.nio.channels.Pipe.open(Pipe.java:133)
    at sun.nio.ch.WindowsSelectorImpl.<init>(WindowsSelectorImpl.java:104)
    at sun.nio.ch.WindowsSelectorProvider.openSelector(WindowsSelectorProvider.java:26)
    at java.nio.channels.Selector.open(Selector.java:209)
    at com.google.code.yanf4j.util.SystemUtils.openSelector(SystemUtils.java:130)
    at com.google.code.yanf4j.nio.impl.Reactor.<init>(Reactor.java:85)
    at com.google.code.yanf4j.nio.impl.SelectorManager.<init>(SelectorManager.java:41)
    at com.google.code.yanf4j.nio.impl.NioController.initialSelectorManager(NioController.java:139)
    at com.google.code.yanf4j.nio.impl.NioController.start0(NioController.java:121)
    at com.google.code.yanf4j.core.impl.AbstractController.start(AbstractController.java:358)
    at net.rubyeye.xmemcached.XMemcachedClient.startConnector(XMemcachedClient.java:600)
    at net.rubyeye.xmemcached.XMemcachedClient.start0(XMemcachedClient.java:593)
    at net.rubyeye.xmemcached.XMemcachedClient.<init>(XMemcachedClient.java:851)
    at net.rubyeye.xmemcached.XMemcachedClientBuilder.build(XMemcachedClientBuilder.java:266)

系统环境是win2003X64,jdk1.6.0_29,框架是ssh

使用的spring配置采用了如下配置

<bean name="memcachedClient3" factory-bean="memcachedClientBuilder"
                factory-method="build" destroy-method="shutdown"/>

再次感谢

Original issue reported on code.google.com by wszyq...@gmail.com on 21 Dec 2011 at 3:20

GoogleCodeExporter commented 9 years ago
补充一下:

Caused by: java.net.SocketException: No buffer space available (maximum 
connections reached?): connect
    at sun.nio.ch.Net.connect(Native Method)
    at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:500)
    at java.nio.channels.SocketChannel.open(SocketChannel.java:146)
    at sun.nio.ch.PipeImpl$Initializer.run(PipeImpl.java:78)
    ... 139 more
[framework] 2011-12-20 19:46:36,789 ERROR - 
com.google.code.yanf4j.core.impl.AbstractController -98254438 
[http-apr-7270-exec-9]  com.google.code.yanf4j.core.impl.AbstractController  - 
Start server error

Original comment by wszyq...@gmail.com on 21 Dec 2011 at 3:22

GoogleCodeExporter commented 9 years ago
已经达到你系统进程的最大文件句柄数,windows怎么设置我不�
��楚。
linux通过ulimit设置。

Original comment by killme2...@gmail.com on 21 Dec 2011 at 3:26

GoogleCodeExporter commented 9 years ago
补充一下:
  系统运行的前几天没有问题,到今天发生异常我停了后台,远程使用我的客户端访问服务器上的memcached,还是能够存取数据的,我怀疑是不是由于client创建后没有关掉,导致后面把资源消耗完导致的。

  谢谢这么快回复

Original comment by wszyq...@gmail.com on 21 Dec 2011 at 3:29

GoogleCodeExporter commented 9 years ago
client应该是单例的,只有在应用shutdown的时候才关闭。

Original comment by killme2...@gmail.com on 21 Dec 2011 at 3:31

GoogleCodeExporter commented 9 years ago
我做了一下压力测试
原来在没有使用xmemcached的时候,几百个并发都没有问题,现�
��使用了之后总是报
java.io.IOException: Unable to establish loopback connection这个问题,

是不是使用了nio的原因?

测试过程中,只是对一个接口测试,jdk的内存增长很快,jdk��
�加到1.4G多就开始报不能建立连接了。jrockit内存增加到2G多就
会报不能建立连接。

怎么回事啊

Original comment by wszyq...@gmail.com on 21 Dec 2011 at 4:20

GoogleCodeExporter commented 9 years ago

Original comment by wszyq...@gmail.com on 21 Dec 2011 at 4:25

Attachments:

GoogleCodeExporter commented 9 years ago
这个是测试过程中显示的连接(部分),随着请求的增加急��
�增加,直到最大,然后就挂了!

怎么回事

Original comment by wszyq...@gmail.com on 21 Dec 2011 at 4:26

GoogleCodeExporter commented 9 years ago
系统挂的时候,占用的内存和句柄数,如下图

Original comment by wszyq...@gmail.com on 21 Dec 2011 at 4:30

Attachments:

GoogleCodeExporter commented 9 years ago
上面的截图反映一个问题,当不断的请求后台时,不断建立me
mcached的客户端不断的建立tcp连接,连接都是established(建立��
�的状态,没有释放,客户端再次请求的时候,win系统就会再�
��客户端建立一个新的连接,这样当请求比较多的时候,就会
耗光全部的能建立的连接,然后报异常

Original comment by wszyq...@gmail.com on 21 Dec 2011 at 4:51

GoogleCodeExporter commented 9 years ago
如果本地测试,采用new的方式建立memcached的连接,使用for循��
�建立xmemcached的客户端500个,就会同样的报Unable to establish 
loopback connection这个异常

Original comment by wszyq...@gmail.com on 21 Dec 2011 at 4:58

GoogleCodeExporter commented 9 years ago
你这是误用,memcached 
client需要复用的,一个应用只要用一个client就够了。
你创建一个client就会创建一些链接占用文件句柄数,当然链��
�不够用。

Original comment by killme2...@gmail.com on 21 Dec 2011 at 5:12

GoogleCodeExporter commented 9 years ago
那好,前面说的new是错误的,那么我在项目里的采用spring管��
�的,那个是单例的吧,是web应用,我模拟客户访问可以吧,�
��是为什么服务器的tcp连接剧增呢?直到挂了。为什么?帮忙
解决一下,我觉得有可能是我的问题,但是找不出来

Original comment by wszyq...@gmail.com on 21 Dec 2011 at 5:40

GoogleCodeExporter commented 9 years ago
memcached 
client本身会占用部分文件句柄,但是理论上不会太多。
你的问题是你的文件句柄数已经超过操作系统限制,你可以��
�试增大这个值。windows我不知道怎么设置,你可以自己google下
,linux可以设置ulimit。

Original comment by killme2...@gmail.com on 21 Dec 2011 at 5:46

GoogleCodeExporter commented 9 years ago
可能我没有解释清楚。我再解释一下
1、发现无法建立连接后,我讲JDK关了,重启,xmem能正常使用
。此时说明mem服务端没有问题,win系统没有问题,使用netstat 
-na查看刚才的TCP连接也都释放了。
 以上表明重启没有问题。

2、重启后,模拟用户请求,服务器的tcp连接不断的增加,why�
��这说明client随着后面的客户请求不断的增加,新的client建立
了。怎么回事?
   我问的就是这个问题,是不是需要在每次使用client之后都要使用client.shutdown(),关闭?

Original comment by wszyq...@gmail.com on 21 Dec 2011 at 5:52

GoogleCodeExporter commented 9 years ago
xmc只会占用固定的文件tcp链接,部分loopback链接是nio内部机制
建立的,每一个selector都会有一对loopback链接。

不要每次使用都调用client.shutdown(),只在应用关闭后调用。简
单地就是交给spring管理生命周期。

我说了,你的问题就是因为加上xmc后,你的文件句柄数恰好��
�到上限了,除了增大,没有好的办法。

Original comment by killme2...@gmail.com on 21 Dec 2011 at 6:03

GoogleCodeExporter commented 9 years ago
加上xmc后没有达到上限,系统还能使用,同时xmc还是能从mem��
�取数据,加数据,

Original comment by wszyq...@gmail.com on 21 Dec 2011 at 6:09

GoogleCodeExporter commented 9 years ago
你说的压测会报错,那就是问题所在。正常使用可能不一定��
�出问题。在高峰的时候就可能暴露了。

Original comment by killme2...@gmail.com on 21 Dec 2011 at 6:14

GoogleCodeExporter commented 9 years ago
那好
谢谢了。
我考虑其他办法吧

Original comment by wszyq...@gmail.com on 21 Dec 2011 at 6:16

GoogleCodeExporter commented 9 years ago
我下午把原来xmemcached的客户端改成了spymemcached,for循环20万��
�,两个线程,在xp系统下测试,使用netstat 
-an命令查看没有任何tcp链接剧增的情况。没有出现早晨链接��
�尽的情况,我觉的是xmemcached的client销毁的问题,可能是我配
置的问题,我是按照官方配置的,但是这个问题值得注意,��
�望作者重视,仅是建议

Original comment by wszyq...@gmail.com on 21 Dec 2011 at 9:16

GoogleCodeExporter commented 9 years ago
嗯,xmc有个selector池,在windows下确实会占用loopback链接。我已
经解释过了。如果你使用xmc的连接池,那也会比spy更多链接��
�通常来说我不推荐xmc使用连接池。

其他我没有更多解释了,这个问题的解决办法就是增大文件��
�柄数。

Original comment by killme2...@gmail.com on 21 Dec 2011 at 10:06

GoogleCodeExporter commented 9 years ago
win 
2003可以在注册表中查找USERProcessHandleQuota,范围设置在200~18000
之间。

TO  killme2...:能否完善下连接池,thanks。

Original comment by Howard.X...@gmail.com on 7 Feb 2012 at 6:26