Я думаю, что необходимо использовать что-то лучше для этого как команда 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. Но это не то, что Вы ищете.
Недавно у меня была такая же проблема, и я создал эту программу для быстрой очистки свопа:
#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М свопа, чтобы получить большую часть свопа при значительно меньшем количестве дампов ядра, но это не обязательно.
Список команд, которые вы перечислены, являются удобным способом заставить ядро перемещать все необходимые страницы в ОЗУ и повторно включить своп. Причина, по которой это так медленно, озадачивается - если у вас нет файлов Swap (а не разделы), которые являются чрезвычайно фрагментированы, или вы пытаетесь сделать это, когда делают другие ввода-вывода.
Возможно, вы захотите посмотреть на настройку Swappiness значение
( / proc / sys / vm /
). Низкое значение означает, что система с меньшей вероятностью выходит на диск.
Вы также можете включить ZSWAP
, что вызывает сжатие страниц, таким образом, используя меньше места подкачки. Это использует некоторое ЦП, конечно, но это гораздо меньше воздействия, чем на странице.