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

Я нашел очень хорошее решение названным xcape. От README:

xcape работает как демон и прерывает Клавишу CTRL. Если Клавиша CTRL будет нажата и выпущена самостоятельно, то она генерирует событие Клавиши выхода.

Это имеет больше смысла при переотображении клавиши Caps Lock для Управления. Будущие версии этой программы могли бы сделать то отображение для Вас, но на данный момент это - что-то, что необходимо сделать сами.

186
19.06.2019, 00:07
14 ответов

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

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

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

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

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

161
27.01.2020, 19:28

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

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

93
27.01.2020, 19:28
  • 1
    назад, я должен был протестировать подобный вариант использования. Я заметил что, пока Вы не пишете что-то в ту память, что она не будет на самом деле выделена (т.е. пока отсутствия страницы не происходит). Я не уверен, проявляют ли mlock () заботу об этом. –  Poorna 08.11.2013, 15:31
  • 2
    я соглашаюсь с @siri; однако, это зависит, на котором различный UNIX Вы используете. ре –  Anthony 08.11.2013, 15:34
  • 3
    Некоторое вдохновение для кода. Кроме того, я думаю, что Вы не должны разблокировать/освобождать память. ОС собирается сделать это для Вас, когда Ваш процесс закончился. –  Sebastian 08.11.2013, 15:44
  • 4
    Вероятно, необходимо на самом деле записать в память, ядро могло бы просто принять на себя непосильные обязательства если Вы только malloc она. Если настроено к, например, Linux позволит возврату malloc успешно, на самом деле не имея свободной памяти, и только на самом деле выделит память, когда это будет записано в. Посмотрите win.tue.nl/~aeb/linux/lk/lk-9.html –  Bjarke Freund-Hansen 08.11.2013, 16:32
  • 5
    @Sebastian: calloc столкнется с той же проблемой IIRC. Вся память просто укажет на ту же обнуленную страницу только для чтения. Это не будет на самом деле выделено, пока Вы не попытаетесь записать в него (который не будет работать, так как это только для чтения). Единственный способ быть действительно уверенным, что я знаю, состоит в том, чтобы сделать a memset из целого буфера. См. следующий ответ для большего количества информации stackoverflow.com/a/2688522/713554 –  Leo 08.11.2013, 18:43

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

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

Также, если Вашим тестированием не является ЦП или IO интенсивный, Вы могли бы одновременно выполнить экземпляры тестов на семействе VMs со множеством низких емкостей памяти.

47
27.01.2020, 19: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
34
27.01.2020, 19:28
  • 1
    Не все *отклоняют, имеют/dev/shm. Еще портативная идея? –  Tadeusz A. Kadłubowski 08.11.2013, 14:24
  • 2
    Если pv установлен, это помогает видеть количество: dd if=/dev/zero bs=1024 |pv -b -B 1024 | dd of=/dev/shm/fill bs=1024 –  Otheus 26.09.2017, 23:01
  • 3
    Если Вы хотите скорость, этот метод является правильным выбором! Поскольку это выделяет желаемую сумму RAM за несколько секунд. Не передавайте на/dev/urandom, он будет использовать 100% ЦП и занимать несколько минут, если Ваша RAM будет большой. ВСЕ ЖЕ/dev/shm имеет относительный размер в современных дистрибутивах Ubuntu/Debian, он имеет размер что значения по умолчанию к 50% физической RAM. Надо надеяться, можно повторно смонтировать/dev/shm или возможно создать новую точку монтирования. Просто удостоверьтесь, что это имеет фактический размер, который Вы хотите выделить. –  develCuy 08.12.2017, 21:25
  1. запустите Linux;
  2. начальная загрузка с mem=nn[KMG] параметр начальной загрузки ядра

(посмотрите в linux/Documentation/kernel-parameters.txt для деталей).

31
27.01.2020, 19:28

Как abount простое решение для 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)
17
27.01.2020, 19:28
  • 1
    Это будет, вероятно, быстро выгружено, оказывая очень мало фактического влияния на давление памяти (если Вы не заполните всю подкачку также, которая будет требовать времени, обычно), долгое время –  Joachim Sauer 08.11.2013, 15:22
  • 2
    Почему Unix подкачал бы, в то время как существует доступная RAM? Это - на самом деле вероятный способ выселить дисковый кэш когда потребность быть. –  Alexander Shcheblikin 09.11.2013, 01:04
  • 3
    @AlexanderShcheblikin, который Этот вопрос не о выселении дискового кэша (который полезен для тестирования производительности, но не для низкого тестирования ресурсов). –  Gilles 'SO- stop being evil' 09.11.2013, 16:40
  • 4
    Это решение работало к булыжнику Концерт или два в моих тестах, хотя я не пытался подчеркнуть свою память. Но, @JoachimSauer, можно было установить sysctl vm.swappiness=0 и кроме того набор vm.min_free_kbytes к небольшому числу, возможно, 1024. Я не попробовал его, но в документах говорится, что это - то, как Вы управляете быстротой выгрузки... необходимо смочь сделать это довольно медленным действительно, на грани порождения условия OOM на машине. См. kernel.org/doc/Documentation/sysctl/vm.txt и kernel.org/doc/gorman/html/understand/understand005.html –  Mike S 04.04.2017, 23:03

Я сохраняю функцию, чтобы сделать что-то подобное в моем 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
}
19
27.01.2020, 19:28

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

11
27.01.2020, 19:28

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

9
27.01.2020, 19:28
  • 1
    На самом деле это не работает над Linux (dunno о другом *, отклоняет). man setrlimit: RLIMIT_RSS Specifies the limit (in pages) of the process's resident set (the number of virtual pages resident in RAM). This limit only has effect in Linux 2.4.x, x < 30, and there only affects calls to madvise(2) specifying MADV_WILLNEED. –  Patrick 08.11.2013, 15:46

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

5
27.01.2020, 19:28

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

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

4
27.01.2020, 19:28

Если у вас есть базовые инструменты 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 загружает всю строку данных в ОЗУ (я узнал об этом довольно неудачным способом, когда собирал образ диска с помощью grep). Строка, сгенерированная командой yes , заменяющая символы новой строки, будет бесконечно длинной, но ограничена байтами от head до $ BYTES , поэтому grep загрузит $ BYTES в объем памяти. Сам Grep использует для меня примерно 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); пятый сочетает в себе многие из вышеперечисленных без примера кода; шестой - отличный ответ, но я не видел этого ответа до того, как придумал свой собственный подход, поэтому я подумал, что добавлю свой собственный, в том числе потому, что его короче запомнить или набрать, если вы не видите, что строка элемента на самом деле суть дела; седьмой снова не отвечает на вопрос (вместо этого использует ulimit для ограничения процесса); восьмой пытается заставить вас установить python; девятый думает, что мы все очень нетворческие, и, наконец, десятый написал свою собственную программу на C ++, которая вызывает ту же проблему, что и ответ, получивший наибольшее количество голосов.

28
27.01.2020, 19:28

Эта программа очень хорошо работает для выделения фиксированного объема памяти:

https://github.com/julman99/eatmemory

-1
22.05.2020, 06:50

I need to have 90% of the free memory full

На случай, если ответов уже недостаточно, один из них, который я не видел, делает виртуальный диск ,или технически tmpfs . Это сопоставит ОЗУ с папкой в ​​Linux, а затем вы просто создадите или выгрузите столько файлов любого размера, чтобы они занимали столько оперативной памяти, сколько хотите. Единственным недостатком является то, что вам нужно быть пользователем root, чтобы использовать команду mount

.
# first as root make the given folder, however you like where the tmpfs mount is going to be.

mkdir /ramdisk

chmod 777 /ramdisk

mount -t tmpfs -o size=500G tmpfs /ramdisk

# change 500G to whatever size makes sense; in my case my server has 512GB of RAM installed.

Получить, скопировать или создать файл разумного размера; например, создайте файл размером 1 ГБ, затем

cp my1gbfile /ramdisk/file001
cp my1gbfile /ramdisk/file002

# do 450 times; 450 GB of 512GB approx 90%

используйте free -g, чтобы посмотреть, сколько оперативной памяти выделено.

Обратите внимание, :например, если у вас 512 ГБ физической оперативной памяти, и если вы используете tmpfs более 512 ГБ, это будет работать и позволит вам зависнуть / аварийно завершить работу системы, выделив 100% оперативной памяти. По этой причине рекомендуется tmpfs использовать только столько оперативной памяти, чтобы оставить некоторое разумное количество свободной для системы.

Чтобы создать один файл заданного размера:

truncate -s 450G my450gbfile

# man truncate

# also dd works well

dd if=/dev/zero of=my456gbfile bs=1GB count=456
4
29.09.2020, 20:01

Теги

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