Медленная запись MongoDB вызывает исключение тайм-аута сокета - PullRequest
3 голосов
/ 11 ноября 2011

У меня проблемы с производительностью 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() не работает так, как предполагалось, поскольку драйвер также использует собственную команду сброса.

Ответы [ 5 ]

3 голосов
/ 11 ноября 2011

Возможны некоторые оптимизации:

  1. Убедитесь, что ваш mongodb не работает в режиме verbose, это обеспечит минимальное ведение журнала и, следовательно, минимальный ввод-вывод.В противном случае он записывает каждую операцию в файл журнала.

  2. Если возможно с помощью логики приложения, преобразуйте вставки в массовые вставки. Большая вставка поддерживается в большинстве драйверов mongodb.http://www.mongodb.org/display/DOCS/Inserting#Inserting-Bulkinserts

  3. Вместо одной операции удаления для каждой записи, попробуйте удалить навалом.например.собрать "_id" из 1000 документов, а затем запустить запрос на удаление, используя оператор $in.У вас будет в 1000 раз меньше запросов к mongoDb.

  4. Если вы удаляете / вставляете тот же документ для обновления данных, попробуйте вместо этого рассмотреть обновление.

  5. Какого рода Деймон ты бежишь?Если вы можете поделиться дополнительной информацией об этом, возможно, можно будет оптимизировать и эту информацию, чтобы уменьшить нагрузку на процессор.

2 голосов
/ 11 ноября 2011

Это может быть совершенно не связано, но в 2.0.0 была проблема, связанная с загрузкой процессора. после обновления до 2.0.0 Монго начинает использовать все ресурсы процессора, блокирующие систему, жалуется на утечку памяти

0 голосов
/ 20 ноября 2011

Демон теперь стабилен. После публикации этой проблемы в группе пользователей mongodb мы обнаружили, что "drop" не был выпущен.Удаление намного быстрее, чем полное удаление всех записей.

0 голосов
/ 17 ноября 2011

У меня было нечто подобное с SQL Server 2008 на Windows Server 2008 R2. Для меня это оказалось сетевой картой. Сетевой адаптер был настроен на автоматическое определение скорости соединения, что приводило к случайным пропущенным / потерянным пакетам, что приводило к проблемам времени ожидания сокета. Для проверки вы можете проверить связь с локальной рабочей станцией и запустить процесс загрузки сервера Windows 2008 R2. Если это проблема, в конце концов вы начнете видеть таймауты в вашей команде ping

ping yourWin2008R2Server -n 1000

В итоге было решено установить скорость соединения NIC «Управление компьютером»> «Диспетчер устройств»> «Сетевые адаптеры»> «Свойства», а затем, в зависимости от размера, у вас будет вкладка «Настройка скорости соединения» или необходимо перейти в другое меню. Вы захотите установить именно такую ​​скорость сети, к которой он подключен. В моей среде DEV это было 100 Мбит / с полудуплекс.

Подобные проблемы, как вы знаете, могут быть настоящей болью для отслеживания!

Лучше всего разобраться.

0 голосов
/ 13 ноября 2011

Если не правильно понял, ваше приложение падает, а не mongod. Вы пытались удалить MongoDB с картинки и заменить запись в MongoDB, возможно, записью в файловую систему?

Возможно, это прояснит некоторые другие проблемы внутри вашего приложения, которые не связаны конкретно с MongoDB.

...