Можно ли сохранить стабильное время записи, когда байты записываются со смещением 0 в файл? - PullRequest
1 голос
/ 07 июля 2019

ядро ​​linux: 5.1.15 glibc: 2.29 g ++: 9.1.1 std: c ++ 17 -быстрый ext4fs HDD: Seagate ST1000LM014 1 ТБ SSHD 2.5 "

std::array<int, 10000> state;

Я пишу nbrmsgs ints из состояния в файл, открытый следующим образом:

#include <fcntl.h>
#include <unistd.h>
persistfd=open("persist", O_CREAT | O_WRONLY | O_SYNC, S_IRUSR | S_IWUSR);

с вызовом:

pwrite(persistfd, state.data(), nbrmsgs*sizeof(int), 0)

Все это использует синхронную запись. Требуется обеспечить запись данныхперед продолжением (т. е. если происходит сбой процесса после записи, данные находятся в файле, но если происходит сбой уровня ядра или аппаратного уровня, это не моя проблема)

Ранее я использовал write вместо pwrite, без указания смещения. Таким образом, это добавляло байты в конец файла.

Я следил за истекшим временем записи, и на моей платформе оно было довольно стабильным, около 1 микро,до тех пор, пока файл не достигнет определенного размера, а затем истекшее время не начнет расти, по-видимому, из-за всего, что связано с перемещением inode и всеми задачами ниже вызова библиотеки C.)

Я изменил запись на pwrite, со смещением 0, а размер файла остается постоянным.Тем не менее, я все еще вижу, как истекшее время начинает расти после ряда писем.

  1. Неправильно ли для меня ожидать, что истекшее время должно оставаться стабильным, когда файл не "растет"?
  2. Возможны ли пользовательские настройки на ext4fs или на параметры ядра, чтобы повысить вероятность того, что запись в 0 компенсирует тот же размер данных, а файл не увеличивается, а истекшее время остается стабильным?

1 Ответ

2 голосов
/ 07 июля 2019

Итак, вы говорите, что хотите стабильно.Нет, ты неВы только думаете, что хотите, чтобы он был стабильным.

Чтобы получить его стабильным:

1) Получите выделенный SSD

2) Напишите свои вещи с помощью write()

3) fflush() перед каждым измерением.Это ведет себя лучше, чем O_SYNC в случае, когда ОС приходится разделять запись из-за нехватки памяти.Использование O_DIRECT будет выглядеть стабильно, но на самом деле это не так.

Нет модели, в которой стабильные времена имеют смысл, кроме циклического сброса на диск.Это тоже самая медленная модель.Решите, что вы хотите.

В качестве альтернативы, если вас вообще не волнуют сбои, используйте ОЗУ oldschool.

# mknod -m 660 /dev/ram0 b 1 0 сделает выделенный оперативный диск в ram0, который вы можетекаракули на потом.Вам все еще нужно открыть с O_DIRECT, чтобы это было стабильно.

...