대용량 파일을 복사하면 과도한 스왑이 발생함

대용량 파일을 복사하면 과도한 스왑이 발생함

32GB RAM, 3TB 여유 디스크 공간을 갖춘 중급 CentOS 6.4/64 서버에서 KVM 하이퍼바이저로 실행하면서 동일한 로컬 파일 시스템의 대상 위치에 200GB 파일을 복사하기 시작했습니다. 실제로 이 파일은 KVM 가상 디스크 이미지(전원이 꺼진 VM에 해당)입니다. 다른 12개의 가상 머신은 동일한 머신에서 정상적으로 실행되고 있습니다.

충분한 공간으로 시작합니다.

[root@myserver]$ free
             total       used       free     shared    buffers     cached
Mem:      32847956   16722708   16125248          0      63756     407740
-/+ buffers/cache:   16251212   16596744
Swap:     16383992          0   16383992

그러나 복사가 진행됨에 따라 메모리 사용량은 스왑 영역에 도달할 때까지 꾸준히 증가하기 시작합니다. 물론 이렇게 하면 모든 것이 느려집니다... 복사는 결국 약 30분 후에 종료됩니다. 결국 내 기억은 이렇다.

[root@myserver]$ free
             total       used       free     shared    buffers     cached
Mem:      32847956   32643564     204392          0      24392   23213400
-/+ buffers/cache:    9405772   23442184
Swap:     16383992   12057880    4326112

어떤 프로세스가 스왑을 사용하고 있는지 살펴보면서 qemu-kvm의 여러 인스턴스를 관찰했습니다. 따라서 이제 모든 가상 머신이 스왑되는 것은 아니더라도 많은 서버의 성능이 영향을 받고 있습니다. 프로덕션 서버를 다시 시작하지 않고도 스왑을 0(그렇지 않으면 정상)으로 되돌리는 방법을 찾을 수 없습니다.

이 문제의 원인은 무엇입니까? 간단한 cp 프로세스가 어떻게 그렇게 많은 메모리를 소비할 수 있으며 이를 방지하는 방법은 무엇입니까? 어떤 충고?

감사해요

답변1

스왑 공간을 0으로 복원하는 것은 유용한 목표가 아닙니다.

아무것도 없다그 자체물건을 교환하는 것은 잘못된 것입니다. 프로그램이 실제로 사용하지 않는 리소스를 로드하는 것은 매우 가능하며, 커널은 이를 알아차리고 교체하여 이제 실제로 사용할 수 있는 프로그램에서 사용할 수 있도록 메모리를 확보합니다. 이는 라이브러리의 전체 기능 중 극히 일부만 필요하더라도 프로그램이 다른 사람이 제공하는 거대한 라이브러리에 크게 의존하는 오늘날의 비대해진 소프트웨어 세계에서 종종 발생합니다.

귀하가 제공한 유일한 하드 숫자(30분에 200GB)도 제 눈에는 꽤 좋아 보입니다. 이는 114MB/초로, 단일 물리적 볼륨 내에서 파일을 복사한다는 점을 고려하면 놀라운 복사 속도입니다. 얼마 전까지만 해도 순차 읽기 속도 100MB/초는 상당히 인상적이었습니다. 인터리브된 읽기 및 쓰기보다 더 잘 관리할 수 있습니다!

가장 중요한 것은 당신이 잘못된 나무를 짖고 있다고 생각합니다.

답변2

스왑 프로그램 대신 파일 시스템 캐시를 희생하려면 /proc/sys/vm/swappiness의 값을 낮추십시오.

관련 정보