Форум программистов, компьютерный форум CyberForum.ru

Битовые утечки при записи данных на диск - C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.87
Petrolion
24 / 24 / 7
Регистрация: 02.02.2016
Сообщений: 124
06.06.2016, 14:42     Битовые утечки при записи данных на диск #1
Доброго дня форумчане!
Сорри если оффтоп но... Пишу в консольке на C++ (MSVCE 2010) различные движки по расчетам и тут столкнулся с опасной проблемой.
При записи на диск искажаются данные на один бит, где то один раз на 109 - 1011 данных. Бит просто "теряется" (был 1 стал 0 или наоборот) , соответственно данные уже не верны, что приводит к нулю все проделанную работу.
Из исследованного:
Бит теряется при записи как в поток текстового значения переменных (типа fileout << a[i] << endl;)
Так и при записи в двоичном виде (типа fileout.write(reinterpret_cast<char*>(a),size*sizeof(a[0]));)
Замечено, что данные в памяти верные, т.к. были пойманы моменты при повторном выводе из того же массива все данные были записаны корректно.
Ошибка не зависит от винчестера на который данные были записаны (были записи на 3 различных винта, один из которых рейд массив).
Чаще всего теряется один из старших битов (типа 24-й бит в unsigned long или 24-й в unsigned long long). Других потерянных бит не замечено.
Термин "потерянный" возможно применяю в данном случае не верно. Т.к. заметно искажение только при его инвертировании. Соответственно если был сбой и он вместо 1 записал сбойную 1 - этого я не найду.
Система молчит про контроль целостности данных. Винт тоже. У винтов и рейда все показатели в порядке (блоки не сыпятся, SMART в порядке).

Сталкивался ли кто с подобным? В чем может быть проблема?

В ближайшем будущем хочу переустановить систему и MSVCE 2013. Но не уверен, что система виновата.
Кто что подскажет?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.06.2016, 14:42     Битовые утечки при записи данных на диск
Посмотрите здесь:

Как заставить ресурс работать без записи на диск? C++ Builder
C++ Напишите функции записи данных в файл, чтения данных из файла
Visual C++ Утечки памяти
C++ Builder Утечки памяти...
Утечки памяти C++
C++ Ошибка при записи данных в файл
C++ Builder Составить программу для ввода данных о студентах, проживающих в общежитии, и записи этих данных в файл
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
HighPredator
 Аватар для HighPredator
5385 / 1768 / 323
Регистрация: 10.12.2010
Сообщений: 5,233
Записей в блоге: 3
06.06.2016, 14:49     Битовые утечки при записи данных на диск #2
Petrolion, факт ошибки подтвержен? Т.е. показано несоответствие данных, записываемых на диск, и считанных с него же? Как именно (код)?
Petrolion
24 / 24 / 7
Регистрация: 02.02.2016
Сообщений: 124
06.06.2016, 15:14  [ТС]     Битовые утечки при записи данных на диск #3
HighPredator, к сожалению факт ошибки подтвержден и не раз. Есть данные (возрастающая последовательность) полученные многократно, при этом иногда одиночные значения делают резкий провал или вылет из общей последовательности на один бит. При проверке с остальными проходами видно что это именно инвертирование (или потеря) одного бита.
Цитата Сообщение от HighPredator Посмотреть сообщение
Т.е. показано несоответствие данных, записываемых на диск, и считанных с него же?
вот здесь возможна семантическая неувязочка. Т.к. возможно именно библиотека C++ отдает на запись не верные данные, соответственно винт принял и отдал именно те данные которые ему предоставили.
Думаю в коде нет смысла. Пробовал даже обычное считывание и запись данных. Ошибка при том же коде возникает не всегда, но при многочисленных повторах да. Отлавливаю отличие в выходных данных обычным fc для текстовых или fc /b для бинарных данных из командной строки. (Для контроля делаю сравнение по нескольку раз тоже). Ошибок fc не обнаружено.
Renji
1621 / 1069 / 260
Регистрация: 05.06.2014
Сообщений: 3,160
06.06.2016, 15:22     Битовые утечки при записи данных на диск #4
Либо сыпится память, либо все же труднообнаружимый баг в программе.
1) Загрузитесь с Лайв-CD Дебиана, зайдите в Advanced options и запустите Memory Diagnostic Tool. Ну или что там в Винде вместо этого, если Дебиан качать не хотите.
2) Все же прогоните простенький тестик на тему "записал, прочитал обратно, сравнил".
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main ()
{
    const int size=100500;
    char*data=new char[size];
    char*copy_data=new char[size];
    for(int i=0;i<size;++i)
        data[i]=rand();
 
    std::ofstream ostream("test");
    ostream.write(data,size);
    ostream.close();;
 
    std::ifstream istream("test");
    istream.read(copy_data,size);
    istream.close();
 
    if(memcmp(data,copy_data,size))
        cout<<"опс..."<<endl;
}
Petrolion
24 / 24 / 7
Регистрация: 02.02.2016
Сообщений: 124
06.06.2016, 15:34  [ТС]     Битовые утечки при записи данных на диск #5
Renji, память проверил сразу. Но в Винде. С ней порядок. Нашел, что данные в памяти хранятся нормально, т.к. без выхода из программы (данные все еще в памяти) повторный вывод данных может быть другим. Для одно и двухбайтовых данных проблем не обнаружил. Ошибки с 4 и 8-ми байтовыми данными. Потому и подозрительно. Грешу на MSVCE. Но где копать, не знаю.
ЗЫ. Оперирую с большими динамическими массивами от 107 до 109 значений.
HighPredator
 Аватар для HighPredator
5385 / 1768 / 323
Регистрация: 10.12.2010
Сообщений: 5,233
Записей в блоге: 3
06.06.2016, 15:41     Битовые утечки при записи данных на диск #6
Цитата Сообщение от Petrolion Посмотреть сообщение
Думаю в коде нет смысла.
В коде больше смысла, чем в вашем утверждении
Цитата Сообщение от Petrolion Посмотреть сообщение
возможно именно библиотека C++ отдает на запись не верные данные
Так что давайте вы создадите тестовый пример на котором у вас воспроизводится данный кейс, а мы посмотрим. Иначе все просто голословные рассуждения.
Petrolion
24 / 24 / 7
Регистрация: 02.02.2016
Сообщений: 124
07.06.2016, 12:50  [ТС]     Битовые утечки при записи данных на диск #7
Итак, тестовая прога (x64):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
    int n = 1<<30;
    int k = 1<<24;
    int c = 1;
    ofstream fbin, ftxt;
    unsigned long long * b = new unsigned long long[n];
    for (int i = 0; i < n; i++)
        b[i]=k+i;
    cout << "Table ready." << endl;
    do
    {
        cout << endl << "Menu:" << endl << "1 - output binary (Data.dat)" << endl << "2 - output text (Data.txt)" << endl << "0 - Exit" << endl << "your choise: ";
        cin >> c;
        switch(c)
        {
        case 1:
            fbin.open("Data.dat",ios_base::binary);
            fbin.write(reinterpret_cast<char*>(b),n*sizeof(b[0]));
            fbin.close();
            break;
        case 2:
            ftxt.open("Data.txt");
            for (int i = 0; i < n; i++)
                ftxt << b[i] << endl;
            ftxt.close();
            break;
        }
        cout << "Done." << endl;
    } while (c != 0);
    cin.get();
return 0;
}
На очередном запуске вывода бинарника (текстовик выводит очень долго, а с двух раз проблем не случилось) поймал одну ошибку, сегодня с утра вторую. В сумме ушло около 12 часов прогонов. И опять 24-й бит.

Сравнение файлов Data0.dat и DATA4.DAT
00000001E142D92B: 3C 3D

Сравнение файлов Data.dat и DATA4.DAT
000000018C02E8DB: 33 32

Согласитесь, код наиэлементарнейший.
Миниатюры
Битовые утечки при записи данных на диск   Битовые утечки при записи данных на диск  
HighPredator
 Аватар для HighPredator
5385 / 1768 / 323
Регистрация: 10.12.2010
Сообщений: 5,233
Записей в блоге: 3
07.06.2016, 14:53     Битовые утечки при записи данных на диск #8
Посмотрел. Походу действительно косяк есть. По второму скрину разобрал назад. В общем постоянное слагаемое К равно 16777216. Три четырехбайтовые значения в порядке возрастания с косяком:
Код
32 80 5D 1A = 847273242
33 80 5D 1B = 864050459
32 80 5D 1C = 847273244
Отняв слагаемое, выходит, что состояние счетчика i было:
Код
847273242 - 16777216 = 830496026
864050459 - 16777216 = 847273242
847273244 - 16777216 = 830496028
Выходит, что во втором случае i должен был быть равен 830496027. Битовое представление:
Код
847273242 (10) = 0011 0010 1000 0000 0101 1101 0001 1010 (2)
830496027 (10) = 0011 0001 1000 0000 0101 1101 0001 1011 (2)
Итого действительно налицо кривой бит три кривых бита (посмотрел внимательно).

Не по теме:

Разбор для наглядности. Ясен пень, что из хекс представления это и так видно.


Мое мнение такое, что причина такого аппаратная. Я не могу себе представить ни один кейс программной ошибки в системной либе. Если бы это было так, то частота воспроизводимости ошибки была бы в разы выше. У вас я так понял, оно очень плохо воспроизводится?

АПД. Короче, я все еще уверен, что ошибка аппаратная. Но меня смущает именно три бита. Может кто меня проверить? Я все так высчитал?
Renji
1621 / 1069 / 260
Регистрация: 05.06.2014
Сообщений: 3,160
07.06.2016, 15:11     Битовые утечки при записи данных на диск #9
Цитата Сообщение от HighPredator Посмотреть сообщение
АПД. Короче, я все еще уверен, что ошибка аппаратная.
И называется "bit flipping". Таки да, симптомы посыпавшейся памяти.
Petrolion
24 / 24 / 7
Регистрация: 02.02.2016
Сообщений: 124
07.06.2016, 15:35  [ТС]     Битовые утечки при записи данных на диск #10
Цитата Сообщение от HighPredator Посмотреть сообщение
864050459 - 16777216 = 847273242
ошибка
864050459 - 16777216 = 847273243
Но можно было и не вычислять. Там сразу в HEX видно было отличие на 1 бит в 4 байте.
Постоянную (это именно 24-й бит) добавил, чтобы было видно если ее потеря будет на младших значениях.
Я возможно бы согласился (хотел бы) что ошибка аппаратная, но результат непостоянен. Кроме этого контроллер памяти молчит о целостности данных. Память у меня без коррекции ошибок (CORSAIR CMX8GX3M1A1333C9). Средний ценовой диапазон.
Почему то этот бит, то устанавливается, то сбрасывается...
И на весь файл только 1 ошибочное значение. Была бы линия в памяти битая, я бы получил таких значений вагон и еще тележку при таком кол-ве данных.
Сейчас добавлю к коду еще момент вывода адреса таблицы и операции с ячейками, чтобы понять - это всегда один и тот же адрес или нет.

PS. Почему стресс-тест памяти не нашел проблему?

Добавлено через 4 минуты
Цитата Сообщение от Renji Посмотреть сообщение
И называется "bit flipping". Таки да, симптомы посыпавшейся памяти.
Печально если так... Два года работы псу под хвост. Я не могу доверять данным.
HighPredator
 Аватар для HighPredator
5385 / 1768 / 323
Регистрация: 10.12.2010
Сообщений: 5,233
Записей в блоге: 3
07.06.2016, 15:42     Битовые утечки при записи данных на диск #11
Цитата Сообщение от Petrolion Посмотреть сообщение
ошибка
Спасибо, обновил.

Исправления:
Код
847273243 (10) = 0011 0010 1000 0000 0101 1101 0001 1011 (2)
830496027 (10) = 0011 0001 1000 0000 0101 1101 0001 1011 (2)
Цитата Сообщение от HighPredator Посмотреть сообщение
состояние счетчика i было:
Код
847273242 - 16777216 = 830496026
864050459 - 16777216 = 847273243
847273244 - 16777216 = 830496028
Цитата Сообщение от Petrolion Посмотреть сообщение
Почему стресс-тест памяти не нашел проблему?
С учетом того, насколько низкая частота воспроизводимости, немудрено.

Добавлено через 2 минуты
Цитата Сообщение от Petrolion Посмотреть сообщение
И на весь файл только 1 ошибочное значение
С учетом количества информации в нем, это отличный результат имхо.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
07.06.2016, 17:10     Битовые утечки при записи данных на диск #12
Скорее не состояние счетчика, а то, как сумма записалась в память. Ошибка произошла при записи суммы в память. Причем, вроде как, редких ошибок не избежать даже на самой стабильной системе. Вам придется пользоваться ECC-память.

Добавлено через 1 час 18 минут
Вот интересная статья https://geektimes.ru/post/71748/
Вернее даже заметка, но в ней есть ссылка на полное исследование.
Petrolion
24 / 24 / 7
Регистрация: 02.02.2016
Сообщений: 124
08.06.2016, 11:29  [ТС]     Битовые утечки при записи данных на диск #13
Вчера полдня гонял по памяти memtest86 (старинную версию). Всю ночь работала 4-я версия (свежее у меня не грузится) по памяти всеми тестами и всеми ядрами. В обоих случаях ошибок нет. :-( (Последний скрин в аттаче)
Теоретически отловить мою ошибку должна была еще на тесте #2.
Миниатюры
Битовые утечки при записи данных на диск  
Petrolion
24 / 24 / 7
Регистрация: 02.02.2016
Сообщений: 124
08.06.2016, 11:46  [ТС]     Битовые утечки при записи данных на диск #14
Toshkarik, спасибо за интересную статью. Жаль не указаны производители матерей и памяти.
Но в моем случае ошибку получить можно чаще чем в исследованиях Гугла. В диапазоне 10-12 часов можно отловить 1-2 ошибки.
При этом стресс-тест памяти без системы и приложений, не находит этой ошибки вовсе за то же время.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16943 / 5348 / 329
Регистрация: 30.03.2009
Сообщений: 14,383
Записей в блоге: 26
08.06.2016, 13:43     Битовые утечки при записи данных на диск #15
Цитата Сообщение от Petrolion Посмотреть сообщение
В чем может быть проблема?
Процессор разогнанный?

По описанию не исключаю ошибку процессора. Ради интереса попробуй всё это воспроизвести на другом компе. memtest тут вряд ли что-то покажет
Petrolion
24 / 24 / 7
Регистрация: 02.02.2016
Сообщений: 124
08.06.2016, 14:12  [ТС]     Битовые утечки при записи данных на диск #16
Evg, разгоном процов не занимаюсь принципиально с 2000 года. Чуть завышенный показатель частоты - результат не совсем корректного определения частоты memtest-а. На старте показывает правильную частоту. Турбобуст в биосе отключен.
К сожалению мне не доступен подобный комп. Как то - объемы памяти и винтового пространства.
Цитата Сообщение от Evg Посмотреть сообщение
По описанию не исключаю ошибку процессора.
тестирую память каждым ядром проца поочередно.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16943 / 5348 / 329
Регистрация: 30.03.2009
Сообщений: 14,383
Записей в блоге: 26
08.06.2016, 17:36     Битовые утечки при записи данных на диск #17
Цитата Сообщение от Petrolion Посмотреть сообщение
тестирую память каждым ядром проца поочередно
Тестом для памяти ошибку процессора не найдёшь. Тем более теми, что на голой машине работают (без ОС), а потому такие тесты в принципе не создают условий для процессора, которые есть в нормальной жизни

Цитата Сообщение от Petrolion Посмотреть сообщение
К сожалению мне не доступен подобный комп
А зря попробовать очень надо. Сильное подозрение на ошибку аппаратуры. Т.е. если на полностью другом компе ошибка воспроизведётся, то скорее всего ошибка программная (не исключая ОС)

Добавлено через 2 минуты
Цитата Сообщение от Petrolion Посмотреть сообщение
Evg, разгоном процов не занимаюсь принципиально с 2000 года
Ошибка процессора не обязательно есть результат разгона. Может быть брак или ошибка в целой партии, может быть принципиальная ошибка конкретной модели. Просто разгон сильно увеличивает вероятность воспроизведения подобных ошибок. Про разгон спросил на всякий случай
Petrolion
24 / 24 / 7
Регистрация: 02.02.2016
Сообщений: 124
08.06.2016, 17:48  [ТС]     Битовые утечки при записи данных на диск #18
Evg, в том то и дело, что если проблема в системе или компиляторе то выход очевидный. Переустановка всего или переход на следующую версию MSVCE.
Сейчас экспериментирую с отловом ячейки памяти с багом. Раз замечено что всегда это 24-й бит, то поймав очередной раз ошибку, буду знать ее адрес. И ее адрес в памяти. Можно будет вывести содержимое этой ячейки и попробовать с ним "поиграть" вручную. Код проги тот же с модификацией (выложу позже).
Если отлов 3 и более ошибок даст один и тот же адрес памяти, это уже можно сдвинуть в аппаратную часть. Если адреса разные - ближе к софту.
Renji
1621 / 1069 / 260
Регистрация: 05.06.2014
Сообщений: 3,160
08.06.2016, 18:44     Битовые утечки при записи данных на диск #19
Цитата Сообщение от Petrolion Посмотреть сообщение
Если адреса разные - ближе к софту.
Адреса виртуальные, то есть, при разных запусках программы, могут отображаться на разные места физической памяти.
Кстати, к вопросу о виртуальности - а если своп отключить? Потому что возможна ведь и цепочка "данные отгрузились в своп, диск сбойнул, когда данные загружали обратно фигня вышла".
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.06.2016, 18:52     Битовые утечки при записи данных на диск
Еще ссылки по теме:

C++ Builder Избежать утечки памяти при преобразовании строки в массив символов
C++ Утечки памяти при использовании new/delete для двумерных массивов
Утечки при использовании порта завершения и соккетов C++
Битовые операции с разными типа данных C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Petrolion
24 / 24 / 7
Регистрация: 02.02.2016
Сообщений: 124
08.06.2016, 18:52  [ТС]     Битовые утечки при записи данных на диск #20
Renji, своп отключен. При достаточности памяти - тормоза с ним.
Yandex
Объявления
08.06.2016, 18:52     Битовые утечки при записи данных на диск
Ответ Создать тему
Опции темы

Текущее время: 11:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru