Article ID: 1675, created on Jun 13, 2010, last review on Sep 19, 2014

  • Applies to:
  • Virtuozzo containers for Windows

Симптомы

В контейнерах не работают веб-службы (w3svc, named, ftpsvc).

В просмотрщике событий на физическом сервере присутствуют следующие ошибки:

Event ID 2020
Event Type: Error
Event Source: Srv
Event Category: None
Event ID: 2020
Description: The server was unable to allocate from the system paged pool because the pool was empty.

Event ID 2019
Event Type: Error
Event Source: Srv
Event Category: None
Event ID: 2019
Description: The server was unable to allocate from the system Non-Paged pool because the pool was empty.

Различные процессы могут выдавать ошибку WIN32 1450:

C:\>net helpmsg 1450
1450: Insufficient system resources exist to complete the requested service

или давать сбой с кодом 0x8:

C:\>net helpmsg 8
Not enough storage is available to process this command

Например, из-за этой ошибки могут не запускаться контейнеры:

C:\>vzctl start 101     
Starting container ...
Parallels Virtuozzo Containers API function call 'VZVolumeMountExW' failed (C:\vz\Private\101\root.efd, {04588fbf-09b5-42a1-af9b-5f0031dd511c}) err = 1450 
Parallels Virtuozzo Containers API function call 'dq_mount' failed 
Cannot set disk quota for container 101
Cannot mount disk for container 101

Также возможны проблемы при создании резервной копии контейнера:

* Operation backup_env with the Env(s) ct101 is started
* Backing up environment ct101 to backupnode
...
* Operation backup_env with the Env(s) ct101 is finished with errors: 
Failed to backup partition Acronis Error: Module=7 Code=4, "Write error"{=0}, Tag=0 
Acronis Error: Module=4 Code=3, "Error writing the file."{function="WriteFile"}, Tag=7ceb2cdc9fb1200f 
Acronis Error: Module=0 Code=fff0, "Insufficient system resources exist to complete the requested service."{code=ffffffff800705aa}, Tag=bd28fdbd64edb816 .
Backup operation for node 'vz1' failed: Failed to backup partition Acronis Error: Module=7 Code=4, "Write error"{=0}, Tag=0 
Acronis Error: Module=4 Code=3, "Error writing the file."{function="WriteFile"}, Tag=7ceb2cdc9fb1200f 
Acronis Error: Module=0 Code=fff0, "Insufficient system resources exist to complete the requested service."{code=ffffffff800705aa}, Tag=bd28fdbd64edb816

Причина

На сервере недостаточно невыгружаемой памяти. В x86-версиях Windows 2003 максимальный размер пула невыгружаемой памяти составляет 256 МБ (используется для критически важных операций ядра).

Из-за сложностей с управлением памятью в 32-разрядных операционных системах пул невыгружаемой памяти очень мал:

  • В 32-разрядных версиях Windows Server 2003 с двумя или более ГБ оперативной памяти максимальный размер пула невыгружаемой памяти равен 256 МБ
  • В 32-разрядных версиях Windows Server 2008 максимальный размер пула невыгружаемой памяти составляет 2 ГБ или чуть более 75% от физической памяти - в зависимости от того, что из них меньше

В 64-разрядных операционных системах, которые имеют намного большее адресное пространство, максимальный размер пула невыгружаемой памяти заметно больше:

  • В 64-разрядных версиях Windows Server 2003 максимальный размер пула невыгружаемой памяти составляет или 128 ГБ, или 40% от физической памяти - в зависимости от того, что из них меньше
  • В 32-разрядных версиях Windows Server 2008 (или 2008 R2) максимальный размер пула невыгружаемой памяти составляет или 128 ГБ, или чуть более 75% от физической памяти - в зависимости от того, что из них меньше

Когда пул невыгружаемой памяти перегружен, падает скорость системы и начинают неисправно работать некоторые компоненты (например, IIS перестает принимать соединения).

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

Анализ использования памяти ядра с помощью Pool Monitor

Прежде всего проверьте объем невыгружаемой памяти в Диспетчере задач Windows. Если он большой (> 200 МБ в 32-разрядной системе), имеет смысл проанализировать его использование и подкорректировать настройки сервера.

npp

Скачайте и установите соответствующий пакет инструментов, содержащий утилиту poolmon.exe:

  • Для Windows 2008 и выше: Windows Driver Kit (Набор драйверов Windows) (после установки доступен в папке ...\Windows Kits\8.1\Tools\)
  • В Windows 2003: Windows Support Tools (Средства поддержки Windows)

Запустите poolmon и проверьте использование выгружаемой/невыгружаемой памяти и определите, какие теги потребляют слишком много памяти. Примеры использования poolmon можно посмотреть здесь.

Ниже приведен пример того, как можно проанализировать использования памяти ядра. Вывод poolmon:

tags

Посмотрите на колонку Bytes. Это точный объем используемой памяти.

Обратите внимание на теги TPLA и NDpp - мы можем влиять на них напрямую. Их источниками являются стек TCPIP и драйвер ndis.sys. TPLA всегда занимает примерно 5 МБ x количество ЦП. NPpp - это планировщик пакетов.

Если загрузка ЦП на сервере не особо велика, количество ЦП может показаться слишком большим. Если вы уменьшите количество логических ЦП, то соответственно уменьшится и тег TPLA.

Долю NDpp можно уменьшить (или вообще свести к нулю), отключив ряд планировщиков пакетов, в том числе PVC traffic shaper и QoS-configured containers.

К PVC относится только один тег - Drre, и доля потребляемой им невыгружаемой памяти составляет всего 14 МБ (из максимум 40 допустимых). На этом этапе не наблюдается утечки невыгружаемой памяти по вине компонентов PVC.

Анализ использования памяти ядра отдельными процессами

Иногда отдельные процессы могут испытывать утечку памяти ядра - это можно выявить, изучив данные об использовании выгружаемой/невыгружаемой памяти на уровне каждого их процессов:

  1. Откройте Диспетчер задач Windows, перейдите на вкладку Процессы, в верхнем меню выберите Вид -> Выбрать столбцы и поставьте галочки ИД процесса (PID), Код сеанса, Дескрипторы, Память - выгружаемый пул и Память - невыгружаемый пул.

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

  3. Выясните, каким контейнерам и службам принадлежат эти процессы, и остановите/отключите их, перезапустив соответствующие контейнеры. Проверьте, стабилизировалось ли использование выгружаемой/невыгружаемой памяти.

Дополнительные ресурсы

Pushing the Limits of Windows: Paged and Nonpaged Pool
Использование монитора пула памяти (Poolmon.exe) для разрешения проблем с утечками памяти режима ядра
PoolMon Examples
Who's Using the Pool?
(Non)paged memory pool limit, it might be smaller then you expect
Troubleshooting Nonpaged and Paged Pool Errors in Windows How to find pool tags that are used by third-party drivers
Windows NT Kernel memory pool tags
Managing Container Memory Pools

d02f9caf3e11b191a38179103495106f 965b49118115a610e93635d21c5694a8 2897d76d56d2010f4e3a28f864d69223

Email subscription for changes to this article
Save as PDF