Tomcat 基于Spring的GemFire客户端可以处理的同时请求数

Tomcat 基于Spring的GemFire客户端可以处理的同时请求数,tomcat,containers,gemfire,session-management,spring-data-gemfire,Tomcat,Containers,Gemfire,Session Management,Spring Data Gemfire,在我们的应用程序中,我们使用的是Spring会话管理 在生产环境中,当负载增加时,应用程序没有响应(完全挂起)。我们收到一个错误,就像客户被列入黑名单一样。我们检查了请求数量,结果是15k 应用程序部署在容器中。使用的协议是http11aprotocol,最大线程数设置为200。我们检查了线程转储。错误如下所示 我们不确定装载量是否无法通过集装箱或GemFire处理。在GemFire中,是否有任何特定参数确定它可以处理的线程数。感谢您的帮助 Cache Client Updater Thread

在我们的应用程序中,我们使用的是Spring会话管理

在生产环境中,当负载增加时,应用程序没有响应(完全挂起)。我们收到一个错误,就像客户被列入黑名单一样。我们检查了请求数量,结果是15k

应用程序部署在容器中。使用的协议是
http11aprotocol
,最大线程数设置为
200
。我们检查了线程转储。错误如下所示

我们不确定装载量是否无法通过集装箱或GemFire处理。在GemFire中,是否有任何特定参数确定它可以处理的线程数。感谢您的帮助

Cache Client Updater Thread  on server Id=14397 in RUNNABLE (running in native)
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:171)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at sun.security.ssl.InputRecord.readFully(InputRecord.java:465)
at sun.security.ssl.InputRecord.read(InputRecord.java:503)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:983)
- locked java.lang.Object@2f2e340
at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:940)
at sun.security.ssl.AppInputStream.read(AppInputStream.java:105)
- locked sun.security.ssl.AppInputStream@1ce48525
at org.apache.geode.internal.cache.tier.sockets.Message.fetchHeader(Message.java:809)

]

GemFire每秒/分钟处理15K请求应该没有问题(?)。不确定你的测量值是多少,但秒/分钟真的不重要。它可能需要一些调整,但GemFire应该能够处理它,无论是几分钟还是几秒钟

需要考虑的几件事:

1) 首先,看一看

2) 当然,您可以调整客户机/服务器拓扑的两侧

在客户端上,您可以使用来配置设置,例如最小/最大连接、prSingleHopEnable、socketBufferSize、threadLocalConnections等

将Spring会话用于Pivotal GemFire,客户端(Web应用程序,GemFire
ClientCache
)上使用的
池可以使用SDG类(如果使用“默认”GemFire
池)进行配置,如果使用的是您经常声明自己的“已命名”的
Pool
与Fire的Spring会话,在这种情况下,它看起来像这样

@SpringBootApplication
@EnableGemFireHttpSession(poolName = "SessionPool", ...)
class MySpringSessionGemFireClientApplication {


  @Bean("SessionPool")
  PoolFactoryBean sessionPool() {

    PoolFactoryBean sessionPool = new PoolFactoryBean();

    sessionPool.setMaxConnections(..);
    sessionPool.set...

    return sessionPool;
  }
}
在服务器上,这实际上取决于您如何启动节点(例如Gfsh、使用Spring等)。但从本质上讲,它归结为计算机上的设置。例如:LoadPooletVal、maxConnections、socketBufferSize、maxThreads等

3) 我还想说,您需要首先收集信息以确定问题可能在哪里,查看服务器日志、统计数据等。这些信息应该在上面的#1中推荐

4) 还有其他因素需要考虑,例如数据的大小

5)有一些事情必须从网络的角度考虑,并且添加“容器”增加了整个复杂的另一层,因此它将是UC、体系结构、基础设施相关的。 总之,所有这些都是说,很难说在所有因素(例如拓扑、架构、数据大小、配置、应用程序设计等)的作用下问题是什么。提供日志、统计数据等可能会有所帮助

不确定为什么您认为上面的线程转储是一个“错误”。是的,“缓存客户端更新程序线程”持有对象锁,但是,该线程也保持可运行状态(在服务中)。只有当另一个线程(1个或多个)正在等待或阻止该锁,并且它开始消耗资源,或者阻止/降级某些应用程序工作流时,该线程持有锁的事实才是一个问题

我怀疑GemFire和集装箱之间有问题,但我不能肯定这一点