Вопрос или проблема
Я не хочу использовать файл подкачки (из-за какого-то бага в ядре или драйвере AMD).
Я хочу, чтобы какая-то утилита работала и контролировала свободную память системы и уведомляла меня, когда она становится меньше заданного предела.
Это позволит мне знать, что мне нужно закрыть некоторые приложения (или вкладки браузера), чтобы избежать зависания системы из-за какого-то странного I/O-активности kswapd0 (вероятно, другого бага).
Существует ли подходящее программное обеспечение?
ОБНОВЛЕНИЕ:
Я переработал скрипт, предоставленный Гари, под свои нужды и хочу поделиться им
#!/bin/bash
# Минимальный предел доступной памяти, МБ
THRESHOLD=400
# Интервал проверки времени, секунды
INTERVAL=30
while :
do
free=$(free -m | awk '/^Mem:/{print $4}')
buffers=$(free -m | awk '/^Mem:/{print $6}')
cached=$(free -m | awk '/^Mem:/{print $7}')
available=$(free -m | awk '/^-\/+/{print $4}')
message="Свободно $free""МБ"", буфер $buffers""МБ"", кэш $cached""МБ"", доступно $available""МБ"""
if [ $available -lt $THRESHOLD ]
then
notify-send "Память заканчивается!" "$message"
fi
echo $message
sleep $INTERVAL
done
Вы можете попробовать использовать free
.
free -s n
будет обновлять вывод каждые n
секунд. Оберните это в if
для любого предела, который вы считаете “слишком большим использованием памяти”, и отображайте сообщение, когда оно достигает этой точки.
ИЗМЕНЕНИЕ: Вот скрипт, который я придумал. Грубоват, но он работает.
# Проверяет на низкую память.
#!/bin/bash
# cutoff_frac — это, по сути, насколько используемая память может быть в терминах того, сколько
# у вас всего памяти... 2 — это 1/2 от 100% или предупреждение, когда вы используете 50% памяти и т.д.
cutoff_frac=2
total_mem=$(free|awk '/^Mem:/{print $2}')
let "threshold = $total_mem / $cutoff_frac"
while :
do
free_mem=$(free|awk '/^Mem:/{print $4}')
if [ $free_mem -lt $threshold ]
then
notify-send "Низкая память!!"
fi
sleep 5
done
exit
Версия скрипта на PHP:
Свободная память, как показано в системном мониторинге: Свободно = Всего – (Использовано – буферизировано – кэшировано)
ПРИМЕЧАНИЕ: Чтобы запустить этот скрипт как задание cron, используйте:
* * * * * env DISPLAY=:0.0 path/to/file 90
или
@restart env DISPLAY=:0.0 path/to/file
раскомментируйте цикл while, чтобы запустить его вручную:
Код:
#!/usr/bin/php
<?php
$alert_percent=($argc>1)?(int)$argv[1]:90;
//$interval=($argc>2):(int)$argv[2]:25;
//while(true)
//{
exec("free",$free);
$free=implode(' ',$free);
preg_match_all("/(?<=\s)\d+/",$free,$match);
list($total_mem,$used_mem,$free_mem,$shared_mem,$buffered_mem,$cached_mem)=$match[0];
$used_mem-=($buffered_mem+$cached_mem);
$percent_used=(int)(($used_mem*100)/$total_mem);
if($percent_used>$alert_percent)
exec("notify-send 'Низкая память: $percent_used% использовано'");
//sleep($interval);
//}
exit();
?>
.
Ответ или решение
Уведомление о нехватке оперативной памяти: полное руководство
Введение
Контроль за состоянием оперативной памяти вашей системы имеет ключевое значение для предотвращения сбоев и зависаний, особенно на системах, где использование программного обеспечения ресурсоемко. Если вы испытываете проблемы с управлением памятью и хотите получать уведомления, когда доступная память опускается ниже определенного порога, то представленные ниже решения помогут вам решить эту задачу.
Проблема
Пользователь сообщает о проблеме нехватки оперативной памяти в системе. Он не хочет использовать swap-файл из-за возможных ошибок в ядре или драйверах, и ему необходимо создать утилиту для мониторинга запаса свободной памяти с возможностью получения уведомлений.
Решение
Вы можете создать простую оболочку скрипта, которая будет отслеживать состояние оперативной памяти и отправлять уведомления при достижении заданного лимита. В представленном варианте мы будем использовать команду free
для получения информации о памяти и механизм уведомлений на основе notify-send
.
Скрипт на Bash
Вот пример скрипта на Bash, который вы можете использовать для мониторинга состояния свободной памяти:
#!/bin/bash
# Минимальный порог свободной памяти, МБ
THRESHOLD=400
# Интервал проверки, секунд
INTERVAL=30
while :
do
free=$(free -m | awk '/^Mem:/{print $4}') # Свободная память
buffers=$(free -m | awk '/^Mem:/{print $6}') # Буферы
cached=$(free -m | awk '/^Mem:/{print $7}') # Кэш
available=$(free -m | awk '/^-\/+/{print $4}') # Доступная память
message="Свободная память: $free МБ, буферы: $buffers МБ, кэш: $cached МБ, доступно: $available МБ"
if [ $available -lt $THRESHOLD ]; then
notify-send "Память заканчивается!" "$message"
fi
echo $message
sleep $INTERVAL
done
Параметры скрипта
- THRESHOLD: Задает минимальную доступную память (400 МБ в данном примере), при достижении которой будет отправлено уведомление.
- INTERVAL: Определяет, как часто (каждые 30 секунд) скрипт будет проверять состояние оперативной памяти.
Инструкция по запуску
- Сохраните скрипт в файл, например
check_memory.sh
. - Добавьте права на выполнение:
chmod +x check_memory.sh
- Запустите скрипт:
./check_memory.sh
Использование cron для автоматизации
Если вы хотите, чтобы этот скрипт выполнялся автоматически, можно добавить его в crontab:
* * * * * /path/to/check_memory.sh
Эта команда будет запускать скрипт каждую минуту.
Заключение
Представленный метод является простым и эффективным способом мониторинга состояния оперативной памяти в вашей системе без использования swap-файлов. С помощью этого скрипта вы сможете получать своевременные уведомления о нехватке ресурсов, что позволит вам быстро принимать меры и предотвращать возможные сбои в работе системы. Внедрив это решение, вы сможете улучшить производительность своей системы и повысить ее стабильность.