Почему происходит «ошибка выделения страницы», хотя памяти еще достаточно (например, «58*4096 КБ (C)»), которую можно было бы использовать?

Псевдонимы намеренно очищаются перед запуском скрипта, так как псевдонимы могут привести к некорректной работе скриптов.

Теоретически вы можете определить псевдонимы внутри скрипта, но если такой скрипт запускается через

. scriptname

не разрешено использование этих новых псевдонимов внутри скрипта,поскольку точечные сценарии полностью анализируются перед запуском, и чтобы сделать псевдоним эффективным, синтаксический анализатор должен знать его, а для того, чтобы позволить синтаксическому анализатору узнать псевдоним, вам сначала нужно запустить встроенную команду оболочки alias.

Так что просто не используйте псевдонимы в скриптах. Они предназначены для облегчения набора текста, и это не относится к сценариям, которые пишутся один раз, но запускаются много раз.

4
19.06.2020, 18:17
1 ответ

Вы не предоставили много информации, например, при каких условиях (s )это происходит, какую систему (linux, Android,... )вы используете и т. д.

В любом случае вы можете начать -тонкую настройку ядра. Вы можете поэкспериментировать с vm.min_free_kbytes, который говорит ядру оставлять такую ​​память свободной (единицей измерения кБ)при любых обстоятельствах.

Документы:

min_free_kbytes:

This is used to force the Linux VM to keep a minimum number of kilobytes free. The VM uses this number to compute a watermark[WMARK_MIN] value for each lowmem zone in the system. Each lowmem zone gets a number of reserved free pages based proportionally on its size.

Some minimal amount of memory is needed to satisfy PF_MEMALLOC allocations; if you set this to lower than 1024KB, your system will become subtly broken, and prone to deadlock under high loads.

Setting this too high will OOM your machine instantly.

Чтобы изменить этот параметр навсегда, вы можете (уменьшить его до 16 МБ):

echo "vm.min_free_kbytes=16384" >> /etc/sysctl.conf

Чтобы поиграться и проверить, все ли работает, вы можете изменить его только для текущего сеанса:

sysctl -w vm.min_free_kbytes=16384

Источником информации была документация kernel.org .

Редактировать -в связи с комментарием

Ваш вопрос: почему возникает ошибка страницы, когда у вас есть свободная память -, даже если у вас больше свободной памяти, чем указано выше?

Если у вас есть свободная память выше предела, указанного vm.min_free_kbytes, то ответ, скорее всего, фрагментация памяти(у вас могут быть другие, такие как неисправные модули памяти ).

Вот подробности:

Бит order:10косвенно сообщает вам, сколько страниц было запрошено. Такой порядок считается высшим -порядком, так как фактически запрашивает 2^10 , что составляет 1024 страницы или 4096 КБ непрерывной памяти!

Флаги modeпередаются распределителю памяти ядра. У вас естьmode:0x2084020(GFP_ATOMIC|__GFP_COMP)-флаги распределителя режима ядра ().Для этого вам нужно иметь некоторые знания исходного кода ядра. Чтобы подробно объяснить ваши флаги.

Флаг GFP_ATOMIC:

The GFP_ATOMIC flag instructs the memory allocator never to block. Use this flag in situations where it cannot sleep—where it must remain atomic—such as interrupt handlers, bottom halves and process context code that is holding a lock. Because the kernel cannot block the allocation and try to free up sufficient memory to satisfy the request, an allocation specifying GFP_ATOMIC has a lesser chance of succeeding than one that does not. Nonetheless, if your current context is incapable of sleeping, it is your only choice.

Флаг __GFP_COMP:

The page frame belongs to extended page

Что касается размера требуемой памяти. Расширенная страница позволяет вам иметь кадры страницы размером 4 МБ вместо 4 КБ. Рекомендуем прочитать книгу:Linux Kernelи прочитать отличную статью:Kernel Korner -Выделение памяти в ядре для получения дополнительной информации.

Как видите, вы запрашиваете 4096 КБ неблокирующего распределения -, выделение должно оставаться атомарным; вы не можете заблокировать выделение и попытаться освободить память (Continuous ). Таким образом, выделение не удается.

Флаги Edit2 -можно найти вinclude/linux/gfp.h

Edit3 -Версия ядра 4.9

Это важная информация о версии ядра 4.9. В этой точной версии ядра произошла регрессия (4.9), из-за которой SWAP вообще не использовался-OOM, но не использовался обмен (kernel.org).

Рекомендуемый способ исправить это — обновить ядро ​​как минимум до 4.10.8. В этой и более поздних версиях эта ошибка должна быть исправлена ​​-подробнее в OOM, но без использования свопа (RedHat)

4
18.03.2021, 23:26

Теги

Похожие вопросы