решено: bash скрипт (С-код) заполняющий память (user-level память)
Модераторы: SLEDopit, Модераторы разделов
-
McSim
- Сообщения: 419
- Статус: Экспериментатор
- ОС: заGNU/Linux Debian
решено: bash скрипт (С-код) заполняющий память
Камрады, приветствую.
Киньте, пожалуйста идею скрипта (желательно на bash), который будет наполнять оперативную память произвольными данными (может из /dev/zero, может из /dev/random - не принципиально).
Вот некоторые пожелания:
1. наполнять именно юзер-левел память (не ту, которую использует ядро - cashed, buffers...)
2. не использовать всякие tmpfs\ramfs, т.к. они используют именно cashed память.
3. желательно иметь возможность указывать размер отгрызаемой свободной памяти.
Спасибо большое.
Киньте, пожалуйста идею скрипта (желательно на bash), который будет наполнять оперативную память произвольными данными (может из /dev/zero, может из /dev/random - не принципиально).
Вот некоторые пожелания:
1. наполнять именно юзер-левел память (не ту, которую использует ядро - cashed, buffers...)
2. не использовать всякие tmpfs\ramfs, т.к. они используют именно cashed память.
3. желательно иметь возможность указывать размер отгрызаемой свободной памяти.
Спасибо большое.
-
Женя Подсыпальников
- Сообщения: 482
-
SLEDopit
- Модератор
- Сообщения: 4824
- Статус: фанат консоли (=
- ОС: GNU/Debian, RHEL
Re: решено: bash скрипт (С-код) заполняющий память
Как-то bash - не самый правильный инструмент для подобной задачи. Имхо, С куда больше подходит.
Вот тут есть готовый код.
И мне не совсем ясно что имеется в виду под "свободной юзер-левел памятью".
Согласно вышеприведённому описанию и выхлопу free, я понял, что вас интересует кусок памяти = total (3872) - used (3479) = free (392).
Верно?
Если так, то, по идее когда вы начнёте кушать память, первые 392 мб должны быть взяты из free, а потом уже начать освобождаться память, занятая кешем. Правильно я понимаю принцип работы ведра?
upd. А хотя, его немного придётся изменить под ваши требования. Примерно так:
Вот тут есть готовый код.
И мне не совсем ясно что имеется в виду под "свободной юзер-левел памятью".
Код: Выделить всё
$ free -m
total used free shared buffers cached
Mem: 3872 3479 392 0 229 1177
-/+ buffers/cache: 2072 1799
Swap: 3811 62 3749Верно?
Если так, то, по идее когда вы начнёте кушать память, первые 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.
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;
Ход ружьём, однако...

// return 0;
Ход ружьём, однако...
Пойдём на рыбалку !
-
McSim
- Сообщения: 419
- Статус: Экспериментатор
- ОС: заGNU/Linux Debian
Re: решено: bash скрипт (С-код) заполняющий память
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 вроде для этого нужен?
-
SLEDopit
- Модератор
- Сообщения: 4824
- Статус: фанат консоли (=
- ОС: GNU/Debian, RHEL
Re: решено: bash скрипт (С-код) заполняющий память
ага.
Ну есть такое. но оно же всё равно освобождается (:
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.
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
-
McSim
- Сообщения: 419
- Статус: Экспериментатор
- ОС: заGNU/Linux Debian
Re: решено: bash скрипт (С-код) заполняющий память
Спасибо, следопыт.
то что дохтор прописал.
-
eddy
- Сообщения: 3321
- Статус: Красный глаз тролля
- ОС: ArchLinux
Re: решено: bash скрипт (С-код) заполняющий память
Нормальный код. free все равно вызывается при выходе. Это же вам не ранняя куда (там была проблемка с free: если забудешь освободить память, приходилось перезагружаться).
McSim
тире забыл после "нас"
SLEDopit, можно вообще мегабайт за мегабайтом попытаться занять полностью всю оперативку.
А почему memset, а не calloc сразу?
RTFM
-------
KOI8-R - патриотичная кодировка
-------
KOI8-R - патриотичная кодировка
-
SLEDopit
- Модератор
- Сообщения: 4824
- Статус: фанат консоли (=
- ОС: GNU/Debian, RHEL
Re: решено: bash скрипт (С-код) заполняющий память
именно это и происходит по вышеприведённой ссылке.
да я просто ставил всякие эксперименты по постепенному захвату памяти, а потом просто стёр лишнее и получилось, что получилось.
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.
The more you believe you don't do mistakes, the more bugs are in your code.
-
McSim
- Сообщения: 419
- Статус: Экспериментатор
- ОС: заGNU/Linux Debian
-
eddy
- Сообщения: 3321
- Статус: Красный глаз тролля
- ОС: ArchLinux
Re: решено: bash скрипт (С-код) заполняющий память
Не совсем: там на 2ГБ остановка происходит.
Не, так: "нас - рать!" ☺ (а в "нас - тройка" надо еще двоеточие после тройки: "нас - тройка: самба, дхцп, днс")
RTFM
-------
KOI8-R - патриотичная кодировка
-------
KOI8-R - патриотичная кодировка
-
SLEDopit
- Модератор
- Сообщения: 4824
- Статус: фанат консоли (=
- ОС: GNU/Debian, RHEL
Re: решено: bash скрипт (С-код) заполняющий память
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.
The more you believe you don't do mistakes, the more bugs are in your code.
-
eddy
- Сообщения: 3321
- Статус: Красный глаз тролля
- ОС: ArchLinux
Re: решено: bash скрипт (С-код) заполняющий память
SLEDopit, а, понял.
по идее, должно работать и так:
SHIT!!!
НЕ ЗАПУСКАЙТЕ ЭТО! На ~90МБ моя клавиатура весело замигала светодиодами, когда ядро погрузилось в kernel panic!
А, между прочим, на компьютере 6ГБ оперативки!
по идее, должно работать и так:
Код: Выделить всё
#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 - патриотичная кодировка
-------
KOI8-R - патриотичная кодировка
-
deadhead
- Сообщения: 1913
- Статус: zzz..z
Re: решено: bash скрипт (С-код) заполняющий память
ну так это ж очевидно, что как только превышен MMAP_THRESHOLD вы получаете zero page, т.о. calloc может и не выполнять никаких действий по обнулению (читай записи в память, читай COW...)
P.S.
я обычно использую mmap с флагом MMAP_POPULATE ;)
[x] close
-
eddy
- Сообщения: 3321
- Статус: Красный глаз тролля
- ОС: ArchLinux
Re: решено: bash скрипт (С-код) заполняющий память
deadhead, а как мой пример выше с `calloc` мог привести к панике ядра?
RTFM
-------
KOI8-R - патриотичная кодировка
-------
KOI8-R - патриотичная кодировка
-
McSim
- Сообщения: 419
- Статус: Экспериментатор
- ОС: заGNU/Linux Debian
Re: решено: bash скрипт (С-код) заполняющий память
Тогда это будет чересчур очевидно.
P.S. да не забанят меня админы за оффтоп
-
deadhead
- Сообщения: 1913
- Статус: zzz..z