При запуске mongostat для просмотра нашей базы данных mongo я часто вижу, как заблокированное число% подскакивает, иногда до 80%. Вот несколько примеров строк:
insert query update delete getmore command flushes mapped vsize res faults locked % idx miss % qr|qw ar|aw netIn netOut conn time
0 10 7 0 0 17 0 2.27g 5g 1.63g 0 0.1 0 0|0 0|0 22k 7k 83 15:46:10
0 21 7 1 0 23 0 2.27g 5g 1.73g 0 0.1 0 0|0 0|1 11k 424k 83 15:46:11
0 28 10 3 0 28 0 2.27g 5g 1.73g 0 26.9 0 0|0 0|0 33k 196k 83 15:46:12
0 17 6 3 0 13 0 2.27g 5g 1.72g 0 18.2 0 0|0 0|0 11k 10k 83 15:46:13
0 18 5 1 0 11 0 2.27g 5g 1.73g 0 0.1 0 0|0 0|0 23k 362k 83 15:46:14
В справке по монгостату написано, что это
заблокировано - процент времени в глобальной блокировке записи
Насколько я понимаю, запись блокирует всю базу данных. Если у меня есть две базы данных на одном сервере mongo (A и B), будет ли запись в блоке A записывать на B? Означает ли половина времени использования одной базы данных 25% (например, при использовании половины одного ядра в двухъядерном корпусе) или 50%?
Да, MongoDB использует глобальную блокировку записи (на уровне сервера), поэтому "% блокировки", сообщаемый mongostat, представляет собой общее количество времени, которое сервер провел в глобальной блокировке записи в течение последнего периода выборки (одна секунда) - для всех операций по всем dbs.
По мере того как вы выполняете больше операций записи, таких как обновления, вставки, удаления и удаления, это значение будет увеличиваться.
Цифры в приведенном выше примере не вызывают беспокойства для автономного сервера.
Однако регулярные показания 80% предполагают, что вы можете захотеть сбалансировать свои чтения и записи на большем количестве серверов или разделить свою коллекцию (-и), хотя я бы посмотрел на сегментирование, чтобы облегчить проблемы с хранением, прежде чем проблемы с производительностью.
В общем, ключи к оптимизации включают правильное и полное индексирование, ограничение результатов, использование профилировщика и объяснение () для выявления узких мест, а также обеспечение правильного использования драйвера (экспериментирование с размером пакета курсора может привести к значительным улучшениям).
Высокий процент блокировки записи - не единственный показатель производительности. Вы должны объединить это число с вашей очередью записи, которая указывает количество вставок / обновлений / upserts и операций удаления, которые поставлены в очередь (всего) для получения блокировки. Если оба числа остаются стабильно высокими, возникает проблема, которую следует немедленно решать. В таком случае начните с извлечения самых медленных запросов, проанализируйте их и попытайтесь настроить. Если дальнейшая настройка невозможна, обратитесь к ресурсам, выделенным на сервере.