Странное поведение SSD под TinyCore. Ошибки ввода-вывода с программами Java, но ни одной с dd

Странное поведение SSD под TinyCore. Ошибки ввода-вывода с программами Java, но ни одной с dd

Я использую pxelinux для развертывания версии TinyCore в оперативной памяти (версия Linux 4.19.10-tinycore). Он работает на материнской плате Z270-A с последней версией BIOS (на сегодняшний день). 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.

Вот выводdmesg. Я не могу найти способ исправить это, я запутался в этом месте. Также, вотсмартктлвыход.

EDIT: Это не всегда происходит в одном и том же секторе. Иногда это происходит в секторе, который раньше работал нормально. Это выглядит случайным.

EDIT2: Моя программа открывается /dev/sdaкак файл и выполняет в нем операции ввода-вывода (так я записываю на диск)

решение1

Похоже, сообщения действительно были ложными ошибками. Я изменил свой код Java, вместо использования FileOutputStreamя теперь использую эту удобную библиотеку:http://www.nicecode.eu/java-streams-for-direct-io/

Он обеспечивает собственный доступ ввода-вывода к файлам с использованием JNA, и я могу включить флаг O_DIRECT. Я изменил библиотеку, увеличив буфер с BLOCK_SIZE (512 байт) до 512 КБ (512*1024). Размер буфера должен быть кратен размеру блока, который для O_DIRECT должен быть 512 байт. Таким образом, скорости разумны, сравнимы с неродной реализацией Java.

Ошибок больше нет, все данные достоверны (подтверждены с помощью md5sum), ни для ранее протестированного твердотельного накопителя Silicon Power, ни для нового Micron.

Связанный контент