TThreadPoolServer客户端org.apache.thrift.transport.ttTransportException:java.net.SocketException:breaked pipe

TThreadPoolServer客户端org.apache.thrift.transport.ttTransportException:java.net.SocketException:breaked pipe,java,thrift,Java,Thrift,当使用高负载测试thrift客户端时,我遇到了一个问题 设置: Thrift Server是一个线程池服务器。它执行和操作,每次只需1-5毫秒。Thrift客户端通过新连接连接到服务器,调用操作一次并关闭连接 当负载达到160 TPS时,客户端开始抛出以下异常 org.apache.thrift.transport.TTransportException: java.net.SocketException: Broken pipe at org.apache.thrift.transport.

当使用高负载测试thrift客户端时,我遇到了一个问题

设置: Thrift Server是一个线程池服务器。它执行和操作,每次只需1-5毫秒。Thrift客户端通过新连接连接到服务器,调用操作一次并关闭连接

当负载达到160 TPS时,客户端开始抛出以下异常

org.apache.thrift.transport.TTransportException: java.net.SocketException: Broken pipe  at org.apache.thrift.transport.TIOStreamTransport.flush(TIOStreamTransport.java:161) ~[libthrift-0.9.1.jar:0.9.1]
at org.apache.thrift.TServiceClient.sendBase(TServiceClient.java:65) ~[libthrift-0.9.1.jar:0.9.1]
at com.ebay.traffic.email.delstats.thrift.interfaces.GSCassandreServices$Client.send_insertRow(GSCassandreServices.java:84) ~[GSCassandreServices$Client.class:na]
at com.ebay.traffic.email.delstats.thrift.interfaces.GSCassandreServices$Client.insertRow(GSCassandreServices.java:75) ~[GSCassandreServices$Client.class:na]
at com.ebay.traffic.email.delstats.thrift.impl.client.SimpleThriftClient.insertRowViaCQL(SimpleThriftClient.java:90) ~[SimpleThriftClient.class:na]
at com.ebay.traffic.email.delstats.entity.EventsEntityQueryHandlerImpl.insertEvents(EventsEntityQueryHandlerImpl.java:97) [EventsEntityQueryHandlerImpl.class:na]
at com.ebay.app.raptor.delstats.resources.StatsServiceResource.registerEvents(StatsServiceResource.java:306) [StatsServiceResource.class:na]
at sun.reflect.GeneratedMethodAccessor104.invoke(Unknown Source) ~[na:na]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.7.0]
at java.lang.reflect.Method.invoke(Method.java:602) ~[na:2.6 (08-23-2013)]
at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60) [jersey-server-1.8.jar:1.8]
at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:205) [jersey-server-1.8.jar:1.8]
at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75) [jersey-server-1.8.jar:1.8]
at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:288) [jersey-server-1.8.jar:1.8]
at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) [jersey-server-1.8.jar:1.8]
at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108) [jersey-server-1.8.jar:1.8]
at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) [jersey-server-1.8.jar:1.8]
at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84) [jersey-server-1.8.jar:1.8]
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1469) [jersey-server-1.8.jar:1.8]
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1400) [jersey-server-1.8.jar:1.8]
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1349) [jersey-server-1.8.jar:1.8]
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1339) [jersey-server-1.8.jar:1.8]
请注意,大部分连接都会成功,但由于这个错误,我丢失了大约10%的总连接

我检查了服务器上的netstat,每个请求的连接都会关闭(一次打开的连接不多),而且服务器上根本没有异常/错误。这是对thrift服务器的限制吗

谢谢,
Gopi

我的负载在服务器上打开了很多连接,这超出了预期。我可以看到服务器端同时打开了5000多个套接字。正如EJP所建议的,处理这个问题的最好方法是使用一个线程池客户端,它可以从我这里工作。这将限制与服务器的连接,并且服务器能够接受所有连接

重现问题的方法:

  • 有一个什么都不做的节俭界面
  • 启动TThreadPoolServer
  • 运行一个有100个线程的简单Java客户端,每个客户端都有一个for循环无限期运行-for循环应该创建一个新套接字,调用thrift接口,然后关闭套接字连接(在循环结束之前)

不要每次都打开新连接,尝试共享或重复使用它们。服务器就像一个中间件,可以为大约30台客户机提供服务。如果我重新使用连接,那么如果每台机器有40个线程,并且连接被重用,那么服务器中将有大约1200个线程打开。从服务器的角度看,这样可以吗?这没什么好担心的,但这个问题无论如何都没有意义。如果您计划同时为1200个客户端提供服务,那么无论连接模式如何,您都需要多少线程。连接池的作用是减少线程创建的数量。