Recentemente, tive o mesmo problema e criei isso para limpar a troca rapidamente:
#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
Se isso não funcionar em seu ambiente específico, o processo é o seguinte:
1. Obtenha uma lista dos processos que consomem mais troca.
No meu caso, estou verificando / proc / $ pid / status, com o uso de troca na linha 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. Para os procs de alta troca, eu acho os intervalos de endereços de memória que estão contribuindo com o maior uso de troca.
Eu recebo isso de / 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. Eu uso o gdb para fazer core dumps desses intervalos de endereços diretamente para / dev / null
Isso força o sistema a acessar essa memória e a retirar da troca. Ir para / dev / null evita IO desnecessário.
gdb --batch --pid $pid -ex "dump memory /dev/null $astart $aend"
O processo que eu mencionei originalmente omite qualquer região de memória usando menos de 1M de swap para obter a maioria do swap com consideravelmente menos core dumps, mas isso não é obrigatório.