Как ограничить память для программы

Заметил такую вещь:
при заполнении памяти более чем на 2Гбайта, у пользователей удаленного рабочего стола наблюдаются сбои в работе программ (при попытке скопировать что-то объемное в буфер обмена).
Еще бывают проблемы со входом (как правило у того кто входит утром последним) —
не удалось загрузить ваш профиль — подробно: не достаточно памяти для завершения операции.

Цитата:

levkadub
Система часом не 32-битная?
А вообще глянь тут.

Цитата:

Может, из-за ограничение на объем памяти для процесса 2 гб? Что с /PAE? Версия Win2k3?

Цитата:

Что с /PAE?

Ковырять boot.ini.

Проверь, твоя Windows использует всю память? Если нет, исправляй!

Источник: forum.ru-board.com

Можно ли ограничить память для приложения на Go

Можно ли ограничить память потребляемой Golang допустим до 256мб? Моя программа на Golang потребляет более 500 мб памяти , на некоторых компьютерах может просто не быть столько памяти (520мб) Читал документацию и другие зарубежные stackoverflow вопросы , говорили что поможет в этом MemStats — https://golang.org/src/runtime/mstats.go?s=6236:15651#L149 я почитал документацию, примеры. И нечего не понял. Кто-то может подробней обьяснить методы для лимитирования памяти?

Отслеживать
задан 30 сен 2017 в 12:17
Jack Smith Jack Smith
73 8 8 бронзовых знаков

А что именно вы хотите чтобы произошло, когда программа дойдёт до этого предела? В большинстве случаев, если у ОС нет достаточно ОП, а SWAP’а нету или недостаточно, она просто прибьёт процесс.

30 сен 2017 в 16:21
30 сен 2017 в 20:02

У вас какие-то странные представления о работе программ. Если процесс заснёт, память кто освобождать будет? Я вам рекомендую почитать про параметр GOGC, а также в целом о виртуальной памяти и работе ОС.

30 сен 2017 в 20:46

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Читайте также:
Программа чтобы по микрофону передавать на компьютер

MemStats — позволяет получить статистику использованой памяти, можно запустить проверку в отдельной горутине (по таймеру), и предпринимать нужные действия

package main import ( «runtime» «fmt» ) func main() < memStats := >_ = make([]string, 1000000) runtime.ReadMemStats(memStats) fmt.Printf(«nAlloc = %vnTotalAlloc = %vnSys = %vnNumGC = %vnn», memStats.Alloc / 1024, memStats.TotalAlloc / 1024, memStats.Sys / 1024, memStats.NumGC) >

Но также, если Вам нужно контролировать другой процес на использование памяти, советую посмотреть тут: https://stackoverflow.com/questions/24522692/how-to-set-memory-limit-to-a-process-in-golang

Как Освободить и Ускорить оперативную память (ОЗУ) на Windows 10 | ИГРЫ БУДУТ ЛЕТАТЬ

UPD

Также можно воспользоваться ограничением памяти с помощью ОС:

# Install cgroup-bin apt-get install cgroup-bin # Create a cgroup for memory and cpu called «mygroup» cgcreate -g memory,cpu:mygroup # Add 128 CPU shares (about 12% CPU). echo 128 > /sys/fs/cgroup/cpu/mygroup/cpu.shares # Add 32MB of memory to the limit. echo 32000000 > /sys/fs/cgroup/memory/mygroup/memory.limit_in_bytes # Do not allow the process to use swap (if the limit is reached the # process will be killed instead). echo 0 > /sys/fs/cgroup/memory/build/memory.swappiness # Run the command in the specified group. cgexec -g cpu,memory:mygroup ./compute

Или запускать программу в docker (с ограничением по памяти), этот способ намного лучше тем, что он платформо независимый.

Отслеживать
ответ дан 16 окт 2017 в 21:25
Maxim Tkach Maxim Tkach
175 1 1 серебряный знак 7 7 бронзовых знаков
а можно просто ограничить текущее взаимодействия приложения с памятью до 200 мб ?
10 ноя 2017 в 12:24
Такой возможности нет, разве кто-то оформил такое решение в отдельный package.
10 ноя 2017 в 13:22
Есть альтернатива, использовать ограничение на основе ОС (или использовать Докер)

10 ноя 2017 в 13:22
докер тут вообще не лезет, а ограничение на основе ОС как сделать?
11 ноя 2017 в 9:58

На данный момент это невозможно, если речь идёт об ограничении потребляемой памяти именно в программе (а не системой для программы: это-то возможно, как показал Максим, но приведёт к банальному прибитию программы SIGKILL -ом при превышении лимита по памяти).

Более подробно о проблеме можно почитать тут.

Читайте также:
Увеличение децибел микрофона программа

Из того, что можно сделать в самой программе, это «тюнинг» параметра GOGC , который приделали в 1.5.

Грубо говоря, значение GOGC это кол-во процентов, на которое сборщик мусора позволит вырасти текущему объёму хипа до того, как начать следующую сборку.

Значение по умолчанию 100 означает, что когда сборщик мусора собрал мусор, и обнаружил, что занято 256 метров, след. сборка будет только по достижении 256 + (100% от 256) = 512 метров.

След-но, уменьшая это значение, можно увеличивать «pacing» сборщика и надеяться на лучшее.

Вообще же пока (вкл. текущую версию 1.9) единственный способ реально ограничивать потребление памяти в нагруженной программе это ограничивать нагрузку на неё.

Кроме того, тут следует понимать, что рантайм Go не отдаёт сразу всю освобождённую память системе; он помечает свободные страницы спец. хинтом (через madvise(2) ) — так что система может их забрать, если сильно нужно. Проще говоря, нет особого смысла зарубать приложение лимитами: они не знают про то, как работает сборка мусора в Go.

Источник: ru.stackoverflow.com

Как ограничить время и использование памяти процессами в Linux

Мануал

Автор cryptoparty На чтение 3 мин Опубликовано 17.06.2019

Скрипт тайм-аута – это полезная программа для мониторинга ресурсов, предназначенная для ограничения потребления времени и памяти процессами в Linux.

Он позволяет вам запускать программы под контролем и применять ограничения по времени и памяти, прерывая работу программы при нарушении этих параметров.

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

Для запуска этого скрипта у вас должен быть установлен Perl 5 в вашей системе Linux и смонтирована файловая система /proc.

Чтобы проверить установленную версию Perl в вашей системе Linux, выполните следующую команду.

Затем клонируйте репозиторий timeout в вашу систему с помощью команды git, затем перейдите в локальный репозиторий с помощью команды cd и вызовите его как обычную команду Linux.

Читайте также:
Какие программы установить на iPhone

$ cd ~/bin $ git clone https://github.com/pshved/timeout.git $ cd timeout

Давайте теперь посмотрим, как работает скрипт timeout.

Основное ограничение памяти (100 МБ виртуальной памяти):

В этом первом примере показано, как ограничить использование памяти процессом до 100 МБ виртуальной памяти, используя флаг -m.

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

Здесь команда stress-ng запускает 4 стрессора виртуальной памяти (VMS), которые в совокупности используют 40% доступной памяти в течение 10 минут.

Таким образом, каждый стрессор использует 10% доступной памяти.

$ ./timeout -m 100000 stress-ng —vm 4 —vm-bytes 40% -t 10m

Учитывая вывод команды timeout, описанной выше, рабочие процессы stress-ng были прерваны всего через 1,16 секунды.

Это связано с тем, что совокупное потребление памяти VMS (438660 килобайт) превышает допустимое использование виртуальной памяти для stress-ng и его дочерних процессов.

Основное ограничение времени процесса:

Чтобы включить ограничение времени процесса, используйте флаг -t, как показано далее.

$ ./timeout -t 4 stress-ng —vm 4 —vm-bytes 40% -t 10m

В приведенном выше примере, когда время CPU + SYS при нагрузке превышает заданное значение 4, рабочие процессы уничтожаются.

Ограничение времени и памяти процесса

Вы также можете одновременно ограничить память и время следующим образом.

$ ./timeout -t 4 -m 100000 stress-ng —vm 4 —vm-bytes 40% -t 10m

Timeout также поддерживает некоторые дополнительные параметры, такие как –detect-hangups, который позволяет обнаружение зависания.

$ ./timeout —detect-hangups -m 100000 stress-ng —vm 4 —vm-bytes 40% -t 10m

Вы можете контролировать лимит памяти RSS (resident set size), используя ключ –memlimit-rss или -s.

$ ./timeout -m 100000 -s stress-ng —vm 4 —vm-bytes 40% -t 10m

Кроме того, чтобы вернуть код завершения или сигнал + 128 процесса, используйте параметр –confess или -c, как показано далее.

$ ./timeout -m 100000 -c stress-ng —vm 4 —vm-bytes 40% -t 10m

Пожалуйста, не спамьте и никого не оскорбляйте. Это поле для комментариев, а не спамбокс. Рекламные ссылки не индексируются!

Источник: itsecforu.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru