我们正在对使用Couchbase DB的应用程序进行负载测试。 我们定期进行线程转储。在调用couchbase线程之后的所有线程转储都处于BLOCKED状态。 我们并没有低估这种行为
以下是couchbase环境的配置
DefaultCouchbaseEnvironment.builder().kvTimeout(5000).connectTimeout(7500)
.viewTimeout(7500).queryTimeout(7500).disconnectTimeout(10000)
.retryStrategy(BestEffortRetryStrategy.INSTANCE).build();
我们正在进行简单的CRUD操作,比如
JsonDocument doc =
JsonDocument.create("1236",
JsonObject.create().put("name", "test"));
bucket.insert(doc);
下面是我们从Jstack
获得的stackstraceThread 4257: (state = BLOCKED)
- sun.misc.Unsafe.park(boolean, long) @bci=0 (Compiled frame; information may be imprecise)
- java.util.concurrent.locks.LockSupport.parkNanos(java.lang.Object, long) @bci=20, line=215 (Compiled frame)
- java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedNanos(int, long) @bci=139, line=1037 (Compiled frame)
- java.util.concurrent.locks.AbstractQueuedSynchronizer.tryAcquireSharedNanos(int, long) @bci=25, line=1328 (Compiled frame)
- java.util.concurrent.CountDownLatch.await(long, java.util.concurrent.TimeUnit) @bci=10, line=277 (Compiled frame)
- com.couchbase.client.java.util.Blocking.blockForSingle(rx.Observable, long, java.util.concurrent.TimeUnit) @bci=32, line=72 (Compiled frame)
- com.couchbase.client.java.CouchbaseBucket.get(java.lang.String, long, java.util.concurrent.TimeUnit) @bci=17, line=118 (Compiled frame)
- com.couchbase.client.java.CouchbaseBucket.get(java.lang.String) @bci=9, line=113 (Compiled frame)
我们所有的文件都是KB格式的。 我们有一个包含3个节点的集群。 Java sdk version-2.3.4
请指导我们了解行为。
由于
答案 0 :(得分:0)
我得到了上述问题的正确解释和解决方案。
线程的BLOCKED状态的原因是使用同步操作。
而不是使用
var original = {
"fruit" : ["mango","orange"],
"veg" : ["carrot"]
}
var converted = _.map(original, function(name, type){
return {
type: type,
name: name
};
});
我们使用了couchbase JAVA SDK中提供的异步操作
bucket.insert
这有助于我们获得更好的吞吐量,并且我们没有看到线程处于BLOCKED状态,并且应用程序TPS也增加到非常好的值。
以下是针对上述问题的沙发基础论坛讨论的主题
https://forums.couchbase.com/t/couchbase-threads-are-in-blocked-state/11524/2
希望这会有所帮助。