我有一个mongo数据库设置,我正在运行大量的findAndModify查询。起初它表现很好,每秒执行约400次查询和〜1000次更新(根据mongostat)。这导致了80-90%的锁定百分比,但考虑到数据吞吐量,这似乎是合理的。
过了一段时间它已经慢慢爬行了,现在每秒只做~20次查询/ ~50次更新。
所有查询都在一个集合中。大多数集合都有一组基本数据(只是键:值条目,没有数组或类似),不受影响,然后是下载格式为+字节数的下载数组。例如:
downloads: [
{
'bytes: 123131,
'format': extra
},
{
'bytes: 123131,
'format': extra_hd
}
...
]
一些搜索告诉我,大数组并不好,但是如果大多数文档在这个数组中只有10-15个条目(有少数异常值有1000+),它是否还会影响我的实例呢?
CPU负载不断接近100%,锁定%不断接近100%。我使用的查询被编入索引(我通过explain()
确认),所以这应该不是问题。
正在运行iostat 1
会给我以下内容:
disk0 cpu load average
KB/t tps MB/s us sy id 1m 5m 15m
56.86 122 6.80 14 5 81 2.92 2.94 2.48
24.00 9 0.21 15 1 84 2.92 2.94 2.48
21.33 3 0.06 14 2 84 2.92 2.94 2.48
24.00 3 0.07 15 1 84 2.92 2.94 2.48
33.14 7 0.23 14 1 85 2.92 2.94 2.48
13.68 101 1.35 15 2 84 2.92 2.94 2.49
30.00 4 0.12 14 1 84 2.92 2.94 2.49
16.00 4 0.06 14 1 85 2.92 2.94 2.49
28.00 4 0.11 14 2 84 2.92 2.94 2.49
33.60 5 0.16 14 1 85 2.92 2.94 2.49
我正在使用mongodb 2.4.8,虽然升级是一个选项,我宁愿避免它。它在OS X上的本地SSD磁盘上运行。它将被转移到服务器上运行,但我想在移动它之前修复或至少理解性能问题。