我们在应用程序中使用Pivotal GemFire进行 Spring Session 管理。
在生产中,当负载增加时,应用程序无响应(完全挂起)。我们收到一个错误,例如客户端被列入黑名单。我们检查了请求计数,大约是15k。
该应用程序部署在容器中。使用的协议为Http11AprProtocol
,最大线程数设置为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)
]
答案 0 :(得分:1)
GemFire每秒可以处理15K请求/分钟(??)。不确定您的测量单位是多少,但秒/分钟实际上并不重要。它可能需要进行一些调整,但是GemFire应该能够处理它,无论是几分钟还是几秒钟。
需要考虑的几件事:
1)首先,看看here。
2)当然,您可以调整客户端/服务器拓扑的两侧。
在客户端上,您可以使用PoolFactory
来配置设置,例如最小/最大连接,prSingleHopEnable,socketBufferSize,threadLocalConnections等。
使用Spring Session for Pivotal GemFire,在客户端(Web应用程序,GemFire Pool
)上使用的ClientCache
可以通过使用SDG ClientCacheFactoryBean
类(如果使用“ DEFAULT”)进行配置GemFire Pool
,您经常将自己声明为so或PoolFactoryBean
类,如果您在Spring Session for Pivotal GemFire中使用特定的“命名” Pool
,在这种情况下,它将看起来像这样...
@SpringBootApplication
@EnableGemFireHttpSession(poolName = "SessionPool", ...)
class MySpringSessionGemFireClientApplication {
@Bean("SessionPool")
PoolFactoryBean sessionPool() {
PoolFactoryBean sessionPool = new PoolFactoryBean();
sessionPool.setMaxConnections(..);
sessionPool.set...
return sessionPool;
}
}
在服务器上,这实际上取决于您如何启动节点(例如, Gfsh ,使用 Spring 等)。但实际上,它归结为CacheServer
上的设置。例如:loadPoolInterval,maxConnections,socketBufferSize,maxThreads等。
3)我还要说,您需要首先收集信息,以确定问题可能出在哪里,查看服务器日志,统计信息等。应该在上面的#1中推荐该信息。
4)还有其他因素需要考虑,例如数据大小。
5)从网络的角度来看,您必须考虑一些因素,添加“容器”会增加另一层复杂性,因此它将取决于UC,体系结构和基础结构。
总而言之,要确定所有问题(例如拓扑,体系结构,数据大小,配置,应用程序设计等)所导致的问题是很难确定的。提供日志,统计信息等可能会有所启发。
不确定您为什么认为上面的线程转储是“错误”。是的,“ 缓存客户端更新程序线程”持有一个对象锁,但是,该线程也保持可运行状态(在使用中)。仅当另一个线程(一个或多个)正在等待或阻塞,正在等待该锁并且开始消耗资源或阻塞/降级某些应用程序工作流时,线程才持有锁的事实才是问题。
我怀疑您在GemFire和容器之间有问题,但是我不能肯定地说。