как ограничить выделение оперативной памяти приложению
Как ограничить выделение оперативной памяти приложению
Пользователь выполняет вычисления в Excel на очень больших листах (свыше 500 МБ) даже с 16 ГБ оперативной памяти, Excel (64-разрядная версия) сожирает всю существующую память, я видел, как она использует более 11 ГБ системной памяти.
Есть ли способ сказать, ограничить его где-то разумным, например, 8 ГБ, чтобы система не зависала и не переставляла файл подкачки, чтобы открыть новую вкладку в Chrome?
Здесь я понимаю, что вопрос заключается в том, чтобы найти способ ограничения памяти, используемой процессом, независимо от влияния на производительность.
На Windows Server это можно сделать с помощью инструмента, называемого диспетчером системных ресурсов Windows, который может ограничивать объем рабочего набора, который использует процесс. Этот инструмент можно установить (не устанавливается по умолчанию) через консоль добавления компонентов в Windows Server 2008 R2.
В Windows 7/8/10 не существует решения Microsoft, способного сделать это. Вы должны установить стороннее программное обеспечение, как показано ниже:
Управляющий процессом работал отлично для меня. Открытый исходный код, лицензия MIT, простой в использовании:
Если проблема заключается в том, что у вас возникают проблемы при одновременном выполнении других действий на компьютере, вы можете попытаться уменьшить приоритет процессора Excel. Поэтому, если вы запустите что-то еще, Excel будет вынужден остановиться и ждать, так как ваша программа имеет более высокий приоритет. Это займет больше времени, чтобы закончить, но вы должны быть в состоянии сделать другие вещи в то же время.
Инструкция для Windows 7:
Это временно, поэтому вам придется делать это снова, если вы выйдете из Excel.
Ограничение памяти, доступной программе
Решил я как-то заняться задачкой сортировки миллиона целых чисел при имеющейся памяти в 1 Мб. Но перед этим мне пришлось подумать над тем, как можно ограничить объём доступной памяти для программы. И вот, что я придумал.
Виртуальная память процесса
Перед тем, как окунуться в разные методы ограничения памяти, необходимо знать, как устроена виртуальная память процесса. Лучшая статья на эту тему — «Анатомия программы в памяти».
Прочитав статью, я могу предложить две возможности для ограничения памяти: уменьшить виртуальное адресное пространство или объём кучи.
Первое: уменьшение объёма адресного пространства. Это довольно просто, но не совсем корректно. Мы не можем уменьшить всё пространство до 1 Мб — не хватит места для ядра и библиотек.
Второе: уменьшение объёма кучи. Это не так-то просто сделать, и обычно так никто не делает, поскольку это доступно только через возню с компоновщиком. Но для нашей задачи это был бы более корректный вариант.
Также я рассмотрю другие методы, такие, как отслеживание использования памяти через перехват вызовов библиотек и системы, и изменение окружения программы через эмуляцию и введение «песочницы».
Для тестирования будем использовать небольшую программу по имени big_alloc, размещающую, и затем освобождающую 100 MiB.
Все исходники есть на github.
ulimit
То, о чём сразу вспоминает старый unix-хакер, когда ему нужно ограничить память. Это утилита из bash, которая позволяет ограничивать ресурсы программы. На деле это интерфейс к setrlimit.
Мы можем установить ограничение на объём памяти для программы.
Мы задали ограничение в 1024 кб — 1 MiB. Но если мы попытаемся запустить программу, она отработает без ошибок. Несмотря на лимит в 1024 кб, в top видно, что программа занимает аж 4872 кб.
Причина в том, что Linux не устанавливает жёстких ограничений, и в man об этом написано:
Для манипуляции программным окружением QEMU прекрасно подходит. У неё есть опция –R для ограничения виртуального адресного пространства. Но до слишком малых значений его ограничивать нельзя – не поместятся libc и kernel.
Для этого надо отвести что-то порядка 20 MB. Вот:
Останавливается после 100 итераций (10 MB).
В общем, QEMU пока лидирует среди методов для ограничения, надо только поиграться с величиной –R.
Контейнер
Но ресурсы будут ограничены при помощи подсистемы Linux под названием cgroups. Можно играться с ними напрямую, но я рекомендую через lxc. Я бы хотел использовать docker, но он работает только на 64-битных машинах.
LXC — это LinuX Containers. Это набор инструментов и библиотек из userspace для управления функциями ядра и создания контейнеров – изолированных безопасных окружений для приложений, или для всей системы.
Документацию можно найти на офсайте или в блоге автора.
Для запуска приложения в контейнере необходимо предоставить lxc-execute конфиг, где указать все настройки контейнера. Начать можно с примеров в /usr/share/doc/lxc/examples. Man рекомендует начать с lxc-macvlan.conf. Начнём:
Теперь давайте ограничим память при помощи cgroup. LXC позволяет настроить подсистему памяти для cgroup контейнера, задавая ограничения памяти. Параметры можно найти в документации по RedHat. Я нашёл 2:
Тишина — видимо, памяти слишком мало. Попробуем запустить из шелла
bash не запустился. Попробуем /bin/sh:
Хотя мы не получили сообщение об ошибке от big_alloc насчёт malloc failure и количества доступной памяти, мне кажется, мы удачно ограничили память при помощи контейнеров. Пока остановимся на этом
Компоновщик
Попробуем изменить бинарный образ, ограничив доступное куче место. Компоновка – последний этап построения программы. Для этого используется компоновщик и его скрипт. Скрипт – описание разделов программы в памяти вместе со всякими атрибутами и прочим.
Пример компоновочного скрипта:
Всё круто, но в реальных программах работать не будет. Функция main, которую вы пишете в программах на С, реально не является первой вызываемой. Сперва совершается очень много инициализаций и подчисток. Этот код содержится в библиотеке времени исполнения С (crt) и распределено по библиотекам crt#.o в /usr/lib.
Подробности можно увидеть, запустив gcc –v. Сначала она вызывает ccl, создаёт ассемблерный код, транслирует в объектный файл через as и в конце собирает всё вместе с ELF при помощи collect2. collect2 — обёртка ld. Она принимает объектный файл и 5 дополнительных библиотек, чтобы создать конечный бинарный образ:
Посмотрим, где стек, при помощи gdb:
esp указывает на 0xbffff0a0, что около 3 GiB. Значит, у нас есть куча в
В реальном мире верхний адрес стека случайный, его можно увидеть, например, в выдаче:
Давайте разместим сегмент данных в 2 MiB перед стеком. Берём верх стека, вычитаем 2 MiB:
0xbffff0a0 — 0x200000 = 0xbfdff0a0
Посмотрим на заголовок:
И всё равно данные размещаются в памяти. Как? Когда я попытался посмотреть значения указателей, возвращаемых malloc, я увидел, что размещение начинается где-то после окончания раздела.data по адресам вроде 0xbf8b7000, постепенно продолжается с увеличением указателей, а затем опять возвращается к нижним адресам вроде 0xb5e76000. Выглядит так, будто куча растёт вниз.
Если подумать, ничего странного в этом нет. Я проверил исходники glibc и выяснил, что когда brk не справляется, то используется mmap. Значит, glibc просит ядро разместить страницы, ядро видит, что у процесса куча дыр в виртуальной памяти, и размещает в одном из пустых мест страницу, после чего glibc возвращает указатель с неё.
Запуск big_alloc под strace подтвердил теорию. Посмотрите на нормальный бинарник:
А теперь на модифицированный:
Песочница
Ещё один способ ограничения памяти программы — sandboxing. Отличие от эмуляции в том, что мы ничего не эмулируем, а просто отслеживаем и контролируем некоторые вещи в поведении программы. Обычно используется в исследованиях в области безопасности, когда вы изолируете зловреда и анализируете его так, чтобы он не нанёс вреда вашей системе.
Трюк с LD_PRELOAD
LD_PRELOAD — специальная переменная окружения, заставляющая динамический компоновщик использовать в приоритете предзагруженные библиотеки, в т.ч. libc. Этот трюк, кстати, также используют и некоторые зловреды.
Я написал простую песочницу, перехватывающую вызовы malloc/free, работающую с памятью и возвращающую ENOMEM по исчерпанию лимита.
Для этого я сделал библиотеку общего пользования (shared library) c моими реализациями вокруг malloc/free, увеличивающими счётчик на объём malloc, и уменьшающими, когда вызывается free. Она предзагружается через LD_PRELOAD.
Моя реализация malloc:
libc_malloc — указатель на оригинальный malloc из libc. no_hook локальный флаг в потоке. Используется для того, чтобы можно было использовать malloc в хуках и избежать рекурсивных вызовов.
malloc используется неявно в функции account библиотекой uthash. Зачем использовать таблицу хешей? Потому, что при вызове free вы передаёте в неё только указатель, а внутри free неизвестно, сколько памяти было выделено. Поэтому у вас есть таблица с указателями-ключами и объёмом размещённой памяти в виде значений. Вот что я делаю в malloc:
mem_allocated это та статическая переменная, которую сравнивают с ограничением в malloc.
Теперь при вызове free происходит следующее:
Да, просто уменьшаем mem_allocated.
И что самое крутое — это работает.
Полный код библиотеки на github
Получается, что LD_PRELOAD – отличный способ ограничить память
ptrace
ptrace — ещё одна возможность для построения песочницы. Это системный вызов, позволяющий управлять выполнением другого процесса. Встроен в различные POSIX ОС.
Это основа таких трассировщиков, как strace, ltrace, и почти всех программ для создания песочниц — systrace, sydbox, mbox и дебаггеров, включая gdb.
Я сделал свой инструмент при помощи ptrace. Он отслеживает вызовы brk и меряет расстояние между изначальным значением break и новым, которое задаётся следующим вызовом brk.
Программа форкается и запускает 2 процесса. Родительский – трассировщик, а дочерний – трассируемый. В дочернем процессе я вызываю ptrace(PTRACE_TRACEME) и затем execv. В родительском использую ptrace(PTRACE_SYSCALL) чтобы остановиться на syscall и отфильтровать вызовы brk из дочернего, а затем ещё один ptrace(PTRACE_SYSCALL) для получения значения, возвращаемого brk.
Также я перехватываю вызовы mmap/mmap2, так как у libc хватает мозгов вызывать их при проблемах с brk. Так что когда заданное значение превышено и я вижу вызов mmap, я обламываю его с ENOMEM.
Иные способы
Что ещё можно попробовать (эти варианты были отвергнуты по разным причинам):
Как ограничить доступные ресурсы для приложения?
Средний 1 комментарий
Комплексного готового решения не нашёл. Есть несколько утилит, которые могут ограничивать ЦПУ (приоритет, привязка к ядру) и память.
Process Lasso is NOT yet another task manager. It is a process priority optimization and system automation utility. Priority optimization, affinity optimization, core optimization, automated rules, automated power profiles; you name it, and Process Lasso does it!
Process Tamer is a tiny (140k) and super efficient utility for Microsoft Windows XP/2K/NT/Vista/Win7 that runs in your system tray and constantly monitors the cpu usage of other processes. When it sees a process that is overloading your cpu, it reduces the priority of that process temporarily, until its cpu usage returns to a reasonable level.
Minimem now can reduce the memory footprint of any application. It runs in the background and can be set up to optimize as many proceses as you’d like, using a very intuitive graphical interface. Unlike other memory optimization products, it gives you full control over what applications you want to optimize, when and how often, as well as the possibility to only optimize memory when required and relevant.
Как ограничить использование оперативной памяти на вашем ПК
Приветствую вас, дорогие друзья!
Настоящие геймеры используют лучший игровой браузер: Opera GX.
Opera GX — это специальная версия знаменитого браузера Opera, созданная специально для удовлетворения потребностей геймеров.
Opera GX, обладающая уникальными функциями, поможет вам получить максимум удовольствия от игр и просмотра веб-страниц каждый день:
ОЗУ, сокращение от оперативно-запоминающее устройство (RAM — оперативная память), является одним из самых фундаментальных аппаратных компонентов компьютера, который определяет производительность вашей системы.
Объем оперативной памяти, которая у вас есть, контролирует производительность вашего компьютера, независимо от того, работает ли он с 20 вкладками и 5 открытыми приложениями, или компьютер, который дает сбой, когда вы пытаетесь смотреть YouTube, поэтому чем больше у вас оперативной памяти, тем лучше.
Поскольку оперативная память используется для любой задачи, требующей быстрого доступа к вычислительным ресурсам, ограничитель для вашего ПК звучит как хорошая идея для примерки.
Продолжайте читать и узнайте о лучших доступных решениях для уменьшения потребления оперативной памяти и получения быстрого и надежного ПК, которого вы заслуживаете.
Как уменьшить избыточное потребление оперативной памяти в Windows 10?
1. Отключите автозагрузку программ
Нажмите сочетание клавиш «Windows Key + R».
Введите в поле «msconfig» и нажмите Enter.
Перейдите на вкладку «Автозагрузка» и нажмите «Открыть диспетчер задач».
Щелкните правой кнопкой мыши приложения, которые вы не хотите запускать при запуске, и выберите «Отключить».
2. Настройте Windows 10 на максимальную производительность
Щелкните правой кнопкой мыши значок «Компьютер» и выберите «Свойства».
На правой панели выберите «Дополнительные параметры системы».
В разделе «Дополнительно» нажмите «Параметры».
Выберите «Обеспечить наилучшее быстродействие».
Нажмите «Применить», затем «ОК» для выхода.
3. Установите максимальное использование ОЗУ в Windows 10
Нажмите «Windows Key + R».
Введите в поле «msconfig» и нажмите Enter.
Перейдите на вкладку «Загрузка».
Щелкните «Дополнительные параметры».
Отметьте «Максимальный объем памяти».
Нажмите «ОК», чтобы сохранить изменения и перезагрузить компьютер.
4. Дефрагментируйте жесткие диски
Нажмите «Windows Key + R».
Введите в поле «dfrgui» и нажмите Enter.
В новом окне щелкните жесткие диски, которые нужно дефрагментировать, предпочтительно диск, на котором установлена Windows.
Нажмите «Оптимизировать» и следуйте инструкциям на экране, чтобы завершить процесс дефрагментации.
После завершения процесса перезагрузите компьютер.
5. Измените управление памятью
Нажмите сочетание «Windows Key + R».
Введите в поле «regedit» и нажмите Enter.
Перейдите по следующему пути:
Найдите «ClearPageFileAtShutDown», щелкните его правой кнопкой мыши и выберите «Изменить».
Измените значение на «1».
Нажмите «ОК» и перезагрузите компьютер.
6. Дополнительные решения
7. Используйте отличный браузер в качестве альтернативы
Использование ОЗУ находится под контролем ОС, и нет никакого способа принудительно очистить содержимое.
Так почему бы не обратиться к лучшему браузеру?
Мы говорим о специальной версии браузера Opera, рекламируемой как первый в мире игровой браузер, поскольку его основная цель — гарантировать, что браузер никогда не будет мешать вашему игровому процессу.
Обратите внимание, что он включает в себя уникальные функции, которые помогут вам получить максимальную отдачу как от игр, так и от просмотра веб-страниц, но лучшей функцией является «GX Control».
Это сделало Opera GX известной и высоко ценимой, поскольку она позволяет вам устанавливать собственные ограничения на объем оперативной памяти, процессора и использования сети, которые использует ваш браузер.
Браузер предлагает интеграцию с различными службами, что позволяет легко получить к ним доступ с боковой панели.
От Twitch, Discord, YouTube и Spotify до Facebook Messenger, WhatsApp, Telegram, Instagram и Twitter.
Просто помните, что если регулярно отключать ненужные фоновые службы и процессы из вашей оперативной памяти, скорость и производительность улучшаются.
Если вам действительно не нужно открывать эти 20 вкладок, закройте их и оставьте только те, на которых вы действительно находитесь, например этот веб-сайт.
Вы беспокоитесь о том, что ваш компьютер не использует всю оперативную память?
Узнайте, как увеличить полезную оперативную память прямо сейчас, и вы увидите разницу.
Не стесняйтесь использовать раздел комментариев ниже, чтобы сообщить нам, что сработало для вас.
Как уменьшить использование оперативной памяти в Windows 10
На самом деле вы хотите 8 ГБ. Причина в том, что для систем с графическим интерфейсом требуется около 4 ГБ для бесперебойной работы, когда включены все функции. Если вы начнёте обрезать их обратно, то необходимый минимум снизится.
Всё это предполагает, что у вас есть достаточное количество свободного дискового пространства, доступного и на системном томе. Это необходимо из-за того, как Windows обрабатывает виртуальную память. Проблемный порог составляет около 12% от общего. Но, на самом деле это где-то около 8%, но «реальное» число варьируется в зависимости от того, что вы в данный момент делаете, и того, что дополнительно требуют фоновые системы. Итак, если вы используете 4 ГБ ОЗУ и система вместе с программами занимает 10% или менее 10% от оставшегося места на диске Windows (обычно это диск C:), вы должны ожидать медлительности в работе ПК (или это скоро произойдёт). Попробуйте переместить как можно больше ненужных или редко используемых данных с диска Windows на другой или внешний диск или в облачное хранилище.
Наконец, об оптимизации оперативной памяти. В дни Windows 7 имеет преимущества ручной оптимизации ОЗУ, но с Windows 10 это в значительной степени не нужно и непродуктивно. ОС теперь делает НЕВЕРОЯТНУЮ работу по использованию всей доступной физической памяти и как она должна правильно работать. Физическое ОЗУ, которое просто сидит «свободно», ничего не делает, а тратит время и деньги. Microsoft изменила свой подход к использованию оперативной памяти в Windows 10. Системы, разработанные и построенные для использования преимуществ многопоточности и истинной параллельной обработки. Если это не так, то эта возможность вам вообще не поможет и может создать некоторые узкие места, с которыми вы обычно не сталкивались в более ранних версиях ОС.