Linux는 대규모 IO 작업을 수행할 때 공격적으로 스왑합니다.

Linux는 대규모 IO 작업을 수행할 때 공격적으로 스왑합니다.

외부 드라이버나 내부 디스크에서 대용량 파일을 복사하는 등 대규모 IO 작업을 수행할 때 Debian 10 데스크탑 시스템에서 이상한 문제가 발생했습니다.

다음과 같은 간단한 상황으로 요약할 수 있습니다.

sudo dd if=/dev/sdb of=/dev/null

/dev/sdb 드라이브의 모든 내용(예: 연결된 USB 드라이브와 /dev/sda 내부 드라이브)을 읽기 위해 이 명령을 실행하면 예를 들어 htop에서 시스템이 활발하게 교체되고 있음을 볼 수 있습니다. 많은 물건 메모리. 결과적으로 작업이 완료될 때까지 시스템이 완전히 응답하지 않게 되고 (다시 잠시 후) 시스템이 내 데스크톱 응용 프로그램을 다시 교체합니다.

이를 확인하기 위해 swapoff / swapon을 사용하여 전체 스왑 영역을 지웠고 약 5GB의 메모리가 사용되었습니다.

여기에 이미지 설명을 입력하세요.

작업 중에 io 버퍼(파란색)의 수가 계속 증가합니다. 여기에 이미지 설명을 입력하세요.

...

여기에 이미지 설명을 입력하세요.

위의 명령을 실행하면 시스템이 다음과 같이 표시됩니다.

여기에 이미지 설명을 입력하세요.

스왑 및 쓰기 저장 크기를 줄이기 위해 여러 시스템 매개변수를 테스트했습니다.

/proc/sys/vm/swapiness = 1
/proc/sys/vm/dirty_ratio = 10

그러나 이것이 실제로 문제를 바꾸지는 않습니다.

흥미롭게도 스왑을 완전히 비활성화하면 성능 문제나 메모리 부족이 발생하지 않습니다. 커널은 사용 가능한 메모리만 사용하며 애플리케이션이 버퍼 크기를 줄여 더 많은 메모리를 할당할 수 있도록 합니다.

비슷한 문제가 발생했고 해결책을 아는 사람이 있습니까? 이 문제는 내 컴퓨터 두 대 모두에서 발생하며 해결 방법을 모르겠습니다.

답변1

dd if=/dev/sda1 of=/dev/null iflag=nocache &

free그런 다음 백그라운드 기간 동안 "버프/캐시"가 작동 중지되는 동안 "유휴"가 어떻게 복구되는지 확인할 수 있습니다 ("사용 가능"은 남아 있음).dd

그렇지 않은 경우 iflag=nocache설명하는 것과 동일한 효과가 나타납니다. "free" mem이 많이 사용됩니다. 스왑이 활성화되지 않았으며 fg"중요"해지기 전에 Ctrl-C를 활성화합니다.

SO에 대한 의견에서는 버퍼링이 스와핑보다 "더 나쁘다"고 주장합니다. 나는 이것이 사실이라고 생각하지만 좋은 설명을 할 수는 없습니다... OS 자체가 메모리에 큰 개체를 보관할 가치가 있는지 알 방법이 없다는 점을 제외하면 말입니다. 사용자조차도 명령을 반복할지 여부를 항상 알 수는 없습니다.

깃발의 극적인 효과는 nocache그것이 실제로 중요하다는 것을 보여줍니다.


cp나는 파일 시스템에서는 이런 일이 일어나지 않는다고 생각합니다 . 아니면 그럴까요?

관련 정보