Вставки узла Монго начинают тихо выходить из строя через несколько минут
Я использую программу прослушивания GPS. Он получает данные от устройств GPS, декодирует, подготавливает окончательный объект данных и затем сохраняет данные в базе данных. Я пытаюсь вставить документы в mongodb из nodejs с помощью следующего кода - (используя собственный драйвер узла mongodb)
var mong = require('mongodb');
var MongoClient = mongo.MongoClient
, format = require('util').format;
MongoClient.connect('mongodb://user:pass@a.b.c.d:27017/dbname', function(err, db) {
if(err) {console.log("mongo connect error " + err); throw err};
gpsdb = db;
console.log("Database Ready");
listener.listen(port);
console.log("Listener Started on: " + port);
});
// code to generate the object to insert - d_obj
var collection = gpsdb.collection(d_obj);
d_obj._id = new mong.ObjectID;
collection.insert(d_obj, {safe:true}, function(err, docs) {
if (err) { console.log("mongo insert query error " + err); return; }
console.log("Inserted 1 rec " + d_obj.imei);
console.dir(docs);
});
Вставки происходят через 2-3 минуты после запуска программы. После этого вставка прекращается. Однако журналы консоли продолжают поступать.
Образец журнала -
Inserted 1 rec 358811020044291
[ { dt_server: '2014-12-12 05:56:14',
dt_tracker: '2014-12-12 05:56:09',
lat: 19.123456,
lng: 73.123456,
angle: 81,
speed: '47',
signal_gsm: 3,
signal_gps: 4,
alarm: 'pcut',
odo: 'y',
offset: 0,
time_stamp: 1418363774454,
ltime: '2014-12-12 05:56:09',
proto: 12,
imei: '123456789123456',
save_mysql: 'no',
altitude: 0,
_id: 548a837e4c73ebaef72d0073 } ]
Console.dir(doc) должен выполняться, только если запрос был выполнен правильно. Я не получаю никаких ошибок или предупреждений. Я получаю этот консольный журнал для каждого обработанного объекта данных. Но вставки не происходят после первых нескольких минут.
Когда я тестирую программу с 1 устройства, отправляющего данные, она работает безупречно в течение нескольких часов. Все данные вставлены правильно. Но когда я запускаю его примерно с 2000 подключенными устройствами, происходит тихий сбой.
Я попытался, удалив свойства из объекта данных (d_obj), который имеет нулевое значение. Это не помогло.
Я нигде не определил ни схемы, ни типов данных.
Возможная причина
Кажется, это проблема блокировки асинхронных вставок. Моя программа на nodejs отправляет много параллельных вставок. Когда я запускаю программу в обычном режиме (асинхронно), вывод mongostat следующий:
connected to: 127.0.0.1
insert query update delete getmore command flushes mapped vsize res faults locked db idx miss % qr|qw ar|aw netIn netOut conn set repl time
138 *0 1 *0 43 28|0 0 496g 992g 10.8g 1 ilogistek:144.8% 0 4|0 0|1 93k 101k 40 rs0 PRI 00:15:12
143 *0 1 *0 70 73|0 0 496g 992g 10.8g 1 ilogistek:176.2% 0 6|0 0|1 106k 108k 40 rs0 PRI 00:15:13
125 *0 1 *0 60 60|0 0 496g 992g 10.9g 2 ilogistek:124.2% 0 5|0 0|1 94k 95k 40 rs0 PRI 00:15:14
181 *0 1 *0 77 96|0 0 496g 992g 11g 0 ilogistek:149.8% 0 6|0 0|1 135k 137k 40 rs0 PRI 00:15:15
91 *0 1 *0 47 45|0 0 496g 992g 11.1g 0 ilogistek:127.0% 0 6|0 0|1 68k 70k 40 rs0 PRI 00:15:16
211 *0 3 *0 74 94|0 0 496g 992g 11.2g 2 ilogistek:138.6% 0 6|0 0|1 152k 156k 40 rs0 PRI 00:15:18
250 *0 2 *0 71 86|0 0 496g 992g 11.2g 5 ilogistek:203.9% 0 10|0 0|1 174k 176k 40 rs0 PRI 00:15:19
270 *0 3 *0 76 111|0 0 496g 992g 10.9g 3 ilogistek:99.2% 0 5|0 0|1 197k 200k 40 rs0 PRI 00:15:20
137 *0 3 *0 54 48|0 0 496g 992g 10.9g 8 ilogistek:137.7% 0 5|0 0|1 97k 100k 40 rs0 PRI 00:15:21
203 *0 1 *0 83 114|0 0 496g 992g 11g 9 ilogistek:154.8% 0 4|0 0|1 153k 152k 40 rs0 PRI 00:15:22
С другой стороны, когда я выполняю запись синхронно (следующая запись выполняется при обратном вызове предыдущей записи), блокировка не происходит, и число операций записи в секунду увеличивается во много раз.
insert query update delete getmore command flushes mapped vsize res faults locked db idx miss % qr|qw ar|aw netIn netOut conn set repl time
1670 *0 1 *0 321 515|0 0 496g 992g 11.4g 0 ilogistek:15.7% 0 0|0 0|0 1m 1m 19 rs0 PRI 00:24:47
1830 *0 1 *0 344 621|0 0 496g 992g 11.4g 0 ilogistek:10.3% 0 0|0 0|0 1m 1m 19 rs0 PRI 00:24:48
1767 *0 1 *0 330 571|0 0 496g 992g 11.4g 1 ilogistek:14.5% 0 0|0 0|0 1m 1m 19 rs0 PRI 00:24:49
1726 *0 1 *0 337 599|0 0 496g 992g 11.4g 0 ilogistek:11.9% 0 0|0 0|0 1m 1m 19 rs0 PRI 00:24:50
1743 *0 1 *0 343 590|0 0 496g 992g 11.4g 0 ilogistek:10.9% 0 0|0 0|0 1m 1m 19 rs0 PRI 00:24:51
1758 *0 1 *0 336 605|0 0 496g 992g 11.4g 0 ilogistek:12.2% 0 0|0 0|0 1m 1m 19 rs0 PRI 00:24:52
1657 *0 1 *0 344 625|0 0 496g 992g 11.4g 0 ilogistek:9.9% 0 0|0 0|1 1m 1m 19 rs0 PRI 00:24:53
1688 *0 1 *0 342 567|0 0 496g 992g 11.4g 0 ilogistek:10.6% 0 0|0 0|0 1m 1m 19 rs0 PRI 00:24:54
1689 *0 1 *0 344 610|0 0 496g 992g 11.4g 0 ilogistek:10.1% 0 0|0 0|0 1m 1m 19 rs0 PRI 00:24:55
1780 *0 1 *0 340 596|0 0 496g 992g 11.4g 0 ilogistek:10.8% 0 0|0 0|0 1m 1m 19 rs0 PRI 00:24:56
Я не могу запустить свою программу синхронно, поскольку это побьет саму цель этого технологического стека.
Есть ли что-то очевидное, чего мне не хватает.
Гуру, пожалуйста, помогите!