mapped_ratio
можно рассчитать следующим образом:
mapped ratio = (nr mapped * 100) / total memory;
Источник: https://www.cs.columbia.edu/~smb/classes/s06-4118/l19.pdf
Значение nr_mapped
можно прочитать из / proc / vmstat
:
$ grep nr_mapped /proc/vmstat
nr_mapped 47640
Согласно этой статье, озаглавленной: Память Linux - Замечания по реализации
«Это измерение того, насколько трудно виртуальной машине восстановить страницы. Каждый раз, когда виртуальная машина пытается освободить память, она сканирует 1 / n-ю неактивных списков в каждой зоне, пытаясь освободить страницы. Каждый раз, когда выполняется переход по списку, если количество неактивных чистых + свободных страниц в этой зоне не превышает нижнюю отметку, n уменьшается на единицу. Бедствие измеряется как 100 >> n » 5
При изучении большей части документации звучит так, будто" бедствие "- это счетчик ядра, но это не так. Скорее, это значение, которое используется при сканировании каждой зоны памяти, которое постепенно увеличивается по мере того, как страничные кадры памяти сканируются ядром в попытке восстановить их. Обсуждение этого выходит за рамки этого Q&A, но если вам интересно, раздел книги «Понимание ядра Linux», Глава 17: Восстановление фрейма страницы . Значение «бедствие» происходит от значения «prev_priority» при сканировании зон.
Я решил эту проблему с помощью небольшого приложения на Rust под названием escalator . Он использует исполняемый бит suid
для выполнения от имени пользователя root, затем setuid
и setgid
, чтобы действительно стать пользователем root перед выполнением того, что ему передается, заменяя себя дочерним процессом.
Если у вас есть контроль над командной строкой docker run
, вы можете передать ей параметр --user
(, например --user=0:0
), вместо использования sudo
в команде ENTRYPOINT.
В этом случае вы можете использовать ENTRYPOINT, установленный на /usr/lib/systemd/systemd --system --unit=multi-user.target
, который будет запускать systemd как PID 1, сохраняя при этом настройку USER, которая будет действовать в ваших командах docker exec
.
См. вместо USER в справочном руководстве docker run
.
И наоборот, если у вас нет контроля над командной строкой docker run
, вы можете попытаться передать --user
командам docker exec
, оставив пользователя root в определении контейнера. Это имеет некоторые недостатки, такие как тот факт, что вы должны передавать эту опцию всем вызовам, и вам нужно выяснить, какой пользователь :группа (или uid :gid )для передачи (root легко, всегда 0 :0.)