Заметил такую вещь:
при заполнении памяти более чем на 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.
$ 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