매시간 스왑을 비우는 cron 스크립트를 작성하는 것은 나쁜 생각입니까? 제외하고는 충분한 공간이

몇 년 동안 작은 Ubuntu 구성에서 동일한 문제가 발생했습니다. 사용 된 스왑 공간은 시간이 지남에 따라 증가합니다. 스왑 비활성화와 같은 사용자 작업의 경우를 제외하고는 충분한 공간이 있어도 할당 된 메모리가 RAM으로 반환되지 않기 때문에 주로 이것이 인상입니다.

이것을 cron자동화하라는 짧은 명령을 내 렸으며 좋은 결과를 얻었습니다.

#! /bin/sh

echo "* */1 * * * root swapoff -a && swapon -a" >> /etc/crontab

그러나이 문제에 대한 실제 솔루션보다 더 트릭이기 때문에 그것이 나쁜 아이디어 일 수있는 잠재적 인 이유에 대해 궁금하거나,이 스크립트를 좀 더 영리하게 만들기 위해 어떻게이 스크립트를 개선 할 수 있습니까?



답변

그런 식으로 사용하십시오 : 예, 나쁩니다. 스왑을 끄기 전에 사용 가능한 메모리가 충분한 지 확인해야합니다. 더 나은 버전 은 https://askubuntu.com/a/90399/15811 을 참조 하십시오 .

또한 : 이것에 대해 확신합니까? 스왑이 할당되었다고해서 스왑이 사용되는 것은 아닙니다. vmstat, 열 si(스왑 인) 및 so(스왑 아웃) 명령 이것들이 0으로 남아 있으면 다른 문제가 있습니다. 내 경험상 스왑은 거의 사용되지 않으며 빈 것으로 생각하지 않고 비울 것이 없다고 생각하여 사용하지 않을 수 있습니다.


답변

나는 그것이 나쁜 생각이라고 말하고 싶습니다. 사용 가능한 메모리가 있고 활성 프로세스가 스왑에서 RAM으로 이동되지 않는다고 생각하면 사용 가능한 메모리가 많지 않거나 프로세스가 생각한 것보다 활성화되지 않은 것입니다 입니다.

활성 프로세스가 계속 교체되면 메모리에 압력을 가하는 원인을 수정해야합니다. 활성화 된 프로세스가 아닌 경우 가장 중요한 것은 무엇입니까?


답변

나쁜 생각입니다.

일부 프로세스가 많은 메모리를 필요로하는 경우 스왑에 유효한 사본이 이미있는 페이지는 다른 쓰기없이 즉시 재사용 할 수 있기 때문에 커널은 실제 메모리가 가득 차기 전에 스왑 할 데이터 복사 (이동하지 않음)를 시작합니다. 디스크에.

일반적으로 오랜 시간 동안 액세스하지 않은 페이지에 주로 발생하며, 곧 액세스 할 가능성이 낮다는 것을 나타내는 좋은 지표입니다.

복사본을 명시 적으로 폐기하면 데이터가 여전히 RAM에 존재하기 때문에 이점이 없지만 일부 프로세스가 많은 메모리를 할당하고 스왑이 필요할 때 속도를 높일 수 있습니다.

실제 메모리가 50 % 이상 가득 차면 커널은 항상 스왑 공간을 사용하므로 충분한 메모리가 설치되어 있어도이 숫자는 0이 아닙니다.


답변

이것은 나쁜 생각입니다. 이것이 유용하다면, 리눅스 커널은 이것을 구현할 것입니다. 나는 단순한 쉘 스크립트가 커널 개발자의 알고리즘보다 더 영리하지 않기 때문에 몇 가지 튜닝 매개 변수 이상을 변경해야 할 이유가 있다고 생각하지 않습니다.

기본적으로 두 가지 경우가 있습니다.

  • 스왑 공간의 프로세스는 어쨌든 사용되지 않습니다. RAM으로 다시 가져 오려는 이유는 무엇입니까?
  • RAM이 거의 없으므로 스왑 아웃되어 RAM으로 다시 가져옵니다. 그런 다음 시스템은 가능한 빨리 다시 스왑으로 전환합니다.

따라서 두 가지 주요 사항이 있습니다.

  1. 첫째, 모든 프로그램을 한 번에 실행할 수있는 RAM이 너무 적 으면 시스템 속도가 느려집니다. 스왑은 더 많은 프로그램을 실행하는 데 도움이되지만 거의 사용되지 않는 프로그램으로 빠르게 전환되지는 않습니다. 스왑은 거의 사용하지 않는 것을 얻거나 현재 사용 된 것을 메모리 부족 예외를 보낼 수 없습니다.
  2. 둘째, 스왑은 좋은 일이므로 현재 사용하지 않는 프로그램 비용으로 무료 RAM이 있으므로 스왑에 물건이 있습니다.

너무 많은 프로그램에서 메모리 부족 문제가 발생하지 않더라도 일부 프로그램은 현재 사용 가능한 RAM을 기반으로 메모리를 할당 할 수 있으며 (브라우저에서 더 많은 memcache를 사용하고 더 빠르게 탐색 할 수 있음) 커널은 디스크 캐싱 및 비슷한 최적화. 스왑을 강제로 비우면 커널이 읽기 캐시를 삭제하므로 새 Firefox 인스턴스를 시작하면 Firefox가 디스크 캐시에있을 때보 다 시간이 오래 걸립니다.

커널의 동작을 조정하려면 swappiness 매개 변수를 참조하십시오 .

@ peter-cordes는 두 가지 추가 리소스를 제공합니다.

빈 스왑을 원한다면 스왑을 영구적으로 해제 할 수 있습니다. 나는 왜 한 시간 동안 그것을 켜고 비우는 것이 스왑을하지 않는 것보다 이점이 있는지 알지 못합니다.


답변

커널에게 캐시를 비우도록하여 동일한 결과를 얻을 수 있습니다.

echo 3 > /proc/sys/vm/drop_caches

이런 식으로 당신은 가능한 메모리 부족의 순간을 피하고 커널이 필요한 것과 버릴 수있는 것을 결정하게합니다.


답변

일반적인 생각과 달리 SWAP 자체 는 나쁘지 않습니다 .
실제로 시스템 속도를 늦추는 것은 RAM에서 SWAP로 데이터를 다시 RAM으로 이동시키는 커널 활동입니다 swappiness.
로 구성되어 있으므로 시스템이 자동으로 수행합니다 swappiness.
이로 인해 비활성 프로세스의 메모리가 하드 디스크 스왑 파티션으로 덤프됩니다.
나는 나 자신이 너무 많은 RAM 메모리를 가지고 있지 않은 기계로 수년간 일했으며 항상 SWAP 메모리를 사용했습니다. 여전히 열려있는 응용 프로그램을 닫으려고 시도하여 메모리를 RAM으로 다시 이동하기 시작할 때까지 내 컴퓨터는 정상적으로 작동했습니다. 그런 다음 작업 부하가 증가하기 시작했습니다.

  • 따라서 지속적으로 SWAP 메모리를 정리하면 시스템의 작업 부하가 상당히 증가합니다.
  • SWAP 파티션에 메모리가있는 응용 프로그램을 실행하면 실행이 손상 될 수 있습니다.

오히려 htop응용 프로그램과 함께 명령 줄에서 메모리를 사용하는 응용 프로그램 을 닫고 일부 응용 프로그램을 닫기로 결정하는 것이 좋습니다 . 는 gnome-system-monitor자사의 프로세스 탭에서,뿐만 아니라 당신에게 좋은 통찰력을 제공 할 수 있습니다.
많은 RAM을 사용하는 큰 응용 프로그램이있는 경우 한 번에 모두 실행하지 마십시오.