Как заполнить 90% свободной памяти?

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

Как это сделать в системе *nix?

158 голосов | спросил Eduard Florinescu 8 52013vEurope/Moscow11bEurope/MoscowFri, 08 Nov 2013 14:13:11 +0400 2013, 14:13:11

12 ответов


128

стресс - это генератор рабочей нагрузки, который имитирует cpu /mem /io /hdd подчеркивают системы POSIX. Этот вызов должен сделать трюк в Linux <3,14:

stress --vm-bytes $(awk '/MemFree/{printf "%d\n", $2 * 0.9;}' < /proc/meminfo)k --vm-keep -m 1

Для Linux> = 3.14 вместо этого можно использовать MemAvailable, чтобы оценить доступную память для новых процессов без обмена:

stress --vm-bytes $(awk '/MemAvailable/{printf "%d\n", $2 * 0.9;}' < /proc/meminfo)k --vm-keep -m 1

Адаптируйте вызов /proc/meminfo с помощью free(1) /vm_stat(1) /etc. если вам это нужно переносить.

ответил tkrennwa 8 52013vEurope/Moscow11bEurope/MoscowFri, 08 Nov 2013 21:40:15 +0400 2013, 21:40:15
91

Вы можете написать программу на malloc() требуемую память, а затем использовать mlock(), чтобы предотвратить обмен памяти.

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

ответил Chris 8 52013vEurope/Moscow11bEurope/MoscowFri, 08 Nov 2013 16:36:18 +0400 2013, 16:36:18
44

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

Этот метод также имеет то преимущество, что если ситуация с низкой памятью вызывает ошибки OOM в другом месте и зависает всей ОС, вы вешаете только виртуальную машину, которую вы тестируете, а не ваш компьютер, на котором могут работать другие полезные процессы.

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

ответил David Spillett 8 52013vEurope/Moscow11bEurope/MoscowFri, 08 Nov 2013 19:25:49 +0400 2013, 19:25:49
29
  1. запустить linux;
  2. загрузиться с mem=nn[KMG] параметр загрузки ядра

(подробнее см. в linux /Documentation /kernel-parameters.txt).

ответил Anon 8 52013vEurope/Moscow11bEurope/MoscowFri, 08 Nov 2013 16:40:26 +0400 2013, 16:40:26
28

Из этого комментария HN: https://news.ycombinator.com/item?id=6695581

  

Просто заполните /dev /shm через dd или аналогичный.

swapoff -a
dd if=/dev/zero of=/dev/shm/fill bs=1k count=1024k
ответил damio 8 52013vEurope/Moscow11bEurope/MoscowFri, 08 Nov 2013 16:00:28 +0400 2013, 16:00:28
17

Если у вас есть базовые инструменты 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 $NumberOfSeconds) | grep n

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

Затем для использования cat: cat будет ждать ввода данных до выхода, и, оставив одну из открытых труб, она сохранит grep вживую.

Если у вас есть pv и вы хотите медленно увеличить использование ОЗУ:

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 | покажет вам текущий статус (пропускная способность и сумма, по умолчанию, я думаю - в противном случае см. страницу man (ual)).


Почему еще один ответ? В принятом ответе рекомендуется установить пакет (я уверен, что для каждого набора микросхем есть релиз без необходимости менеджера пакетов); верхний проголосовавший ответ рекомендует компилировать C-программу (у меня не было компилятора или инструментальной привязки, установленной для компиляции для вашей целевой платформы); второй ответ проголосовали за рекомендацию запуска приложения в виртуальной машине (да, дайте мне только внутреннюю SD-карту этого телефона через USB-накопитель или что-то подобное и создайте образ виртуальной камеры); третий предлагает изменить что-то в последовательности загрузки, которая не заполняет ОЗУ по желанию; четвертый работает только в том случае, если точка монтирования /dev /shm (1) существует и (2) велика (восстановление требует root); пятый объединяет многие из вышеперечисленных без примера кода; шестой - отличный ответ, но я не видел этого ответа, прежде чем приступать к моему собственному подходу, поэтому я подумал, что добавлю свое собственное, также потому, что его запоминают или печатают короче, если вы не видите, что линия memblob на самом деле суть дела; седьмой снова не отвечает на вопрос (использует ulimit для ограничения процесса); восьмой пытается заставить вас установить python; девятый думает, что мы все очень не творческие, и, наконец, десятый написал свою собственную программу на C ++, которая вызывает ту же проблему, что и главный голосовой ответ.

ответил Luc 13 Jam1000000amWed, 13 Jan 2016 02:43:35 +030016 2016, 02:43:35
13

Как преодолеть простое решение python?

#!/usr/bin/env python

import sys
import time

if len(sys.argv) != 2:
    print "usage: fillmem <number-of-megabytes>"
    sys.exit()

count = int(sys.argv[1])

megabyte = (0,) * (1024 * 1024 / 8)

data = megabyte * count

while True:
    time.sleep(1)
ответил swiftcoder 8 52013vEurope/Moscow11bEurope/MoscowFri, 08 Nov 2013 16:33:50 +0400 2013, 16:33:50
13

Я сохраняю функцию, чтобы сделать что-то подобное в моих dotfiles. https://github.com/sagotsky/.dotfiles/blob/master/.functions#L248

function malloc() {
  if [[ $# -eq 0 || $1 -eq '-h' || $1 -lt 0 ]] ; then
    echo -e "usage: malloc N\n\nAllocate N mb, wait, then release it."
  else 
    N=$(free -m | grep Mem: | awk '{print int($2/10)}')
    if [[ $N -gt $1 ]] ;then 
      N=$1
    fi
    sh -c "MEMBLOB=\$(dd if=/dev/urandom bs=1MB count=$N) ; sleep 1"
  fi
}
ответил valadil 8 52013vEurope/Moscow11bEurope/MoscowFri, 08 Nov 2013 18:06:10 +0400 2013, 18:06:10
10

Как насчет ramfs, если он существует? Смонтируйте и скопируйте большой файл? Если нет /dev/shm и нет ramfs - я думаю, крошечная программа на C, которая делает большой malloc на основе некоторого входного значения? Может потребоваться запустить его несколько раз сразу в 32-битной системе с большим объемом памяти.

ответил nemo 8 52013vEurope/Moscow11bEurope/MoscowFri, 08 Nov 2013 16:30:18 +0400 2013, 16:30:18
7

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

ответил sj26 8 52013vEurope/Moscow11bEurope/MoscowFri, 08 Nov 2013 17:19:41 +0400 2013, 17:19:41
4

Я думаю, что это случай, когда неправильный вопрос и здравомыслие заглушаются людьми, конкурирующими за самый творческий ответ. Если вам нужно только имитировать условия OOM, вам не нужно заполнять память. Просто используйте пользовательский распределитель и не сработайте после определенного количества распределений. Этот подход работает достаточно хорошо для SQLite .

ответил Craig Barnes 9 62013vEurope/Moscow11bEurope/MoscowSat, 09 Nov 2013 02:01:29 +0400 2013, 02:01:29
2

Я написал эту небольшую программу на C ++ для этого: https://github.com/rmetzger/dynamic-ballooner

Преимущество этой реализации заключается в том, что периодически проверяется, требуется ли ее освобождать или перераспределять память.

ответил Robert Metzger 8 52013vEurope/Moscow11bEurope/MoscowFri, 08 Nov 2013 17:27:33 +0400 2013, 17:27:33

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132