我不是Cassandra的专家。几个月前,我收到了为社交网络应用程序建立数据库的命令。由于我从网络引用的很多原因,我选择Cassandra来存储所有Feed的元数据,并选择redis来存储列表,zset或id(轻量级和大多数更改的数据)。我的Cassandra集群包括4个节点,复制因子设置为2,2个服务器中有4个节点(每个服务器有2个节点)。我配置了cassandra.yaml来尽可能快地调整Cassandra集群。 我的系统似乎一直很好,直到有一天我查看系统统计数据。这太不可思议了。让我解释一下原因:
First: I type "iostat -x 5" to view io stat. The result is as following:
avg-cpu: %user %nice %system %iowait %steal %idle
0.35 0.00 0.82 0.08 0.00 98.75
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sda 0.00 0.00 0.00 2.80 0.00 22.40 8.00 0.01 4.50 3.93 1.10
sdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sdd 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sdc 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
这里的CPU为0.35%,虽然我们只有4000个活跃用户,但IO还不是我的问题。问题出在这里。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
4689 root 20 0 13.1g 6.8g 182m S 514.6 21.8 37374:09 java 5029 root 20 0 13.0g 6.7g 174m S 1.7 21.5 10113:45 java
CPU cassandra节点用得太多了。即使一个节点可以高达1400%的CPU,然后它也会下降到0.5%。我真的不知道为什么。谁能告诉我为什么?如果可能的话,请告诉我处理它的解决方案。提前谢谢!
答案 0 :(得分:2)
检查调试日志信息后,我想我抓住了问题的根源。由于GC,Cassandra占用了大量的CPU周期。
这是一个日志轨道:
INFO [ScheduledTasks:1] 2013-05-08 18:20:38,334 GCInspector.java (line 122) GC for ParNew: 269 ms for 1 collections, 3367771984 used; max is 6358564864
每次GC运行时,CPU周期都会增加。 在我的设置中,我设置堆内存等于6GB,我认为它将导致消耗大量的CPU周期,而Cassandra执行GC处理。但是将其设置为较低的值可以降低性能。 谁能告诉我我必须做些什么?