Mount невозможно выделить память
В любом языке программирования начинаются проблемы, когда программа запрашивает ресурсы у операционной системы. И чем ближе язык «к истокам» тем неочевидней и опасней эти проблемы. В этой статье мы рассмотрим нюансы использования malloc() и разберёмся как им пользоваться надёжно и безопасно.
Успешный вызов malloc() возвращает блок неинициализированной памяти. Данные внутри блока остаются в том виде, в котором их оставляет система. А современные распространённые ОС никаких действий с памятью перед отдачей на неё ссылки не производят. Так что, при должном везении, там можно найти что-то полезное или интересное.
Ну, это очевидно и все об этом знают.
А вот факт, что Linux может не предоставить всего объёма запрошенной памяти и при этом вернуть не-NULL при вызове malloc() уже не такой общеизвестный. Более того – объем фактически выделяемой памяти обычно больше, чем запрашивалось. Это связано с нюансами выравнивания памяти (данные не могут находиться по произвольному адресу. Точнее могут, но это может заметно замедлить к ним обращение и такой режим необходимо включать принудительно).
А сейчас мы рассмотрим самую опасную ситуацию – когда malloc() возвращает валидный адрес, но система резервирует памяти меньше запрашиваемого. Благо решается(точнее детектируется) она парой строк кода, о которых я узнал лишь после того, как непосредственно столкнулся с проблемой.
Узнать фактический размер выделенной памяти мы можем с помощью функции malloc_usable_size(void*), которая возвращает размер блока, на который указывает указатель, передаваемый в качестве параметра. Поэтому код, защищённый от всех недоразумений, может выглядеть приблизительно так:
Для Си++ ситуация выглядит совершенно идентично:
Обращаю внимание, что передаваемый указатель должен указывать на начало выделенного блока, а не на любой адрес внутри блока. Только начало!
Пока я искал нужную информацию, я наткнулся на Windows-аналог malloc_usable_size(void*):
Не знаю, правда, насколько эта функция стандартна и распространена и как она вообще работает – возможности проверить у меня нет. Будьте бдительны — иногда ломаются вещи, которые в принципе не могут ломаться.
Я столкнулся с этой проблемой некоторое время назад при обновлении ядра, но отложил обновление до сих пор.
В моей системе я могу с удовольствием монтировать сетевые ресурсы, используя CIFS под управлением ядра 3.7.10, однако, когда я пробовал с новыми ядрами (в настоящее время пытаюсь с 3.13.1, но пытаюсь с 3.12.6), я получаю следующие ошибки, когда я попытаться установить их с /etc/init.d/netmount start (Я использую Gentoo):
Попытка смонтировать вручную приводит к той же ошибке .
Ошибка возникает трижды, так как я пытаюсь подключить три сетевых ресурса, вот мои /etc/fstab записи (которые полностью не меняются между версиями ядра):
Обыскивая, я нашел довольно старое решение этой проблемы, которое требует доступа к серверу Windows для внесения некоторых изменений, это подробно описано здесь.
К сожалению, это работает, и у меня нет доступа не только к серверу Windows, чтобы проверить, будут ли эти изменения иметь какое-либо значение, но и его только происходит с более новым ядром 3.12.6, я могу перезагрузиться в ядро 3.7.10, и сетевые ресурсы монтируются без каких-либо проблем.
Это наводит меня на мысль, что есть проблема с новым ядром, поэтому я рассмотрел параметры CIFS в конфигурации ядра 3.7.10:
. и в конфигурации 3.12.6:
. и они такие же (в этом нет ничего удивительного, ведь я ничего не менял!).
Я снова появился net-fs/cifs-utils на случай, если там что-то не так, но это не имело значения.
Есть ли способ обойти это, не имея доступа к общему ресурсу Windows, чтобы проверить предлагаемое решение (если это действительно основная причина) или есть что-то еще, что вызывает проблему?
Не уверен, есть ли обходной путь на стороне Linux, но исправление на стороне Windows определенно работает.
Поговорите со своим системным администратором Windows. Если вы можете заставить его / ее скопировать / вставить это в командную строку, это должно сработать:
- Привет, спасибо, что очень похоже на работу, с которой я сталкивался каждый раз, когда искал решение. Я думаю, похоже, что нет решения на стороне клиента, поэтому придется вежливо спросить у системных администраторов (они хорошие, и мы обычно ладим, поэтому, надеюсь, не будет слишком большой проблемой). Ура
- 1 Спасибо. Я не мог остановить LanmanServer с помощью sc ( [SC] ControlService FAILED 1051: A stop control has been sent to a service that other running services are dependent on. ) но PowerShell работал stop-service lanmanserver -force -PassThru
Когда я столкнулся с этим, я просто перезапустил службу «Сервер» в Windows 7, и монтирование заработало.
- Да, но, как я уже писал, у меня нет контроля над сервером Windows, поскольку он работает. Я почти уверен, что система будет перезагружена один или два раза, так как у нас были сбои сети с тех пор, как я начал пробовать с ядрами> 3.7. *
Я, наконец, решил, что решение заключалось в том, чтобы добавить параметр sec = ntlm для mount.cifs, потому что поведение по умолчанию изменилось. Из
Итак, мои записи в / etc / fstab теперь выглядят так .
Комбинация использования sec = ntlm в fstab и изменения параметра Size службы LanmanServer в Windows решает эту проблему.
Гуглить-то я гуглил. Ничего внятного не нашёл
Вот я не понимаю зачем..
В следующий раз будешь умней и не будешь делать SWAP больше размера физически доступной памяти.
Очень странно это писать, но swap можно и нужно делать больше размера физической памяти, хотя бы для гибернации
своп не нужен вообще, кроме как для гибернации
ну это смотря кому, web-серверу нужно поставить swappiness повыше и большой своп, потому что для apache и прочих требуется много быстрой оперативной памяти, а все остальное можно в своп скинуть
Изень всё чаще пердит в лужу (
А гибернацию куда девать?
в специально созданный для этих целей файл
почисть да и всё, не фыркай
в цифры не смотрел, но tmpfs в статистике проходит как кэш
но поведение её отличается чуть более, чем полностью
swap можно и нужно делать больше размера физической памяти, хотя бы для гибернации
Это давно не так.
То есть уже полный дамп оперативки не делается?
предлагаешь свопить в файл на разделе?
Зависит от настроек, но в целом - да, только область данных приложений, плюс она сжимается.
Можно и в файл. Хотя у меня, например, в сжатый ZVOL свопится. Правда, это из разряда «очень редко» или «а не собрать ли OpenOffice из исходников».
То есть уже полный дамп оперативки не делается?
Какой в этом смысл? Она у тебя 100% постоянно и перелезает в SWAP, что последний нужно делать больше оперативки?
В следующий раз будешь умней и не будешь делать SWAP больше размера физически доступной памяти.
Редкостного идиотизма фраза.
Попробуй сначала буферы сбросить
echo 3 > /proc/sys/vm/drop_caches
Она у тебя 100% постоянно и перелезает в SWAP
нет, но мне нужно, чтоб она работала всегда, а не только когда не занята более, чем на 50%, например
К тому же какая разница, файл это или раздел. В любом случае куда-то надо всё дампить. А файл подразумевает всего лишь на порядок больше геморроя.
Я столкнулся с этой проблемой некоторое время назад при обновлении моего ядра, но до сих пор не обновлялся.
В моей системе я могу с радостью подключить сетевые ресурсы, используя CIFS, запускающее ядро 3.7.10, однако, когда я пытался использовать более новые ядра (в настоящее время я пытаюсь с помощью 3.13.1, но пытался с 3.12.6), я получаю следующие ошибки, когда я попытайтесь установить их с /etc/init.d/netmount start (я запускаю Gentoo):
Попытка монтировать вручную приводит к той же ошибке …
Ошибка возникает три раза, поскольку у меня есть три общих сетевых ресурса, которые я пытаюсь подключить, вот мои записи /etc/fstab (которые полностью не изменились между версиями ядра):
Поиск вокруг я нашел довольно старое решение этой проблемы, которая требует доступа к серверу Windows, чтобы внести некоторые изменения, это подробно описано здесь .
К сожалению, это работает, и я не только не имею доступа к серверу Windows, чтобы проверить, будут ли эти изменения иметь какое-либо значение, но также и единственное, что происходит с новым ядром 3.12.6, я могу перезагрузиться в ядро 3.7.10 и сетевые ресурсы монтируются без каких-либо проблем.
Это заставляет меня думать, что есть проблема с новым ядром, поэтому я рассмотрел параметры CIFS как в конфигурации ядра 3.7.10:
… и в соответствии с конфигурацией 3.12.6:
… и они такие же (никакого реального удивления там, так как я ничего не изменил!).
Я снова появился net-fs/cifs-utils если бы там что-то не так, но это не имело никакого значения.
Есть ли способ, которым я могу обойти это без доступа к общей папке Windows, чтобы протестировать предлагаемое решение (если это действительно основная причина) или есть что-то еще, что вызывает проблему?
Не уверен, что есть обходной путь на стороне Linux, но исправление на стороне Windows определенно работает.
Поговорите со своим системным администратором Windows. Если вы можете заставить его / ее скопировать / вставить в командную строку, он должен работать:
Когда я столкнулся с этим, я просто перезапустил службу «Сервер» в Windows 7, а затем работал.
Комбинация использования sec = ntlm в fstab и изменение параметра «Размер» службы LanmanServer в Windows решает эту проблему.
Я, наконец, решил, что решение должно было добавить параметр «sec = ntlm» для mount.cifs, потому что поведение по умолчанию изменилось. Из
Я не могу различить какую-либо общность среди программ, которые вызывают эту ошибку. Кажется, это больше вопрос времени. После того, как мой компьютер работал некоторое время, от одного дня до нескольких дней, я не могу запустить какие-либо новые программы.
Единственный способ предотвратить эту ошибку - перезагрузить компьютер.
Почему я получаю эту ошибку и что мне делать, чтобы она не произошла?
Я запустил memtest, доступный из меню GRUB, и он не сообщает об ошибках, поэтому я не думаю, что это аппаратный сбой.
Я также запустил sudo apt-get check , и ошибок не было найдено.
Вот некоторые запрошенные выходные данные командной строки:
Это выходные данные ps --sort -rss -eo rss,pid,command | head после начала появления ошибки:
На основании предложений в комментариях и ответы, возможно, проблема в Gnome Panel или ее апплетах. Вот апплеты, которые я запускаю:
Апплеты - это Indicator Applet 12.10.1 , System Monitor 3.5.92 и «Область уведомлений». и «дата и время», для которых я не могу получить доступ к номеру версии.
Вот еще несколько запрошенных выходных данных командной строки:
4 ответа
Некоторый процесс вызывает утечку памяти. Чтобы понять, каким процессом это может быть, запустите
Если у вас возникла эта проблема при использовании Ruby on Rails с Digital Ocean , скорее всего, у вас слишком мало оперативной памяти. Попробуйте увеличить объем оперативной памяти с 512 МБ до 1 ГБ , что исправило ее для меня.
После экспериментов с его включением и выключением в течение последних нескольких дней я уверен, что теперь могу сказать, что проблема заключалась в утечке памяти в части индикатора времени апплета времени и даты. Когда отображается погода, использование памяти увеличивается со временем. Когда погода не отображается, память не увеличивается.
Я предлагаю вам начать процесс устранения неполадок, протестировав ОЗУ с помощью встроенной утилиты, представленной в загрузочном меню GRUB, и устранить «плохую ОЗУ» как источник проблемы.
Тест памяти
Memtest86 +
Если хотите, попробуйте выполнить эти шаги и сообщите о результатах здесь.
Хорошо, тогда - мы исключили аппаратное обеспечение как источник проблемы.
Далее, давайте рассмотрим использование памяти и настройки процесса на вашем компьютере; выполните эти команды из терминала:
Показать количество свободной и использованной памяти
Показать сводную информацию об использовании подкачки [ 1149]
Показать ограничения ресурсов пользовательского процесса
Снимок экрана ниже взят из чистая установка 10.04LTS. Подробности, которые следует отметить из первого и второго элементов в желтых кружках, находятся в столбце «Используется», который отображает память и пространство подкачки, доступное для использования операционной системой, то есть они не все израсходованы.
Нижний элемент в желтом кружке не отображает никаких ограничений на количество пользовательских процессов, например, gFTP или другого приложения, которые операционная система разрешит пользователю запускать.
Если хотите, попробуйте выполнить эти шаги и сообщите о результатах здесь.
Результаты, возвращенные из ps --sort -rss -eo rss , пид, команда | head , который вы опубликовали, показывает процесс панели gnome, использующий примерно 1,8 ГБ памяти, что выглядит немного необычно - это похоже на большой объем памяти, который будет использовать среда рабочего стола.
Вы можете получить разбивку памяти, которую использует процесс gnome-panel , выполнив обведенные кружком команды на скриншоте ниже и посмотрите, куда все это идет - это может показать что-то, что выделяется ,
Для сравнения, процесс gnome-panel на моей виртуальной машине использует 48 МБ ОЗУ - хотя, хотя на этих снимках экрана машина 10.04 является виртуальной машиной, которую я использую только для тестов а не мой рабочий стол.
Учитывая это, я предложу следующий шаг - изолировать проблему от «чего-то» в среде рабочего стола Gnome.
Чтобы проверить это, попробуйте установить рабочее пространство плазмы KDE, которое вы найдете в Центре программного обеспечения Ubuntu.
После установки перезагрузите компьютер и войдите в систему с сеансом KDE вместо Gnome, запустите свои приложения как можно лучше (рабочий стол совершенно другой) для посмотрите, не повторяется ли здесь ошибка «Не удается выделить память».
Просто чтобы прояснить ситуацию, вы сможете запускать те же «тесты» CLI в среде KDE, что и в среде Gnome, и сможете сравнивать результаты при проверке поведения компьютера между два.
В KDE консольное приложение, которое вы будете искать, это xterm , которое вы можете найти в диалоге поиска в главном меню.
Я собираюсь добавить немного уверенности здесь и сказать, что я думаю, что мы коллективно на правильном пути к изоляции проблемы.
Читайте также: