TinyCore 下 SSD 的奇怪行為。 Java 程式出現 I/O 錯誤,dd 則無 I/O 錯誤

TinyCore 下 SSD 的奇怪行為。 Java 程式出現 I/O 錯誤,dd 則無 I/O 錯誤

我正在使用 pxelinux 部署 TinyCore 的記憶體版本(Linux 版本 4.19.10-tinycore)。它在具有最新 BIOS 的 Z270-A 主機板上運行(截至目前為止)。 PXE 以傳統模式啟動。

我編寫了一個 Java 應用程序,透過網路部署 SSD 映像,並使用 RandomAccessFile 寫入它們。我在寫作時遇到過奇怪的行為,特別是:

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 版本(從磁碟運行,而不是從記憶體運行)從未發生過這種情況。

記憶體沒有問題,用memtest測試過。所有電纜均良好,在 Corsair RM1000i 上運行。

這是一個輸出訊息。我似乎找不到解決這個問題的方法,我現在迷失了。另外,這裡還有智慧控制輸出。

編輯:它並不總是發生在同一個部門。有時,這種情況發生在過去運作良好的部門。看起來很隨便。

EDIT2:我的程式會/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,不再有錯誤,所有數據均有效(使用 確認)。

相關內容