Я нашел очень хорошее решение названным xcape. От README:
xcape работает как демон и прерывает Клавишу CTRL. Если Клавиша CTRL будет нажата и выпущена самостоятельно, то она генерирует событие Клавиши выхода.
Это имеет больше смысла при переотображении клавиши Caps Lock для Управления. Будущие версии этой программы могли бы сделать то отображение для Вас, но на данный момент это - что-то, что необходимо сделать сами.
напряжение-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)
/ и т.д., если Вам нужен он портативный.
Можно записать программу C в malloc()
необходимая память и затем использует mlock()
препятствовать тому, чтобы память была выгружена.
Затем просто позвольте программе ожидать ввода с клавиатуры, и разблокировать память, освободить память и выход.
calloc
столкнется с той же проблемой IIRC. Вся память просто укажет на ту же обнуленную страницу только для чтения. Это не будет на самом деле выделено, пока Вы не попытаетесь записать в него (который не будет работать, так как это только для чтения). Единственный способ быть действительно уверенным, что я знаю, состоит в том, чтобы сделать a memset
из целого буфера. См. следующий ответ для большего количества информации stackoverflow.com/a/2688522/713554
– Leo
08.11.2013, 18:43
Я предложил бы работать, VM с ограниченной памятью и протестировать программное обеспечение в этом будет более эффективным тестом, чем попытка заполнить память на хост-машине.
Тот метод также имеет преимущество, что, если низкая ситуация с памятью вызывает ошибки OOM в другом месте и подвешивает целую ОС, Вы только подвешиваете VM, который Вы тестируете в не Ваша машина, что у Вас могла бы быть другая полезная работа процессов.
Также, если Вашим тестированием не является ЦП или IO интенсивный, Вы могли бы одновременно выполнить экземпляры тестов на семействе VMs со множеством низких емкостей памяти.
Из этого комментария 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
pv
установлен, это помогает видеть количество: dd if=/dev/zero bs=1024 |pv -b -B 1024 | dd of=/dev/shm/fill bs=1024
– Otheus
26.09.2017, 23:01
mem=nn[KMG]
параметр начальной загрузки ядра(посмотрите в linux/Documentation/kernel-parameters.txt для деталей).
Как 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)
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
}
Как насчет ramfs, если это существует? Смонтировать его и копия по большому файлу? Если существует нет /dev/shm
и никакой ramfs - я предполагаю крошечную программу C, которая делает большой malloc на основе некоторого входного значения? Возможно, придется выполнить его несколько раз сразу в системе на 32 бита с большой памятью.
Если Вы хотите протестировать конкретный процесс с ограниченной памятью, Вы могли бы быть более обеспеченным использованием ulimit
ограничить объем allocatable памяти.
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.
Я записал эту небольшую программу C++ для этого: https://github.com/rmetzger/dynamic-ballooner
Преимущество этой реализации, это периодически - проверки, если это должно освободить или перераспределить память.
Если у вас есть базовые инструменты 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 ++, которая вызывает ту же проблему, что и ответ, получивший наибольшее количество голосов.
Эта программа очень хорошо работает для выделения фиксированного объема памяти:
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
stress --vm-bytes $(awk '/MemAvailable/{printf "%d\n", $2 * 0.98;}' < /proc/meminfo)k --vm-keep -m 1
– kujiy 08.02.2018, 02:36