サムドライブを介してデータをコピーすると、サムドライブが2MiB / sより速い速度で書き込むことができないにもかかわらず、Linuxは最初に1秒以内に600 MBのデータをコピーします。ただRAMにキャッシュとして書き込んでから、300秒間ゆっくりとデータを更新します。この場合、キャッシュは実際にコピー速度を向上させません。
この動作を防ぐvm.dirty_ratio
ために0
。
これにより、私が書いたものはキャッシュなしでリアルタイムで作成されます。
これまでに発生した問題
- SSDに書き込む速度は20 - 30MiB / sです(RAMディスクから$ HOMEに2 GBのデータをコピーするとき)!変更前は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
編集する:
基準:
RAMディスクに新しいファイルを作成しました。
$ >/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)
ファイルには、0xa
10または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が言ったように、バッファがまったくないことは、カーネルが小さな書き込みを1つの大きな書き込みにグループ化する機会がないことを意味します。これは実際にディスクの断片化を引き起こすとは思わないが、SSD自体がより小さい書き込みを1つのより大きな書き込みにグループ化しない場合、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を低くてもゼロ以外の値に設定することをお勧めします。たとえば、dirty_bytes = 33554432(32 MB)または「メトリック」MBを使用し、必要に応じて30000000に設定します。棒。 8MB(8388608または8000000)でも4秒に短縮されますが、SSD書き込みが最高速度またはほぼ最高速度に戻ることがわかります。