cgroups Memory Limite - Schreiffehler: Apparat oder Ressource beschäftegt

Один из возможных вариантов:

 find . -maxdepth 1 -mindepth 1 -name \*.log -a -not -name backup.log

т.е. найти все файлы в текущем каталоге или ниже с точной глубиной 1 (так что на самом деле только в текущем каталоге, а не в имени самого текущего каталога) с именем, совпадающим с шаблоном *. log , а не backup.log

5
20.12.2017, 15:38
1 ответ

Что говорит cat memory.memsw.usage_in_bytes? Вы не можете установить максимальное значение ниже текущего предела.

Глядя на исходники 3.10 Linux, изменение memsw.limit_in_bytesприводит к вызовуmem_cgroup_write():

{
   .name = "memsw.limit_in_bytes",
   .private = MEMFILE_PRIVATE(_MEMSWAP, RES_LIMIT),
   .write_string = mem_cgroup_write,
   .read = mem_cgroup_read,
},

mem_cgroup_write()определяется в:
https://elixir.bootlin.com/linux/v3.10/source/mm/memcontrol.c#L5199

mem_cgroup_write()в свою очередь вызывает mem_cgroup_resize_memsw_limit(), если тип_MEMSWAP:

else if (type == _MEMSWAP)
    ret = mem_cgroup_resize_memsw_limit(memcg, val);

mem_cgroup_resize_memsw_limit()определяется в:
https://elixir.bootlin.com/linux/v3.10/source/mm/memcontrol.c#L4647

Эта функция вызываетres_counter_set_limit():
https://elixir.bootlin.com/linux/v3.10/source/include/linux/res_counter.h#L200

Реализация этой функции:

unsigned long flags;
int ret = -EBUSY;

spin_lock_irqsave(&cnt->lock, flags);
if (cnt->usage <= limit) {
    cnt->limit = limit;
    ret = 0;
}
spin_unlock_irqrestore(&cnt->lock, flags);
return ret;

Обратите внимание, что retинициализируется значением -EBUSY(, которое соответствует сообщению Device or resource busy, которое вы видите ), и изменяется на ноль, только если текущее использование меньше или равно запрошенному пределу.. Я предполагаю, что в вашем случае это не так, поэтому функция возвращает -EBUSY.

Если res_counter_set_limit()возвращает не -нулевое значение для mem_cgroup_resize_memsw_limit(), то mem_cgroup_resize_limit(), в свою очередь, возвращает то же самое значение. mem_cgroup_resize_limit()возвращает значение в mem_cgroup_write(). Это возвращаемое значение распространяется в пользовательское пространство, и поэтому вы видите ошибку, которую вы видите из echo.

Реализация текущих исходных кодов ядра немного отличается, но поведение такое же. Вы не можете настроить минимальное значение на значение, меньшее, чем в -значение использования.

9
27.01.2020, 20:39

Теги

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