Одно приложение, которое у нас есть, объединяет два элемента:
- он выделяет сегмент памяти объемом 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 демонстрируют то же поведение.