У меня проблемы с производительностью MongoDB.
Работает на:
- MongoDB 2.0.1
- Windows 2008 R2
- 12 ГБ ОЗУ
- 2 ТБ HDD (5400 об / мин)
Я написал демон, который удаляет и вставляет записи асинхронно. Каждый час большинство коллекций очищается, и они получают новые вставленные данные (10-12 миллионов удалений и 10-12 миллионов вставок). При вставке данных демон использует ~ 60-80 ЦП (из-за расчета более 1 миллиона проблем с рюкзаком). Когда я запускаю демон, он может работать примерно 1-2 минуты, пока он не выйдет из строя из-за истечения времени сокета (запись данных на сервер MongoDB).
Когда я просматриваю логи, я вижу, что удаление данных из коллекции занимает около 30 секунд. Кажется, это как-то связано с загрузкой процессора и использованием памяти .., потому что когда я запускаю демон на другом ПК, все идет хорошо.
Возможна ли какая-либо оптимизация или я просто обязан использовать отдельный ПК для запуска демона (или выбрать другое хранилище документов)?
ОБНОВЛЕНИЕ 13.11.2011 18:44 GMT + 1
Все еще возникают проблемы ... Я сделал некоторые изменения в моем демоне. Я уменьшил количество одновременных записей. Однако, демон по-прежнему падает, когда память заполняется (11,8 ГБ из 12 ГБ) и получает больше нагрузки (загрузка данных в интерфейс). Вылетает из-за долгой вставки / удаления MongoDB (30 секунд). Сбой демона происходит из-за медленной реакции MongoDB (исключение времени ожидания сокета). Конечно, должны быть операторы try / catch для отлова таких исключений, но это не должно происходить в первую очередь. Я ищу решение, чтобы решить эту проблему, а не обходить его.
- Общий объем хранилища: 8,1 ГБ
- Размер индекса: 2,1 ГБ
Я полагаю, что проблема заключается в том, что рабочие наборы + индексы слишком велики для хранения в памяти, и MongoDB необходим доступ к жесткому диску (скорость 5400 об / мин). Однако почему это может быть проблемой? Нет других стратегий для хранения коллекций (например, в отдельных файлах вместо больших кусков по 2 ГБ). Если реляционная база данных может считывать / записывать данные в течение приемлемого промежутка времени с диска, то почему не может MongoDB?
ОБНОВЛЕНИЕ 15.11.2011 00:04 GMT + 1
Файл журнала для иллюстрации проблемы:
00:02:46 [conn3] insert bargains.auction-history-eu-bloodhoof-horde 421ms
00:02:47 [conn6] insert bargains.auction-history-eu-blackhand-horde 1357ms
00:02:48 [conn3] insert bargains.auction-history-eu-bloodhoof-alliance 577ms
00:02:48 [conn6] insert bargains.auction-history-eu-blackhand-alliance 499ms
<b>00:02:49 [conn4] remove bargains.crafts-eu-agamaggan-horde 34881ms</b>
00:02:49 [conn5] remove bargains.crafts-eu-aggramar-horde 3135ms
00:02:49 [conn5] insert bargains.crafts-eu-aggramar-horde 234ms
<b>00:02:50 [conn2] remove bargains.auctions-eu-aerie-peak-horde 36223ms</b>
00:02:52 [conn5] remove bargains.auctions-eu-aegwynn-horde 1700ms
ОБНОВЛЕНИЕ 18.11.2011 10:41 GMT + 1
После публикации этой проблемы в группе пользователей mongodb мы обнаружили, что «drop» не было выпущено. Удаление намного быстрее, чем полное удаление всех записей.
Я использую официальный mongodb-csharp-драйвер. Я дал эту команду collection.Drop();
. Однако это не сработало, поэтому пока я использовал это:
public void Clear()
{
if (collection.Exists())
{
var command = new CommandDocument {
{ "drop", collectionName }
};
collection.Database.RunCommand(command);
}
}
Демон теперь достаточно стабилен, но мне нужно выяснить, почему метод collection.Drop()
не работает так, как предполагалось, поскольку драйвер также использует собственную команду сброса.