https://dvdhrm.wordpress.com/2014/06/10/memfd_create2/
Теоретически, вы можете достичь
memfd_create()
поведения [ ], не вводя новые системные вызовы, например:
int fd = open("/tmp", O_RDWR | O_TMPFILE | O_EXCL, S_IRWXU);
(Обратите внимание, что для более переносимой гарантии tmpfs мы можем использовать " /dev/shm
" вместо " /tmp
").
Поэтому самый важный вопрос - какого черта нам нужен третий путь?
[...]
- Резервная память учитывается процессом, которому принадлежит файл, и не подлежит квотам монтирования.
^ Прав ли я, полагая, что на первую часть этого предложения нельзя положиться?
Код memfd_create () буквально реализован как « несвязанный файл, находящийся в [a] tmpfs, который должен быть внутренним ядром ». Отслеживая код, я понимаю, что он отличается отсутствием реализации проверок LSM, также создаются memfds для поддержки «печатей», как поясняется в сообщении в блоге. Однако я крайне скептически отношусь к тому, что memfds в принципе учитываются иначе, чем в tmpfile.
В частности, когда OOM-киллер приходит в стук, я не думаю, что он будет учитывать память, хранящуюся в memfds. Это может составить до 50% оперативной памяти - значение параметра size = для tmpfs . Ядро не устанавливает другое значение для внутренних tmpfs, поэтому оно будет использовать размер по умолчанию 50%.
Поэтому я думаю, что в целом мы можем ожидать, что процессы, которые содержат большой memfd, но никакие другие значительные выделения памяти, не будут уничтожены OOM. Это верно?
источник
Ответы:
Опираясь на ответ @ danblack:
Решение основано на
oom_kill_process()
(немного подчищенном):( https://github.com/torvalds/linux/blob/master/mm/oom_kill.c#L974 )
Что зависит от того,
oom_badness()
чтобы найти лучшего кандидата:oom_badness()
делает:( https://github.com/torvalds/linux/blob/master/mm/oom_kill.c#L233 )
Где:
( https://github.com/torvalds/linux/blob/master/mm/oom_kill.c#L966 )
Похоже, что он считает анонимные страницы, что и
memfd_create()
используется.источник