Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Cassandra 2.1群集始终显示高CPU使用率和慢响应_Java_Performance_Cassandra_Garbage Collection_Cassandra 2.1 - Fatal编程技术网

Java Cassandra 2.1群集始终显示高CPU使用率和慢响应

Java Cassandra 2.1群集始终显示高CPU使用率和慢响应,java,performance,cassandra,garbage-collection,cassandra-2.1,Java,Performance,Cassandra,Garbage Collection,Cassandra 2.1,5月3日我们部署了。我们的3节点cassandra集群变得非常慢,许多web请求都超时了。到5月3日的排爆日,我们向集群发射了另一台m1.5大型机器,解决了超时问题。尽管如此,集群仍然非常缓慢;5月4日,我们发布了五个i3.xLarge节点。这大大缩短了我们的应用程序响应时间,5月5日,我们从集群中移除了旧的m1.1大盒子。截至5月5日的排爆,一切都很迅速,反应迅速。今天早上,应用程序再次开始超时 我们注意到一些奇怪的CPU利用率行为-CPU利用率在100%和200%之间波动,而不考虑负载(它们

5月3日我们部署了。我们的3节点cassandra集群变得非常慢,许多web请求都超时了。到5月3日的排爆日,我们向集群发射了另一台m1.5大型机器,解决了超时问题。尽管如此,集群仍然非常缓慢;5月4日,我们发布了五个i3.xLarge节点。这大大缩短了我们的应用程序响应时间,5月5日,我们从集群中移除了旧的m1.1大盒子。截至5月5日的排爆,一切都很迅速,反应迅速。今天早上,应用程序再次开始超时

我们注意到一些奇怪的CPU利用率行为-CPU利用率在100%和200%之间波动,而不考虑负载(它们是四核机器)。我们有非常轻的周末,绝对没有负载,相对较重的周一负载,但我们看到CPU使用率绝对没有变化

正如您在下面的2周图表中所看到的,我们的数据库CPU使用率曾经与应用程序使用率绑定在一起。你可以在第三节看到大的峰值,第四节新机器的引入,以及第六节开始的稳定的高CPU使用率

我们花了大量时间试图确定CPU使用的原因,并能够确定(并随后排除)三个主要原因:

  • 调整不当的垃圾收集
  • 差调紧
  • 我们已经排除了这三件事

  • 我们的服务器的CPU使用率为0.0%
  • 我们的GC吞吐量约为96%。我们还调整了堆和新的堆大小,并切换到G1 GC。我们的日志曾经显示与长GC暂停相关的警告,但现在不再显示了。此外,GC线程只占少量CPU使用量
  • nodetool compactionstats
    返回0个挂起的任务。我们已切换到LeveledCompactionStrategy,并将GC_GRACE_秒设置为1天。我们的日志曾经显示与大量墓碑有关的警告,但现在不再显示了
    nodetool compressionhistory
    显示每小时约一次压缩,根据日志,它们发生得非常快(<1秒)
  • Cassandra的
    SharedPoolWorker
    线程的使用率似乎非常高。下面是按线程类型列出的一个节点的CPU使用率(它们看起来非常相似):

    检查SharedPool工作线程的状态表明,绝大多数正在等待以下堆栈跟踪:

    java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        at java.util.concurrent.locks.LockSupport.park(Unknown Source)
        at org.apache.cassandra.concurrent.SEPWorker.run(SEPWorker.java:85)
        at java.lang.Thread.run(Unknown Source)
    
    我认为这就是问题所在,但我不确定为什么会出现这种情况,因为等待的CPU时间很少(根据
    dstat
    ,始终为0%)

    现在,非常有趣的是,在任何给定节点上运行
    nodetool tpstats
    都会显示少量处于活动状态的ReadStage线程,偶尔会有一两个处于挂起状态。没有阻塞、所有时间阻塞或丢弃

    这是到的输出,这是nodetool netstats:

    Mode: NORMAL
    Not sending any streams.
    Read Repair Statistics:
    Attempted: 12229
    Mismatch (Blocking): 2
    Mismatch (Background): 0
    Pool Name                    Active   Pending      Completed   Dropped
    Commands                        n/a         0         707576         0
    Responses                       n/a         0         859216       n/a
    

    有人知道为什么会发生这种情况吗?任何我们可以研究的潜在问题?

    它可能与大量墓碑或大量单次读取扫描的sstables有关,这会造成持续的高CPU负载和缓慢响应,因为它需要对每个请求执行大量读取

    例如,这些症状可能表现为使用STC时不断且频繁地更新(更新行,而不是添加新行)数据


    能否将主表的nodetool tablestats/cfstats添加到问题中?

    问题实际上是我们的API。它有GC问题,导致大量db读/写线程被冻结。

    我已经更新了问题,包括
    nodetool cfstats
    nodetool netstats
    。看起来,
    nodetool tablestats
    是与cassandra 3一起发布的第一个版本。正因为这个原因,我们也转向了一个水平压缩策略。去LCS应该是一个不错的选择。如果数据更新非常频繁,考虑将GCGREST设置为较低的值。关于cfststs-表边存储看起来有问题,因为每个切片读取的墓碑数很高。您能详细说明一下吗?这里的GC问题是什么?
    Mode: NORMAL
    Not sending any streams.
    Read Repair Statistics:
    Attempted: 12229
    Mismatch (Blocking): 2
    Mismatch (Background): 0
    Pool Name                    Active   Pending      Completed   Dropped
    Commands                        n/a         0         707576         0
    Responses                       n/a         0         859216       n/a