Да, механизм подкачки
ужасающе неэффективен. Обходной путь прост: перебирать процессы вместо перебора замененных страниц. Используйте этот сценарий python (я не являюсь аффилированным лицом):
git clone https://github.com/wiedemannc/deswappify-auto
cd ./deswappify-auto
sudo python3 deswappify_auto.py -d -v info
Обратите внимание, что режим работы демона предназначен только для настольных / портативных компьютеров, которые часто переходят в спящий режим. Я бы не стал запускать его как демон в серверной системе - просто запустите его на некоторое время, подождите, пока он не сообщит, что позаботился о некоторых процессах, затем остановите его и попробуйте:
swapoff /dev/x
Поскольку большинство страниц теперь присутствует как в swap и в памяти, swapoff
имеет очень мало функций и теперь должен быть невероятно быстрым (я видел сотни МБ / с).
Вышеупомянутый сценарий python основан на остальной части этого ответа, который, в свою очередь, был моим улучшением этого более старого ответа , автором jlong . Поскольку сценарий намного безопаснее, я рекомендую попробовать только оставшуюся часть моего ответа в качестве последней линии защиты :
perl -we 'for(`ps -e -o pid,args`) { if(m/^ *(\d+) *(.{0,40})/) { $pid=$1; $desc=$2; if(open F, "/proc/$pid/smaps") { while() { if(m/^([0-9a-f]+)-([0-9a-f]+) /si){ $start_adr=$1; $end_adr=$2; } elsif(m/^Swap:\s*(\d\d+) *kB/s){ print "SSIZE=$1_kB\t gdb --batch --pid $pid -ex \"dump memory /dev/null 0x$start_adr 0x$end_adr\"\t2>&1 >/dev/null |grep -v debug\t### $desc \n" }}}}}' | sort -Vr | head
Это длится примерно 2 секунды и на самом деле ничего не сделает, просто перечислите верхнюю часть 10 сегментов памяти (на самом деле он печатает больше однострочников; да, я люблю однострочники; просто изучите команды, примите риск, скопируйте и вставьте в вашу оболочку; они фактически будут читать из подкачки).
...Paste the generated one-liners...
swapoff /your/swap # much faster now
Основной однострочный файл безопасен (для меня), за исключением того, что он много читает / proc.
Подкоманды, подготовленные для вашего ручного исследования, небезопасны . Каждая команда будет зависать от одного процесса на время чтения сегмента памяти из подкачки. Так что с процессами, не допускающими пауз, небезопасно.Скорость передачи данных, которую я видел, была порядка 1 гигабайта в минуту. (Вышеупомянутый скрипт python устранил этот недостаток).
Другой опасностью является чрезмерная нагрузка на память системы, поэтому проверьте с помощью обычного free -m
Что он делает?
for(`ps -e -o pid,args`) {
if(m/^ *(\d+) *(.{0,40})/) {
$pid=$1;
$desc=$2;
if(open F, "/proc/$pid/smaps") {
while() {
if(m/^([0-9a-f]+)-([0-9a-f]+) /si){
$start_adr=$1;
$end_adr=$2;
} elsif( m/^Swap:\s*(\d\d+) *kB/s ){
print "SSIZE=$1_kB\t gdb --batch --pid $pid -ex \"dump memory /dev/null 0x$start_adr 0x$end_adr\"\t2>&1 >/dev/null |grep -v debug\t### $desc \n"
}
}
}
}
}
Результатом этого сценария perl является серия gdb
команды вывести память (диапазон)
, которые вызывают в память подкачанные страницы.
Вывод начинается с размера, поэтому его достаточно легко передать через | sort -Vr | head
, чтобы получить 10 самых больших сегментов по размеру (SSIZE). -V
обозначает сортировку по номеру версии, но она работает для моих целей. Я не мог понять, как заставить работать числовую сортировку.
Для Ubuntu Grub2 автоматически отображает последнее ядро и скрывает старые ядра. Если вы хотите их увидеть, вы можете нажать Shift во время загрузки.
Итак, перед удалением старых ядер загрузитесь с последним доступным ядром (grub2 загружает его по умолчанию при загрузке). Чтобы проверить, какое ядро вы используете, вы можете использовать команду:
uname -r
Рекомендуется оставить как минимум два, а лучше три ядра, включая последнее. Причина в том, что у вас будет хотя бы одно / два других ядра для загрузки, если окажется, что вы не можете загрузиться с последним ядром.
Чтобы удалить старые ядра, откройте терминал и проверьте текущее ядро:
uname -r
Затем, чтобы вывести список всех установленных ядер в вашей системе.
dpkg --list | grep linux-image
Найдите все ядра ниже, чем у вашего текущего ядра. Выполните следующие команды, чтобы удалить выбранное ядро:
sudo apt-get purge linux-image-x.x.x.x-generic
Наконец, выполните приведенные ниже команды, чтобы обновить grub2
sudo update-grub2
И перезагрузите систему.
apt-get autoremove
, запускаемый периодически, должен помочь вам достичь желаемого. Работающего ядра, предыдущего ядра и двух последних ядер должно быть достаточно.
Загрузите одно из предыдущих ядер.
Сначала попробуйте apt autoremove --purge
Если не работает dpkg -l 'linux- [ihs] *' | sed '/ ^ ii /! d; /' "$ (uname -r | sed" s / \ ([- 0-9] * \) - \ ([^ 0-9] \ + \) / \ 1 / ")" '/ d; s / ^ [^] * [^] * \ ([^] * \). * / \ 1 /; / [0-9] /! d'
Управляйте тем, что будет деинсталлт.
dpkg -l 'linux- [ihs] *' | sed '/ ^ ii /! d; /' "$ (uname -r | sed" s / \ ([- 0-9] * \) - \ ([^ 0-9] \ + \) / \ 1 / ")" '/ d; s / ^ [^] * [^] * \ ([^] * \). * / \ 1 /; / [0-9] /! d' | xargs sudo dpkg -P
Это очистит список ядра из приведенной ниже команды.
sudo apt -f install
и наверняка
sudo update-grub
Чтобы очистить старое ядро, вы можете использовать инструмент командной строки purge-old-kernels
.
Эта программа удалит старое ядро и пакеты заголовков из системы , освобождая место на диске. Он никогда не удалит работающее в данный момент ядро . По умолчанию он сохраняет как минимум 2 последних ядра, но пользователь может переопределить это значение с помощью параметра --keep. Любые дополнительные параметры будут переданы непосредственно в
apt-get
. Чтобы установить purge-old-kernels
, запустите:
sudo apt install byobu
или
sudo apt install bikeshed
Чтобы сохранить последнюю версию n
запуск ядра:
sudo purge-old-kernels --keep n
e, g: n = 2
sudo purge-old-kernels --keep 2
Обновление grub
:
sudo update-grub