Одно приложение, которое у нас есть, объединяет два элемента:

  • он выделяет сегмент памяти объемом 707 МБ, используя mmap(0, sizeof(T), PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB, -1, 0) .
  • он сообщает об использовании собственной памяти, анализируя /proc/self/status и извлекая значение поля VmRSS .

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

  • первые сообщенные 971956224 байта, или 927 МБ, поддерживаются в течение 8 минут,
  • второй сообщил о 230174720 байтах, или 220 МБ, поддерживаемых в течение 8 минут.

Разница: 741527552 байта, или ~ 707 МБ, о размере нашего сегмента mmap .

Сегмент mmap распределяется систематически , а за выделением сразу следует memset 0xfe чтобы заставить ОС фиксировать память и избежать последующих сбоев страниц.

Непоследовательность:

  • RSS сообщает о 220 МБ, когда процессу всегда выделяется 707 МБ.
  • RSS сообщил о мерцании между 220 МБ и 927 МБ между последовательными запусками.

Последовательная:

  • Сообщаемая RSS является относительно постоянной в течение всего жизненного цикла процесса, варьируется только на пару МБ и включает либо 707 МБ, либо нет.

Почему VmRSS сообщается о несовместимости при использовании mmap?


На конкретной машине, когда этот пробег был сделан:

$ rpm -q centos-release
centos-release-7-2.1511.el7.centos.2.10.x86_64

Тем не менее, другие машины с немного другими версиями Centos демонстрируют то же поведение.

0