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

463
Matthieu M.

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

  • он выделяет сегмент памяти 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
Коллега заметил, что это может повлиять на то, поддерживается ли сегмент `mmap` файлом или нет; хотя не мог объяснить, почему он иногда поддерживается файлом на заданной машине. Matthieu M. 5 лет назад 0

0 ответов на вопрос