Я разрабатываю ПО для встроенной Linux, и я страдаю от зависания системы, потому что время от времени появляется OOM Killer. Прежде чем выйти за рамки, я хотел бы решить некоторые запутанные проблемы, связанные с тем, как ядро Linux выделяет динамическую память, предполагая, что/proc/sys/vm/overcommit_memory имеет 0 и/proc/sys/vm/min_free_kbytes имеет 712 и не имеет подкачки.Сведения о переполнении памяти Linux
Предположив встроенный Linux в настоящее время доступной физическая памяти 5 МБ (5 МБ свободной памяти и там не может использоваться в кэше или буферная память), если я пишу этот кусок кода:
.....
#define MEGABYTE 1024*1024
.....
.....
void *ptr = NULL;
ptr = (void *) malloc(6*MEGABYTE); //Preserving 6MB
if (!prt)
exit(1);
memset(ptr, 1, MEGABYTE);
.....
Я хотел бы знать, если когда memset-вызов выполняется, ядро попытается выделить в поле физической памяти ~ 6 МБ или ~ 1 МБ (или min_free_kbytes multiple).
В настоящее время на моем встроенном устройстве имеется около 9 МБ, в котором содержится 32 МБ ОЗУ. Я проверить это делает
# echo 3 > /proc/sys/vm/drop_caches
# free
total used free shared buffers
Mem: 23732 14184 9548 0 220
Swap: 0 0 0
Total: 23732 14184 9548
Забыв последний кусок кода C, я хотел бы знать, если его возможно, что ОАЯ убийца появляется, когда, например, свободная память о> 6MB. Я хочу знать, если система из памяти, когда оот появляется, так что я думаю, что у меня есть два варианта:
См VmRSS записи в/Proc/PID/статус подозрительного процесса.
Set/proc/sys/vm/overcommit_memory = 2 и/proc/sys/vm/overcommit_memory = 75 и посмотреть, есть ли какой-либо процесс, требующий больше физической памяти.
Ваш вопрос неоднозначен, потому что непонятно, что вы подразумеваете под «распределением». Ядро будет * резервировать * 6 МБ, но он еще ничего не выделяет, потому что процесс может никогда не получить доступ к памяти. –
Но когда выполняется memset (ptr, 1, MEGABYTE), процесс записывает память, не так ли? – MABC
Да, и тогда ОС должна фактически выделить некоторые. –