2013-11-25 4 views
2

Мне нужно написать сценарий bash, который будет потреблять максимум ОЗУ моего ESXi и потенциально генерировать нехватку памяти.Как сгенерировать нехватку памяти с помощью сценария bash

Я уже проверил here и попытался запустить данный скрипт несколько раз, чтобы я мог потреблять больше 500 МБ ОЗУ.

Однако я получаю ошибку «sh: out of memory» (конечно), и я хотел бы узнать, есть ли возможность настроить объем памяти, выделенный моей оболочке?

  • Note1: Еще одно требование состоит в том, что я не могу войти в виртуальную машину и запустить жадную задачу.
  • Note2: Я попытался создать сценарий создания жадных новых виртуальных машин с огромной оперативной памятью, однако я не могу добраться до состояния ESXi, где есть нехватка памяти.
  • Note3: Я не могу использовать компилятор C, и у меня только очень ограниченная библиотека python.

Заранее спасибо за помощь :)

+0

сделать ramdisk (https://wiki.debian.org/ramfs) и заполнить его большим файлом. – thom

+0

К сожалению, у меня нет команды «mount» на моем ESXi-сервере. –

+0

ESXi не основан на ядре, которое я могу изменить ... –

ответ

1

Bash имеет ulimit команду, которая может быть использована, чтобы установить размер виртуальной памяти, которая может быть использована в процессе Баша и процессы, созданные Это.

Существует два предела, жесткий предел и мягкий предел. Вы можете снизить оба предела, но только поднимите мягкий лимит до жесткого предела. ulimit -S -v unlimited устанавливает размер виртуальной памяти неограниченно (если это позволяет жесткий предел). Если установлен жесткий предел (см. ulimit -H -v), проверьте все сценарии инициализации для строковых установок.

4

С раннего ответа шахты: https://unix.stackexchange.com/a/254976/30731

Если у вас есть основные инструменты GNU (sh, grep, yes и head), вы можете сделать это:

yes | tr \\n x | head -c $BYTES | grep n 
# Protip: use `head -c $((1024*1024*2))` to calculate 2MB easily 

Это работает, потому что Grep нагрузок всю строку данных в ОЗУ (я узнал это довольно неудачно, когда grepping образ диска). Строка, созданная yes, заменяющая новые строки, будет бесконечно длинной, но ограничена head до $BYTES байтов, поэтому grep будет загружать $ BYTES в память. Сам Греп использует для меня как 100-200 КБ, вам может потребоваться вычесть это для более точной суммы.

Если вы хотите добавить ограничение времени, это может быть сделано достаточно легко в bash (не будет работать в sh):

cat <(yes | tr \\n x | head -c $BYTES) <(sleep $SECONDS) | grep n 

<(command) вещь, кажется, мало известных, но часто очень полезно , подробнее об этом здесь: http://tldp.org/LDP/abs/html/process-sub.html

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

Если у вас есть pv и хотите, чтобы постепенно увеличивать использование RAM:

yes | tr \\n x | head -c $BYTES | pv -L $BYTESPERSEC | grep n 

Например:

yes | tr \\n x | head -c $((1024*1024*1024)) | pv -L $((1024*1024)) | grep n 

будет использовать до гигабайта со скоростью 1 Мб в секунду. В качестве дополнительного бонуса pv покажет вам текущую скорость использования и общее использование. Конечно, это также может быть сделано с предыдущими вариантами:

yes | tr \\n x | head -c $BYTES | pv | grep n 

Просто вставляя | pv | часть покажет вам текущее состояние (пропускная способность и всего, по умолчанию, я думаю, - иначе видеть человека (UAL) страницы).

+1

Это, похоже, не работает с grebox grep. Я нашел это решение, но он просто расходует память unbound (что было то, что я искал) 'tail/dev/zero' – falstaff

+0

@falstaff Работает для меня тоже на Debian с инструментами GNU. Кажется, ваше решение более универсально, приятно найти! Не возражаете, если я включу ваше решение в свой ответ? – Luc