vm.dirty_ratio를 0으로 설정하면 장기적인 부작용이 있나요?

vm.dirty_ratio를 0으로 설정하면 장기적인 부작용이 있나요?

썸 드라이브를 통해 데이터를 복사할 때 썸 드라이브가 2MiB/s보다 빠른 속도로 쓸 수 없음에도 불구하고 Linux는 먼저 1초 안에 600MB의 데이터를 복사합니다. 단지 RAM에 캐시로 쓴 다음 300초에 걸쳐 천천히 데이터를 새로 고칩니다. 이 경우 캐싱은 실제로 복사 속도를 향상시키지 않습니다.

이 동작을 방지하기 vm.dirty_ratio위해 0.

이렇게 하면 내가 작성한 내용이 캐싱 없이 실시간으로 작성됩니다.


지금까지 발생한 문제

  • 이제 SSD에 쓰는 속도는 20 - 30MiB/s입니다(램디스크에서 $HOME으로 2GB의 데이터를 복사할 때)! 변경 전에는 300MiB/s였습니다.

하지만 이제 복사한 내용이 기록되었고 메모리에 아무것도 남지 않았음을 확인할 수 있으므로 데이터 손상 걱정 없이 복사한 후 즉시 파일을 처리할 수 있기 때문에 이것은 나에게 큰 문제가 아닙니다!


dirty_ratio를 비활성화하면 장기적인 부작용이 있는지 알고 싶습니다. 내 시스템에서는 SSD, HDD 및 썸 드라이브를 사용합니다.

IO 스케줄러(udev 규칙을 사용하여 설정됨)는 회전하지 않는 모든 디스크에 대한 MQ-Deadline이고 회전하는 디스크에 대한 BFQ입니다.


시스템 세부정보

핵심:

Linux 버전 5.8.12-xanmod1-1 (makepkg@archlinux) (gcc (GCC) 10.2.0, GNU ld (GNU Binutils) 2.35) #1 SMP PREEMPT Wed, 30 Sep 2020 14:19:49 +0000


편집하다:

기준:

램디스크에 새 파일을 만들었습니다.

$ >/tmp/x ; xfs_io -c 'pwrite -S 0xa 0 1G' /tmp/x 
wrote 1073741824/1073741824 bytes at offset 0
1 GiB, 262144 ops; 0.2277 sec (4.392 GiB/sec and 1151213.5997 ops/sec)

파일에는 0xa10 또는 ASCII로만 변환되는 "\n"만 포함됩니다.

그런 다음 이를 설치하고 하드 드라이브에 복사했습니다.

  • dirty_ratio가 20(기본값)인 경우:
$ sudo mount /dev/sdb3 /mnt/ ; time sudo cp /tmp/x /mnt/ ; time sudo umount /mnt/ 

real    0m5.879s
user    0m0.013s
sys     0m0.392s

real    0m3.566s
user    0m0.002s
sys     0m0.060s
  • dirty_ratio가 0인 경우:
$ sudo mount /dev/sdb3 /mnt/ ; time sudo cp /tmp/x /mnt/ ; time sudo umount /mnt/ 

real    0m29.983s
user    0m0.006s
sys     0m0.600s

real    0m0.163s
user    0m0.000s
sys     0m0.052s
  • dirty_ratio가 100인 경우(기준선에만 해당):
$ sudo mount /dev/sdb3 /mnt/ ; time sudo cp /tmp/x /mnt/ ; time sudo umount /mnt/ 

real    0m0.408s
user    0m0.006s
sys     0m0.370s

real    0m9.050s
user    0m0.004s
sys     0m0.077s

벤치마크에 따르면 vm.dirty_ratio를 0으로 설정하는 것이 실제로 훨씬 느린 것으로 나타났습니다.

답변1

이 캐시가 없으면 HDD가 쓰기를 재구성할 수 없어 대규모 조각화가 발생하고 더 많은 마모가 발생합니다.

캐싱을 끄는 대신 옵션을 사용하여 스틱을 설치할 수 있습니다 sync.

답변2

Barafu Albino가 말했듯이 버퍼가 전혀 없다는 것은 커널이 작은 쓰기를 하나의 큰 쓰기로 그룹화할 기회가 없다는 것을 의미합니다. 이것이 실제로 디스크 조각화를 일으킬 것이라고는 생각하지 않지만, SSD 자체가 더 작은 쓰기를 하나의 더 큰 쓰기로 그룹화하지 않으면 SSD의 쓰기 마모가 더 높아질 것입니다. 또한 임시 파일이 100분의 1초 동안만 사용되더라도 기록될 수 있습니다(파일이 디스크에 기록되기 전에 생성, 사용 및 삭제되면 시스템은 파일을 기록하는 데 리소스를 낭비하지 않습니다). 디스크) 디스크가 전혀 없습니다. )

어느 시점에서 대용량 메모리 시스템(또는 USB 스틱에서 볼 수 있듯이 RAM은 적지만 저장 공간이 매우 느린 시스템)에서 1%가 여전히 너무 높다는 사실을 발견했을 때 dirty_bytes 및 dirty_Background_bytes 옵션이 추가되었습니다. dirty_bytes가 설정되면 dirty_ratio는 지워지고 절대 사용되지 않습니다. (0이 아닌) dirty_ratio가 설정되면 dirty_bytes는 지워지고 절대 사용되지 않습니다(dirty_Background_ratio/bytes도 마찬가지입니다). dirty_bytes를 낮지만 0이 아닌 값으로 설정하는 것이 좋습니다. 예를 들어 dirty_bytes=33554432(32MB) 또는 "메트릭" MB를 사용하고 원할 경우 30000000으로 설정합니다. 막대기. 8MB(8388608 또는 8000000)라도 4초로 단축되지만 SSD 쓰기가 최고 속도 또는 거의 최고 속도로 돌아오는 것을 발견하게 될 것입니다.

관련 정보