下午好,
我们正在尝试将应用程序从Redis迁移到Geode集群,以获得更好的可伸缩性和多广域网同步。目前,我们只测试一个集群。设立的是:
。
服务器设置:
--max-connections=1200 --J=-Xmx12G --J=-Xms12G --J=-XX:+UnlockExperimentalVMOptions
--J=-XX:+UseShenandoahGC --J=-XX:+DisableExplicitGC --J=-XX:+AlwaysPreTouch
--J=-Xlog:gc*:file=gc-%p-%t.log:uptime,time:filecount=3,filesize=10m --J=-Dgemfire.conserve-sockets=false
在负载测试期间,我们间歇性地(每小时一次)在服务器日志中遇到这个错误:
[info 2019/11/18 16:46:03.561 PST <Pooled Waiting Message Processor 20> tid=0x925b] ...
[warn 2019/11/18 17:30:46.363 PST <Handshaker /XX.XXX.XXX.XXX:10001 Thread 152> tid=0xaed1] Rejected connection from /XX.XXX.XXX.XXX because current connection count of 1200 is greater than or equal to the configured max of 1200
[warn 2019/11/18 17:30:46.363 PST <Handshaker /XX.XXX.XXX.XXX:10001 Thread 155> tid=0xb503] Rejected connection from /XX.XXX.XXX.XXX because current connection count of 1200 is greater than or equal to the configured max of 1200
...[hundreds of these messages]关于客户:
org.apache.geode.cache.client.ServerRefusedConnectionException: servername(servername:28165)<v145>:41001 refused connection: exceeded max-connections 1200
at org.apache.geode.internal.cache.tier.sockets.Handshake.readMessage(Handshake.java:331)
at org.apache.geode.cache.client.internal.ClientSideHandshakeImpl.handshakeWithServer(ClientSideHandshakeImpl.java:232)
at org.apache.geode.cache.client.internal.ConnectionImpl.connect(ConnectionImpl.java:102)
at org.apache.geode.cache.client.internal.ConnectionConnector.connectClientToServer(ConnectionConnector.java:71)
at org.apache.geode.cache.client.internal.ConnectionFactoryImpl.createClientToServerConnection(ConnectionFactoryImpl.java:111)
at org.apache.geode.cache.client.internal.pooling.ConnectionManagerImpl.createPooledConnection(ConnectionManagerImpl.java:202)
at org.apache.geode.cache.client.internal.pooling.ConnectionManagerImpl.forceCreateConnection(ConnectionManagerImpl.java:212)
at org.apache.geode.cache.client.internal.pooling.ConnectionManagerImpl.borrowConnection(ConnectionManagerImpl.java:319)
at org.apache.geode.cache.client.internal.pooling.ConnectionManagerImpl.borrowConnection(ConnectionManagerImpl.java:70)客户代码:
ClientCacheFactory cacheFactory = new ClientCacheFactory()
.set("log-level", "ERROR");
for (String locator : locators) {
HostPort hostPort = new HostPort(locator);
cacheFactory.addPoolLocator(hostPort.getHost(), hostPort.getPort());
}
this.cache = cacheFactory.create();然后
private <K,V> Region<K, V> getOrCreateRegion(String name, ClientRegionFactory<K, V> regionFactory) {
Region<K, V> region = cache.getRegion(name);
if (region == null) {
region = regionFactory.create(name);
}
return region;
}若要获取区域,未设置自定义选项。
每个服务器上的正常客户端连接量约为250,但在负载测试期间的某个随机时间(60k读取RPS / 60k写RPS),连接量跃升到最大值(1200),客户端无法打开连接。分区区域具有“分布式-ack”的范围,这会导致错误和数据损坏的激增。服务器自愈立即或两个和连接数下降到正常,但到那时,测试失败。我试着提高日志级别,但是"INFO“只是什么都没有显示(选中的受影响的服务器和定位日志),”调试“生成了大量的数据,以至于服务器无法跟上大量的日志消息。120 k的read+write RPS对我们来说是正常的生产流量,用10k的总体RPS进行测试并没有引起异常。这些锁不与垃圾收集连接,因为gc日志显示在此期间没有运行gc。
您知道如何调优Geode集群以避免这些异常和数据损坏吗?
发布于 2019-11-20 01:01:56
此“拒绝连接:超出最大连接”错误的发生,是因为客户端试图创建更多的连接到服务器,而不是您设置的最大连接。
客户端使用连接池,因此来自单个客户端的并发连接的数量与当前从客户端执行操作的线程数量成正比。
下一步是确定您的负载生成实际创建了多少线程。理论上,每个线程一次只使用一个连接,因此,如果负载非常不均匀,并且所有客户端同时针对同一台服务器,则最大连接的最坏情况应该是在num_threads * num_clients附近。
如果无法控制客户端上的线程数,池本身就有调优参数(如PoolFactory.setMaxConnections ),这将限制来自单个客户端的连接数。
https://stackoverflow.com/questions/58944578
复制相似问题