Свободный область подкачки внезапно после события подкачки

Я думаю, что необходимо использовать что-то лучше для этого как команда rsync.

Взятый от человека:

Некоторые дополнительные функции rsync:

   support for copying links, devices, owners, groups, and permissions

Синтаксис:

   Local:  rsync [OPTION...] SRC... [DEST]

   Access via remote shell:
     Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
     Push: rsync [OPTION...] SRC... [USER@]HOST:DEST

Для сохранения времени изменения времен доступа и режимов из исходного файла, можно использовать-p после scp. Но это не то, что Вы ищете.

3
13.04.2017, 15:36
2 ответа

Недавно у меня была такая же проблема, и я создал эту программу для быстрой очистки свопа:

#Single-proc function to core-dump swapped ranges > 1M to /dev/null
unswap(){ (awk -F'[ \t-]+' '/^[a-f0-9]*-[a-f0-9]* /{recent="0x"$1" 0x"$2}/Swap:/&&$2>1000{print recent}' /proc/$1/smaps | while read astart aend; do gdb --batch --pid $1 -ex "dump memory /dev/null $astart $aend" &>/dev/null; done&)2>/dev/null;};

#Loop to run unswap on the top 20 swap-consuming processes
grep VmSwap /proc/*/status 2>/dev/null | sort -nk2 | tail -n20 | cut -d/ -f3 | while read line; do unswap $line; done;

#Observe the number of core dumps currently running, along with free swap, over time. 
echo "Dumps Free(m)"; rcount=10; while [[ $rcount -gt 0 ]]; do rcount=$(ps fauxww | grep "dump memory" | grep -v grep | wc -l); echo "$rcount        $(free -m | awk '/Swap/{print $4}')"; sleep 1; done 

Если это не работает в вашей конкретной среде, то процесс выглядит следующим образом:

1. Получите список процессов, потребляющих наибольшее количество свопа.

В моем случае, я проверяю /proc/$pid/status, с использованием свопа в строке VmSwap.

# grep VmSwap /proc/*/status 2>/dev/null | sort -nk2 | tail -n5
/proc/22457/status:VmSwap:      3780 kB
/proc/22684/status:VmSwap:      4260 kB
/proc/7408/status:VmSwap:       4396 kB
/proc/31992/status:VmSwap:      9176 kB
/proc/2967/status:VmSwap:      60840 kB

2. Для процессов с высоким уровнем свопинга я нахожу диапазоны адресов памяти, которые вносят наибольший вклад в использование свопинга.

Я получаю это из /proc/$pid/smaps:

7f2fd1bc4000-7f2fd1d24000 rw-p 00000000 00:00 0 <<< Address range
Size:               1408 kB
Rss:                 900 kB
Pss:                 900 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:       900 kB
Referenced:            4 kB
Anonymous:           900 kB
AnonHugePages:         0 kB
Swap:                508 kB    << Swap used
KernelPageSize:        4 kB
MMUPageSize:           4 kB

3. Я использую gdb для создания дампов ядра этих диапазонов адресов прямо на /dev/null

Это заставляет систему получить доступ к этой памяти и вытащить ее из свопа. Передача в /dev/null позволяет избежать ненужного IO.

gdb --batch --pid $pid -ex "dump memory /dev/null $astart $aend"

Процесс, о котором я говорил, изначально опускает все области памяти, использующие менее 1М свопа, чтобы получить большую часть свопа при значительно меньшем количестве дампов ядра, но это не обязательно.

2
27.01.2020, 21:27

Список команд, которые вы перечислены, являются удобным способом заставить ядро ​​перемещать все необходимые страницы в ОЗУ и повторно включить своп. Причина, по которой это так медленно, озадачивается - если у вас нет файлов Swap (а не разделы), которые являются чрезвычайно фрагментированы, или вы пытаетесь сделать это, когда делают другие ввода-вывода.

Возможно, вы захотите посмотреть на настройку Swappiness значение ( / proc / sys / vm / ). Низкое значение означает, что система с меньшей вероятностью выходит на диск.

Вы также можете включить ZSWAP , что вызывает сжатие страниц, таким образом, используя меньше места подкачки. Это использует некоторое ЦП, конечно, но это гораздо меньше воздействия, чем на странице.

0
27.01.2020, 21:27

Теги

Похожие вопросы