매시간 스왑을 비우는 cron 스크립트를 작성하는 것은 나쁜 생각입니까?


26

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

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

#! /bin/sh

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

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


29
나의 무지 용서하지만, 정확히 말해서 무엇을 의미합니까 공간 SWAP 시간 함께 성장 하고 할당 된 메모리의 RAM을 비우는 ? 일반적으로 시스템에 스왑 공간을 할당하고 다시는들을 수 없습니다. 실제로 얼마나 많은 스왑이 이루어 집니까? 뭐가 문제 야?
디저트

5
왜 이걸하고 싶니? 왜 일부 스왑 사용이 나쁜 것이라고 생각합니까? 스왑 사용량은 얼마입니까?
marcelm

25
나는 의아해합니다. "문제"에 대해 계속 이야기하지만 실제로 어떤 종류의 부정적인 영향도 묘사하지는 않습니다. 왜 이것이 문제라고 생각합니까?
David Schwartz

17
무언가가 교환되어 거기에 머무르면 아무것도 사용하지 않기 때문입니다. 아무것도 그것을 사용하지 않을 경우, 그것은이 RAM이 뭔가를 사용할 수 있도록하는 것이 좋습니다 되는 스왑의 데이터 다시보다는, 캐시처럼 액세스.
홉스

12
스왑을 해제하는 것보다 이것이 더 낫습니까?
user253751

답변:


51

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

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


3
무엇을 기다립니다? 스왑 오프에 필요한 메모리가 부족하면 OOM 킬러가 먼저 스왑 오프를 종료합니다. 예, 그들은 실제로 그것을 하드 코딩했습니다 (시스템 호출로 확인).
Joshua

@Joshua는 확실하지만 자동화 된 작업을 원합니다. 오류가 없습니다.
Rinzwind

4
내 대답을 쓰지 않고 자세히 설명하기 위해 시간이 지남에 따라 증가하는 스왑 사용량은 전혀 나쁜 것이 아닙니다 . 의미하는 바는 커널이 메모리를 소비하는 정크가 어떤 식으로 사용되지 않았 는지 알아 내고 스왑으로 옮겨서 실제로 더 많은 fs 데이터를 캐시에 보관할 수있는 것처럼 실제로 도움이되는 것들에 메모리를 사용할 수 있다는 것입니다. 계속 버리고 디스크에서 다시 읽을 필요는 없습니다).
R ..

@Rinzwind cron은 오류가 발생한 작업에서 잘 작동하며 연결된 스크립트도 사용하지 않습니다 vmstat.
jpaugh

41

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

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


1
+1 : 큰 문제는 무엇입니까? 실행중인 시스템을 절대로 변경하지 마십시오 . 시스템의 핵심 기능을 엉망으로 만들지 않아야한다고 생각하지 않습니다. 특히 필요하지 않습니다.
디저트

3
때때로 메모리 누수 (다른 모든 것을 스왑으로 강제 전환)하여 프로세스를 종료하여 ~ 10 % RAM을 사용하는 문제가 있습니다 ...하지만 실행중인 모든 프로그램은 다시 액세스 할 때까지 스왑 상태에 있습니다. 따라서 무언가를 만질 때마다 2 초의 지연이 있습니다. OP가 어디에서 오는지 알 수 있으며 자동으로 수행하는 것이 좋지만 이것이 올바른 방법은 아닙니다.
누군가 어딘가에

1
@SomeoneSomewhere 그러나 어쨌든 그것은 작동하지 않습니다. 프로세스가 메모리를 누출하는 경우 정의에 따라 해당 메모리를 적극적으로 사용하고 있지 않습니다 (읽거나 쓰지 않음). 우연히 할당 된 것입니다. 주변에 다른 활성 프로세스가 있으면 누출 된 메모리가 스왑 아웃되고 실제 RAM이 아닌 가비지로 가득 찬 스왑이됩니다.
David Richerby

@DavidRicherby 백그라운드에서 프로그램을 연 경우 해당 프로그램은 여전히 메모리 누수보다 활동적입니다. 다시 전환 할 때는 스왑에서 나와야합니다.
누군가 어딘가에

@SomeoneSomewhere 메모리 시스템의 작동 방식을 잘못 이해 한 것 같습니다. 물리적 RAM에 전체 프로세스가 없어도됩니다. 스왑은 단일 페이지 단위로 관리됩니다. 한동안 사용되지 않은 모든 페이지는 스왑 아웃되기 쉬우 며, 완전히 유출 된 메모리로 구성된 페이지는 다시 사용되지 않으므로 스왑 아웃 후 다시 스왑되지 않습니다.
David Richerby

34

나쁜 생각입니다.

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

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

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

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


4
always : /proc/sys/vm/swappiness기본값 인으로 가정하면 70서버에 적합하며 더 이상 페이지 캐시를위한 공간을 만들기 위해 한동안 손대지 않은 프로세스에서 더티 페이지를 상당히 적극적으로 페이지 아웃합니다. alt-tab이 느려질 수 있기 때문에 종종 데스크톱에 좋지 않습니다.
Peter Cordes

@PeterCordes, 페이지가 실제로 제거 된 경우 캐시는 해당 애플리케이션 페이지보다 더 많은 액세스를 보았으므로이를 디스크 캐시로 사용하면 얻을 수있는 이점이 있습니다. 예를 들어 대규모 프로젝트의 컴파일 시간보다 Alt-Tab 성능이 사용자에게 더 잘 보이는지 알 수 있지만 너무 많은 성능을 희생하지 않으면 서 즉각적인 응답을 보장하는 정책을 구성하는 것이 어렵다는 것을 알 수 있습니다.
Simon Richter

1
다시 말해 커널은 처리량 ( swappiness=70)에 맞게 조정 되지만 대기 시간은 데스크탑에서의 사용자 경험에 더 중요합니다. 트레이드 오프입니다. 페이지 캐시에 보관하기에 너무 큰 내용을 정기적으로 컴파일하는 경우 swappiness5 또는 10 대신 20 또는 30과 같이 조금 더 높게 두십시오 . akitaonrails.com/2017/01/17/optimizing-linux-for를 참조하십시오. -느린 컴퓨터 . 보고 vm.vfs_cache_pressure보다 낮은 100도 너무 UI 응답에 대한 좋은 데이터 페이지를 통해 아이 노드 / 디렉토리의 메타 데이터를 캐싱 선호한다.
Peter Cordes

1
기타 튜너 블 : 임계 값 다시 쓰기 lonesysadmin.net/2013/12/22/... . 이것들은 파일에 무언가를 쓴 후 리눅스가 디스크에 쓰는 것을 얼마나 빨리 시작하고 얼마나 많은 더티 페이지가 허용되는지를 제어합니다. (즉, 얼마나 많은 메모리를하면 쓰기 캐시에 지출 될 수 있습니다)
피터 코르

21

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

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

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

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

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

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

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

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

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



5

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

echo 3 > /proc/sys/vm/drop_caches

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


0

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.