решено: bash скрипт (С-код) заполняющий память (user-level память)

Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС.

Модераторы: SLEDopit, Модераторы разделов

Аватара пользователя
McSim
Сообщения: 419
Статус: Экспериментатор
ОС: заGNU/Linux Debian

решено: bash скрипт (С-код) заполняющий память

Сообщение McSim »

Камрады, приветствую.
Киньте, пожалуйста идею скрипта (желательно на bash), который будет наполнять оперативную память произвольными данными (может из /dev/zero, может из /dev/random - не принципиально).
Вот некоторые пожелания:
1. наполнять именно юзер-левел память (не ту, которую использует ядро - cashed, buffers...)
2. не использовать всякие tmpfs\ramfs, т.к. они используют именно cashed память.
3. желательно иметь возможность указывать размер отгрызаемой свободной памяти.

Спасибо большое.
Спасибо сказали:
Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Re: решено: bash скрипт (С-код) заполняющий память

Сообщение Женя Подсыпальников »

Такое - не потянет ? :)
Пойдём на рыбалку !
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: решено: bash скрипт (С-код) заполняющий память

Сообщение SLEDopit »

Как-то bash - не самый правильный инструмент для подобной задачи. Имхо, С куда больше подходит.
Вот тут есть готовый код.

И мне не совсем ясно что имеется в виду под "свободной юзер-левел памятью".

Код: Выделить всё

 $ free -m
             total       used       free     shared    buffers     cached
Mem:          3872       3479        392          0        229       1177
-/+ buffers/cache:       2072       1799
Swap:         3811         62       3749
Согласно вышеприведённому описанию и выхлопу free, я понял, что вас интересует кусок памяти = total (3872) - used (3479) = free (392).
Верно?

Если так, то, по идее когда вы начнёте кушать память, первые 392 мб должны быть взяты из free, а потом уже начать освобождаться память, занятая кешем. Правильно я понимаю принцип работы ведра?

upd. А хотя, его немного придётся изменить под ваши требования. Примерно так:

Код: Выделить всё

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

int main(int argc, char** argv) {
    int max = 2048; // сколько МБ занимать
    int wait = 60 ; // сколько времени ждать
    int mb = 0 ;
    char* buffer;

    while((buffer=malloc(1024*1024)) != NULL && mb != max) {
        memset(buffer, 0, 1024*1024);
        mb++;
    }
    printf("Allocated %d MB\n", mb);

    while ( wait > 0 ) {
        printf("\rHold memory for %d seconds", wait);
        fflush( stdout );
        sleep(1);
        wait-- ;
    }
    printf("\nMemory is freed\n");
    return 0;
}
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Re: решено: bash скрипт (С-код) заполняющий память

Сообщение Женя Подсыпальников »

// printf("\nMemory is freed\n");
// return 0;

Ход ружьём, однако... :pooh_on_ball: :)
Пойдём на рыбалку !
Спасибо сказали:
Аватара пользователя
McSim
Сообщения: 419
Статус: Экспериментатор
ОС: заGNU/Linux Debian

Re: решено: bash скрипт (С-код) заполняющий память

Сообщение McSim »

SLEDopit писал(а):
26.03.2013 17:39
Как-то bash - не самый правильный инструмент для подобной задачи. Имхо, С куда больше подходит.
Вот тут есть готовый код.

И мне не совсем ясно что имеется в виду под "свободной юзер-левел памятью".
Согласно вышеприведённому описанию и выхлопу free, я понял, что вас интересует кусок памяти = total (3872) - used (3479) = free (392).
Верно?

Если так, то, по идее когда вы начнёте кушать память, первые 392 мб должны быть взяты из free, а потом уже начать освобождаться память, занятая кешем. Правильно я понимаю принцип работы ведра?

upd. А хотя, его немного придётся изменить под ваши требования. Примерно так:

Код: Выделить всё

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

int main(int argc, char** argv) {
    int max = 2048; // сколько МБ занимать
    int wait = 60 ; // сколько времени ждать
    int mb = 0 ;
    char* buffer;

    while((buffer=malloc(1024*1024)) != NULL && mb != max) {
        memset(buffer, 0, 1024*1024);
        mb++;
    }
    printf("Allocated %d MB\n", mb);

    while ( wait > 0 ) {
        printf("\rHold memory for %d seconds", wait);
        fflush( stdout );
        sleep(1);
        wait-- ;
    }
    printf("\nMemory is freed\n");
    return 0;
}

Спасибо всем за ответы.
Согласен, ся тут более к месту, но я в ней нуб.
Все верно, нужна именно free память. Не знал, как сакцентировать внимание на памяти именно той, которую используют приложения (не ядро), поэтому и изродил такой термин как "юзер-левел", как-то так...
Пошел пробовать запускать данный код )))
Чего там, gcc вроде для этого нужен? :blush:
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: решено: bash скрипт (С-код) заполняющий память

Сообщение SLEDopit »

McSim писал(а):
26.03.2013 21:50
Чего там, gcc вроде для этого нужен?
ага.
Женя Подсыпальников писал(а):
26.03.2013 18:02
Ход ружьём, однако...
Ну есть такое. но оно же всё равно освобождается (:
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
McSim
Сообщения: 419
Статус: Экспериментатор
ОС: заGNU/Linux Debian

Re: решено: bash скрипт (С-код) заполняющий память

Сообщение McSim »

SLEDopit писал(а):
26.03.2013 22:11
McSim писал(а):
26.03.2013 21:50
Чего там, gcc вроде для этого нужен?
ага.
Женя Подсыпальников писал(а):
26.03.2013 18:02
Ход ружьём, однако...
Ну есть такое. но оно же всё равно освобождается (:

Спасибо, следопыт.
то что дохтор прописал.
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: решено: bash скрипт (С-код) заполняющий память

Сообщение eddy »

Женя Подсыпальни... писал(а):
26.03.2013 18:02
Ход ружьём, однако...

Нормальный код. free все равно вызывается при выходе. Это же вам не ранняя куда (там была проблемка с free: если забудешь освободить память, приходилось перезагружаться).

McSim
тире забыл после "нас"

SLEDopit, можно вообще мегабайт за мегабайтом попытаться занять полностью всю оперативку.
А почему memset, а не calloc сразу?
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: решено: bash скрипт (С-код) заполняющий память

Сообщение SLEDopit »

eddy писал(а):
26.03.2013 23:17
можно вообще мегабайт за мегабайтом попытаться занять полностью всю оперативку.
именно это и происходит по вышеприведённой ссылке.
eddy писал(а):
26.03.2013 23:17
А почему memset, а не calloc сразу?
да я просто ставил всякие эксперименты по постепенному захвату памяти, а потом просто стёр лишнее и получилось, что получилось.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
McSim
Сообщения: 419
Статус: Экспериментатор
ОС: заGNU/Linux Debian

Re: решено: bash скрипт (С-код) заполняющий память

Сообщение McSim »

eddy
так? :
<...>нас-тройка Samba, dhcp, dns<...> :ph34r:
хех :laugh:
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: решено: bash скрипт (С-код) заполняющий память

Сообщение eddy »

SLEDopit писал(а):
27.03.2013 00:08
именно это и происходит по вышеприведённой ссылке.

Не совсем: там на 2ГБ остановка происходит.
McSim писал(а):
27.03.2013 00:18
так? :

Не, так: "нас - рать!" ☺ (а в "нас - тройка" надо еще двоеточие после тройки: "нас - тройка: самба, дхцп, днс")
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: решено: bash скрипт (С-код) заполняющий память

Сообщение SLEDopit »

eddy писал(а):
27.03.2013 08:55
Не совсем: там на 2ГБ остановка происходит.
SLEDopit писал(а):
26.03.2013 17:39
Вот тут есть готовый код.

UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: решено: bash скрипт (С-код) заполняющий память

Сообщение eddy »

SLEDopit, а, понял.

по идее, должно работать и так:

Код: Выделить всё

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char** argv) {
    int max = -1;
    int mb = 0;
    char* buffer;

    if(argc > 1)
        max = atoi(argv[1]);
    size_t bufsz = 1024*1024;
    while((buffer=calloc(bufsz, 1)) && mb != max) {
        mb++;
        printf("Allocated %d MB\n", mb);
    }

    return 0;
}


SHIT!!!

НЕ ЗАПУСКАЙТЕ ЭТО! На ~90МБ моя клавиатура весело замигала светодиодами, когда ядро погрузилось в kernel panic!
А, между прочим, на компьютере 6ГБ оперативки!
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Аватара пользователя
deadhead
Сообщения: 1913
Статус: zzz..z

Re: решено: bash скрипт (С-код) заполняющий память

Сообщение deadhead »

eddy писал(а):
26.03.2013 23:17
А почему memset, а не calloc сразу?
ну так это ж очевидно, что как только превышен MMAP_THRESHOLD вы получаете zero page, т.о. calloc может и не выполнять никаких действий по обнулению (читай записи в память, читай COW...)

P.S.
я обычно использую mmap с флагом MMAP_POPULATE ;)
[x] close
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: решено: bash скрипт (С-код) заполняющий память

Сообщение eddy »

deadhead, а как мой пример выше с `calloc` мог привести к панике ядра?
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Аватара пользователя
McSim
Сообщения: 419
Статус: Экспериментатор
ОС: заGNU/Linux Debian

Re: решено: bash скрипт (С-код) заполняющий память

Сообщение McSim »

eddy писал(а):
27.03.2013 08:55
Не, так: "нас - рать!" ☺

Тогда это будет чересчур очевидно. :laugh:

P.S. да не забанят меня админы за оффтоп :blush:
Спасибо сказали:
Аватара пользователя
deadhead
Сообщения: 1913
Статус: zzz..z

Re: решено: bash скрипт (С-код) заполняющий память

Сообщение deadhead »

eddy писал(а):
27.03.2013 12:06
deadhead, а как мой пример выше с `calloc` мог привести к панике ядра?

как-то так ;)
[x] close
Спасибо сказали: