스왑 이벤트 직후 스왑 공간 확보

스왑 이벤트 직후 스왑 공간 확보

나는 많은 계산 작업을 위해 Linux 머신을 사용하는데, 때로는 특정 계산이 많은 RAM을 소비합니다. 작업이 끝나면 사용된 스왑 공간과 여유 메모리가 많이 남게 됩니다. 평소처럼 업무를 수행하면 시스템의 다른 모든 프로세스는 해당 작업이 완료될 때까지 약간 지연될 것입니다. swapped back if 모든 것을 빠르게 RAM으로 다시 페이징하는 명령이 있어서 실행한 다음 일어나서 화장실에 가거나 돌아오면 모든 것이 빨라질 수 있으면 좋을 것 같습니다. .

내가 찾은이 문제이는 다음과 같이 (적어도 Linux에서는) 이 작업을 수행할 수 있음을 의미합니다.

sudo swapoff -a
sudo swapon -a

하지만 이 작업을 수행하려고 하면 시간이 걸립니다.영원히- 단 2-5MB/초의 속도로 스왑 공간을 확보합니다.방법필요한 것보다 적고 그만한 가치가 없어 보입니다. 이게 정상인가요? "점심 먹으러 나가는" 시간 대신 "화장실 가는" 시간에 실행되도록 이 프로세스 속도를 높일 수 있는 방법이 있습니까?

답변1

최근에 같은 문제가 발생하여 스왑을 빠르게 정리하기 위해 이것을 만들었습니다.

#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 라인에서 swap을 사용하고 있었습니다.

# 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에 직접 덤프했습니다.

이렇게 하면 시스템이 해당 메모리에 액세스하고 스왑에서 꺼내게 됩니다. 불필요한 IO를 방지하려면 /dev/null로 이동하세요.

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

내가 원래 언급한 절차에서는 상당히 적은 수의 코어 덤프로 대부분의 스왑을 얻기 위해 1M 미만의 스왑이 있는 메모리 영역을 사용하는 것을 생략했지만 이것이 필수는 아닙니다.

답변2

나열된 명령은 커널이 필요한 모든 페이지를 RAM으로 이동하고 스왑을 다시 활성화하도록 하는 편리한 방법입니다. 파티션이 아닌 심하게 조각난 스왑 파일이 있거나 다른 I/O를 수행하는 동안 이를 시도하는 경우가 아니라면 왜 이렇게 느린지 알 수 없습니다.

swappiness값( )을 조정하는 것이 좋습니다 /proc/sys/vm/. 값이 낮을수록 시스템이 페이지를 디스크로 페이지 아웃할 가능성이 낮아집니다.

또한 이 기능을 활성화하면 zswap페이지가 압축되어 스왑 공간을 덜 사용할 수 있습니다. 물론 일부 CPU를 사용하지만 페이징보다 영향이 훨씬 적습니다.

관련 정보