Параметр overcommit_memory
учитывается в трех местах подсистемы управления памятью -.
Основной из них является__vm_enough_memory
в mm/util.c
, который определяет, достаточно ли памяти для продолжения выделения памяти (обратите внимание, что это вспомогательная функция, которая не обязательно вызывается ). Если overcommit_memory
равно 1, эта функция всегда завершается успешно. Если это 2, он проверяет фактическую доступную память. Если он равен 0, он использует знаменитую эвристику, о которой вы упоминаете; это происходит следующим образом:
cap_sys_admin
)Полученная сумма используется в качестве порога для выделения памяти.
mmap
также проверяет, что параметр:MAP_NORESERVE
соблюдается, если разрешена избыточная фиксация (режимы 0 и 1 ), и приводит к выделению памяти без резервного свопа(VM_NORESERVE
). В данном конкретном случае режим 0 фактически эквивалентен режиму 1; это то, что «вызовы mmap(2)
с MAP_NORESERVE
не проверяются» относится к :это означает, что вызовыMAP_NORESERVE
mmap
всегда будут успешными, а выделение более -приведет к OOM -убийственному степпингу постфактум или нарушение сегмента при попытке записи.
shmem
ведет себя аналогично mmap
.
Исчерпание адресного пространства должно приводить к сбоям выделения, а не к уничтожению OOM -, поскольку выделение фактически не может продолжаться.
В этом вопросе на AskUbuntu.SE были похожие ошибки AMD IOMMU, и они были исправлены путем добавления параметра загрузки ядра iommu=soft
.
Однако это может быть просто обходной путь :для реального исправления могут потребоваться исправления для драйверов AMD IOMMU и/или ath10k_pcie
WiFi.