외부 드라이버나 내부 디스크에서 대용량 파일을 복사하는 등 대규모 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
나는 파일 시스템에서는 이런 일이 일어나지 않는다고 생각합니다 . 아니면 그럴까요?