LINUX.ORG.RU

Нужно занять всё ОЗУ!

 , ,


2

1

Всем привет!

Нужно занять всю свободную память (на самом деле нет, всего лишь 90%), чтобы другие утилиты не могли аллоцировать ни чего. Нужно для проверки всяких там ватчдоков.

Но calloc\malloc я так понимаю аллоцируют только в куче? А как отжать физическую память?

Нужно занять всё ОЗУ!

си

Для этого есть более подходящие языки :D

Куча вообще-то тоже размещается в физической памяти. malloc вместе с memset - это собственно оно, но конечно система будет сопротивляться.

anonymous ()

Но calloc\malloc я так понимаю аллоцируют только в куче? А как отжать физическую память?

man 2 mlock

DESCRIPTION mlock(), mlock2(), and mlockall() lock part or all of the calling process's virtual address space into RAM, preventing that memory from being paged to the swap area.

anonymous ()

Вариант с tmpfs рабочий, мы так делали (swap был отключен). Только «чтобы другие утилиты не могли аллоцировать ни чего» - с нахрапа не получится. Независимо от количества свободной памяти, ядро с дефолтными настройками все равно даст аллоцировать новую память; а если ее не будет - будет прибивать другие процессы - см. OOM killer и overcommit_memory.

Kroz ★★★★★ ()
Последнее исправление: Kroz (всего исправлений: 3)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <string.h>

int main(int argc, char *argv[])
{
     
    void * mem = (void*)malloc(sizeof(size_t)*(atoi(argv[2])));
    assert(mem);
    memset(mem,0,(sizeof(size_t)* atoi(argv[2])));
    for (int i = atoi(argv[1]); i > 0; --i)
    {
        sleep(1);
    };
    free(mem);
    return 0;
}
gcc mem.c;./a.out 10 900000000 
# 10 - время в секундах сколько будет занята память
# 900000000 - число size_t блоков памяти, тут занимет 7,2 Гигабайта, подбери значение для своего размера памяти или допиши для вычисления процентного значения сам.
Deleted ()

Но calloc\malloc я так понимаю аллоцируют только в куче? А как отжать физическую память?

Запиши в то что вернул маллос мусора, выделятся физические страницы.

slovazap ★★★★★ ()
Ответ на: комментарий от Deleted

Ты ошибся, но вопреки стандарту я бы его вообще везде писал при завершении инструкции/конструкции.

func(){};

func()
{
   ...
   {
      ...
   };
};

if()
{
   if()
   {

   };
   swith(...)
   {
      ...
   };
   for(...;...;...)
   {

   };
   
};


Точка запятой явно указывает на завершение инструкции/конструкции. Является не обязательным в ряде случаев, но необязательность это не нарушение или ненужность,а возможность. Так то можно и структуры по сути писать без семиколона, но нельзя. Семиколон явность, ставить его или нет вопрос удобства/необходимости , а не чего либо ещё.

Deleted ()
Последнее исправление: Deleted (всего исправлений: 1)

Нужно занять всю свободную память (на самом деле нет, всего лишь 90%), чтобы другие утилиты не могли аллоцировать ни чего.

Зачем забивать всю память, просто установи лимиты памяти для нужны процессов например с помощью cgroups.

V1KT0P ()
Ответ на: комментарий от Deleted

Точка запятой явно указывает на завершение инструкции/конструкции

точка с запятой это лишний такт процессора который впустую потратиться(дада не надо тут про копиляторы оптимиирующие, и что Си уже по факту джаваскрипт обрезанный, без стандартов)

всеже это попрежнему актуально в 2018 если пишешь даже под 1ггц армы, или другие архитектуры где компилятор еще соблюдает стандарты

ощутимо будет наличие ; после блока {} и ее отсутствие

missxu ()

Но calloc\malloc я так понимаю аллоцируют только в куче? А как отжать физическую память?

Выделить и записать туда что-нибудь, например, нули. Только это плохой совет!

dave ★★★★★ ()
Ответ на: комментарий от Iron_Bug

для проверки «ватчдоков» проще сделать юзера, у которого лимит на память, и под ним запускать.

это не просто проще, это самое правильное..ограничения по ресурсам ставятся лимитами.

и это должно было быть предложено в первых двух постах (куда катиться этот сраный мир/лор..)

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

PS/ кстати про виртуалки :-) если нужны стресс-тесты - то можно (да пожалуй и нужно) обрезать на их уровне. Тут уж ядро ну никак не выкрутится из общих лимитов.

MKuznetsov ★★★★★ ()
Последнее исправление: MKuznetsov (всего исправлений: 3)
Ответ на: комментарий от MKuznetsov

просто сейчас мало кто тестирует приложения на лимиты. считается, что память бесконечна, как и карманы юзера, который может купить и проц помощнее :)

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

Iron_Bug ★★★★ ()

Нужно занять всю свободную память
Нужно для проверки всяррких там ватчдоков

не нужно, вачтдог (сторожевой таймер) нужен для аппаратного сброса, это средство защиты от совсем другого рода ошибок. Лечить утечки памяти в системе ватчдогом - полный идиотизм. Если у тебя аппаратный ватчдог - в системе дожен быть процесс в юзерспейс который сбрасывает таймер, чтобы проверить - прибей его kill -9.

anonymous ()
Ответ на: комментарий от anonymous

вачтдог

Ну это для понятности описал, а так да. Термин не тот. Что-то не хотелось расписывать. Кода много, что-то всегда течёт система не реального времени, от перезагрузки ничего плохого не будет. Как временное решение почему бы не запилить такой функционал?!

AntonyRF ★★ ()

Было много советов про tmpfs, требующих отключить swap. Могу посоветовать ramfs, который не свопится и для которого не придётся отключать swap. Более того, для ramfs не требуется указывать размер, и она будет занимать память по мере заполнения её файлами.

gentoo_root ★★★★★ ()