쓰기 작업이 많은 응용 프로그램을 수행하면 전체 시스템 속도가 느려지는 것을 발견했습니다. 이를 추가로 테스트하기 위해 (상대적으로) 낮은 CPU, 높은 디스크 활동을 수행하기 위해 다음을 실행했습니다.
john -incremental > file_on_SSD
그러면 시스템 디스크의 파일에 초당 수만 개의 문자열이 출력됩니다.
이렇게 하면 마우스가 느려지고 TTY가 응답하지 않게 되며 응용 프로그램이 "사라지고" 일반적으로 전체 컴퓨터를 사용할 수 없게 됩니다. 마침내 Control+C를 누를 수 있게 되었을 때 john
, 몇 초 후에 시스템이 최대 전력으로 돌아왔습니다.
이것은 극단적인 예이지만 빠른 소스에서 대용량 파일을 복사하거나 트랜스코딩하는 등 쓰기 집약적이지 않은 활동에서 비슷한 문제에 직면했습니다.
내 기본 OS 디스크는 상당히 빠른 SSD입니다(OCZ 애자일 60GB) EXT4를 사용합니다. EXT4를 사용하여 기계식 디스크에 출력을 쓰면 john
속도가 훨씬 느려지더라도 동일한 속도 저하가 발생하지 않습니다(SSD의 경우 초당 최대 42,000단어, 기계식의 경우 초당 8,000단어). 처리량이 관련될 수 있습니다. 기계식 디스크는 시스템 독립적이기도 합니다. 이것은 단지 데이터일 뿐입니다.
저는 커널 2.6.35-2를 사용하고 있지만 이 SSD를 구입한 이후로 이 문제를 발견했으며 당시에는 아마도 .31이나 다른 것을 사용하고 있었을 것입니다.
그렇다면 속도 저하의 원인은 무엇입니까? EXT4 문제? 커널 문제? SSD 문제? 무엇보다도? 다른 건 없나요?
추가 테스트가 필요하다고 생각되는 경우 수행 방법을 설명하는 댓글을 남겨주시면 결과를 질문에 첨부해 드리겠습니다.
답변1
이는 한동안 알려진 문제였습니다. Btrfs와 같은 SSD 조정 FS를 사용하면 도움이 될 수 있지만 그렇지 않을 수도 있습니다.
궁극적으로 이는 IO 스케줄러/메모리 관리 시스템의 버그입니다. 최근 이 문제를 해결하기 위한 몇 가지 패치가 출시되었습니다. 바라보다수정됨: Linux 데스크톱 응답성 문제가 있습니까?
이러한 패치는 결국 메인라인 커널에 포함될 수 있지만 현재로서는 이 문제를 해결하려면 자체 커널을 컴파일해야 할 것입니다.
답변2
Linux에서 SSD 성능을 향상시키기 위해 확인할 수 있는 몇 가지 사항이 있습니다.
마운트 지점을 "noatime"으로 설정합니다. 대부분의 사용 사례에서 추가 활동 업데이트 액세스 시간은 일반적으로 낭비됩니다. 특히 단일 라인이 파일에 지속적으로 삽입되는 경우 액세스할 때마다 파일 시스템이 여러 번 업데이트됩니다.
엘리베이터를 확인해 보세요. 대부분의 배포판의 기본 엘리베이터는 회전 디스크에 대한 무작위 액세스를 위해 설정되어 있습니다. SSD에는 추가 논리가 필요하지 않으므로 엘리베이터를 noop으로 설정하면 하드웨어가 쓰기를 관리하게 하여 성능을 향상시킬 수 있습니다.
연속 쓰기 및 후기입 캐시. 조금 난해하지만
hdparm
기기에서 사용하는 캐싱 방식을 확인할 수 있습니다. 후기입 캐싱은 연속 기입에 비해 SSD 성능에 긍정적인 영향을 미칠 수 있습니다.
답변3
파일 캐시가 워크로드에 맞게 올바르게 조정되지 않았을 수 있습니다. 불행하게도 Linux 커널은 멍청해서 이를 자동으로 처리할 수 없습니다. RAM이 많고 블록 장치가 충분히 느린 경우 기본값은 끔찍합니다. 바라보다https://lonesysadmin.net/2013/12/22/better-linux-disk-caching-performance-vm-dirty_ratio/더 알아보기.
/etc/sysctl.conf
수정 해 보시길 권합니다
vm.dirty_background_ratio = 3
vm.dirty_ratio = 6
쓰기 캐시로 인한 RAM 압력을 크게 줄여 코어가 다른 작업을 더 잘 처리할 수 있도록 합니다. 이는 낮은 처리량을 위해 향상된 대기 시간을 교환합니다.
또 다른 가능성은 캐시를 늘리는 것입니다. 그러나 프로세스가 지속적으로 새 데이터를 쓰는 경우 캐시가 가득 차면 매우 심각한 대기 시간을 경험하게 됩니다. 시험해보고 싶다면 다음과 같이 할 수 있습니다.
vm.dirty_background_ratio = 5
vm.dirty_ratio = 80
설정 은 *_ratio
사용 가능한 RAM의 비율을 나타냅니다. 더 나은 제어를 원할 경우 *_bytes
설정을 사용하세요. 저는 개인적으로 워크스테이션에 다음 구성을 사용합니다.
vm.dirty_background_bytes = 50000000
vm.dirty_bytes = 200000000
이렇게 하면 백그라운드 쓰기 캐시가 50MB로 제한되고 캐시에 200MB가 있는 경우 동기 쓰기가 강제 실행됩니다.