
私は pxelinux を使用して、TinyCore の in-ram バージョン (Linux バージョン 4.19.10-tinycore) を展開しています。これは、最新の BIOS (今日現在) を搭載した Z270-A マザーボードで実行されています。PXE はレガシー モードで起動されます。
私は、ネットワーク経由で SSD イメージを展開し、RandomAccessFile を使用して書き込む Java アプリケーションを作成しました。書き込み時に、次のような奇妙な動作が発生しました。
print_req_error: I/O error, dev sda, sector 42319888
Buffer I/O error on dev sda, logical block 5289986, async page read
ata1: EH complete
ata1.00: Enabling discard_zeroes_data
ata1.00: exception Emask 0x0 SAct 0x40000 SErr 0x0 action 0x0
ata1.00: irq_stat 0x40000008
ata1.00: failed command: READ FPDMA QUEUED
ata1.00: cmd 60/08:90:10:c0:85/00:00:02:00:00/40 tag 18 ncq dma 4096 in
res 41/40:00:10:c0:85/00:00:02:00:00/40 Emask 0x409 (media error) <F>
ata1.00: status: { DRDY ERR }
ata1.00: error: { UNC }
ata1.00: configured for UDMA/133
sd 0:0:0:0: [sda] tag#18 UNKNOWN(0x2003) Result: hostbyte=0x00 driverbyte=0x08
sd 0:0:0:0: [sda] tag#18 Sense Key : 0x3 [current]
sd 0:0:0:0: [sda] tag#18 ASC=0x11 ASCQ=0x4
sd 0:0:0:0: [sda] tag#18 CDB: opcode=0x28 28 00 02 85 c0 10 00 00 08 00
print_req_error: I/O error, dev sda, sector 42319888
Buffer I/O error on dev sda, logical block 5289986, async page read
ata1: EH complete
ata1.00: Enabling discard_zeroes_data
NCQ を無効にしようとしましたlibata.force=noncq
が、効果はありませんでした。
奇妙なのは、私のプログラムを使用してデバイスを消去しdd if=/dev/zero of=/dev/sda bs=1M
、再度データを書き込もうとすると、このようなエラーは発生しません。ドライブをゼロで埋めると問題が解決するようです。ただし、これには非常に長い時間がかかり、デバイスの健全性にメリットはありません。
この特定の理由から、実際のデータを書き込む前にゼロが書き込まれるようにイメージを書き込むプログラムを実装し、上記のコマンドをシミュレートしました。それでも、エラーは発生します。
smartctl -a /dev/sda
悪い兆候は見られません。Silicon Power S55やMicron 1100など、複数のデバイスでこの現象が発生しました。のみこのセットアップでは発生します。インストールされたバージョンの Ubuntu 18.04 (RAM ではなくディスクから実行) では発生しませんでした。
RAM に欠陥はありません。memtest でテスト済みです。すべてのケーブルは正常で、Corsair RM1000i から接続されています。
以下は出力ですdmesg。これを修正する方法が見つからないようです。この時点では途方に暮れています。また、ここにはスマートctl出力。
編集: 常に同じセクターで発生するわけではありません。過去に問題なく動作していたセクターで発生することもあります。ランダムに発生するようです。
編集2: 私のプログラムは/dev/sda
ファイルとして開き、その上でI/Oを実行します(これがディスクへの書き込み方法です)
答え1
メッセージは確かに誤ったエラーだったようです。Java コードを変更し、代わりにFileOutputStream
この便利なライブラリを使用するようになりました。http://www.nicecode.eu/java-streams-for-direct-io/
これは、JNA を使用してファイルへのネイティブ I/O アクセスを提供し、O_DIRECT フラグをオンに設定できます。ライブラリを変更して、バッファを BLOCK_SIZE (512 バイト) から 512KB (512*1024) に増やしました。バッファ サイズはブロック サイズの倍数である必要があり、O_DIRECT の場合は 512 バイトである必要があります。この方法により、速度は適切になり、Java の非ネイティブ実装に匹敵します。
md5sum
以前テストした Silicon Power SSD でも新しい Micron SSD でも、エラーはなくなり、すべてのデータが有効になりました ( を使用して確認済み)。