스왑 파티션 없이 Linux를 사용하는 팁

스왑 파티션 없이 Linux를 사용하는 팁

과거에는 가상 메모리가 스와핑을 시작하고 디스크 활동을 차지하며 시스템 속도가 느려지는 Linux의 메모리 부족 상황에 약간 지쳤습니다.

그래서 MacBook Pro에 Ubuntu를 설치했을 때 RAM이 8GB라는 것을 알았고 "그만하면 충분할 것 같습니다. 스왑 문제를 피하고 가상 메모리용 파티션을 예약하지 않을 것 같아요."라고 스스로에게 말했습니다. 어쨌든 필수야."

놀랍게도 가상 메모리가 없는 Linux에서 메모리가 부족해지는 사용자 경험은 제가 예상했던 것보다 훨씬 더 나빴습니다.

실수로 한 번에 너무 많은 큰 C++ 파일을 컴파일하거나("make -j6"을 사용하여 쉽게 수행 가능) 실수로 알아차리기 전에 컴퓨터 메모리를 소비하는 경우 프로그램은 오류로 인해 예상했던 것처럼 충돌하지 않지만 전체 데스크톱이 응답을 멈췄습니다. 그리고 컴퓨터를 강제로 재부팅해야 했습니다! 가끔 나는 이 일을 하느라 많은 시간을 낭비하거나 일을 한다!

돌아가서 다시 분할하여 가상 메모리를 확보함으로써 문제를 해결하고 싶지만 젠장.. 지금은 그렇게 할 여유가 없습니다. Linux에서 메모리 부족 상황을 보다 깔끔하게 처리할 수 있는 방법이 있습니까?

답변1

다시 돌아가서 다시 파티션을 나누어 가상 메모리를 확보함으로써 문제를 해결하겠지만 젠장..

스왑 전용 전체 파티션을 가질 필요도 없고 다시 파티션할 필요도 없습니다.

교환을 파일로 생성하는 것은 매우 간단합니다. 비어 있는 큰 파일을 만들고 mkswap을 실행한 다음 스왑을 추가하면 됩니다.

# create an big empty 1GB file (or whatever size you like)
dd if=/dev/zero of=/swapfile bs=1M count=1024
# format the file as swap
mkswap /swapfile
# turn it on.
swapon /swapfile

영구적으로 유지하려면 fstab에 추가하세요.

/swapfile swap swap defaults 0 0

답변2

나는 대규모 컴파일(qtwebkit, I'm looking at you)을 수행할 때 스왑 중단이나 기타 불행한 부작용을 방지하기 위해 컨트롤 그룹을 사용합니다. 내 6G 상자의 경우 다음을 수행합니다.

cgcreate -g memory:emerge
echo "4G" > /sys/fs/cgroup/memory/emerge/memory.limit_in_bytes
echo "4G" > /sys/fs/cgroup/memory/emerge/memory.memsw.limit_in_bytes
cgexec -g memory:emerge tmux

OOM 상황이 발생하면 종료되는 유일한 프로세스는 컴파일입니다.

답변3

메모리가 부족한 경우 특정 프로세스가 종료될 가능성이 높거나 낮은 것으로 표시할 수도 있습니다. 특정 프로세스에 대한 값을 설정하면 oom_score_adj해당 프로세스가 종료되는 우선 순위를 제어할 수 있습니다.

기본적으로 모든 프로세스의 점수는 0이며 점수 범위는 -1000(종료 안 함)부터 1000(항상 먼저 종료)까지입니다.

Firefox는 일반적으로 내 컴퓨터에서 메모리 사용량의 가장 큰 원인이므로 스크립트를 사용하여 Firefox를 시작합니다.

#!/bin/sh
echo 900 > /proc/self/oom_score_adj
exec /usr/bin/firefox

이로 인해 Firefox는 OOM 점수 900으로 시작하게 되었으며, 이는 이렇게 높은 점수를 받은 유일한 프로세스였습니다. 즉, 시스템에 메모리가 부족해지면 해당 프로세스가 종료된다는 의미입니다.

비슷한 작업을 수행하고 데스크탑 환경을 -900으로 설정하여 기본값은 Firefox의 메모리 부족 시간의 절반과 데스크탑 환경이 메모리를 확보하고 가져오기 위해 종료됨을 의미하므로 종료될 가능성이 가장 적습니다. Firefox 및 기타 모든 프로그램을 종료하세요! 아주 좋은하지.

관련 정보