Производительность при вызове fsync для нескольких файлов против одного файла

У меня есть несколько потоков, каждый из которых принимает запросы, выполняет некоторую обработку, сохраняет результат в журнале фиксации и возвращает результаты. Чтобы гарантировать потерю данных не более чем на x секунд, этот журнал фиксации должен быть fsync'd каждые x секунд.

Я хотел бы избежать синхронизации между потоками, а это означает, что каждый из них должен иметь свой собственный журнал фиксации, а не общий журнал. Можно ли регулярно выполнять fsync для всех этих различных журналов фиксации?

Это в Linux, ext4 (или ext3)

(Примечание: из-за природы кода даже во время обычной обработки потоки должны повторно считывать некоторые из своих недавних данных из журнала фиксации (но никогда другие потоки не фиксируют данные журнала), поэтому я считаю, что это было бы непрактично для использовать общий журнал, так как многие темы должны читать / писать в него)

1 ответ

Если вам нужно, чтобы сброс происходил только каждые несколько секунд, вам нужен вообще fsync()? Т.е. ОС должна делать это для вас достаточно регулярно (если только система не находится под большой нагрузкой и не хватает дискового ввода-вывода).

В противном случае ваши темы будут делать что-то вроде:

if (high_resolution_time() % n == 0) {
  fsync();
}

Где n - это значение, которое будет, например, 3, если high_resolution_time() вернул возвращаемое время Unix EPOCH (выраженное в секундах). Заставил бы поток очищать файл каждые 3 секунды.

Проблема, конечно, заключается в том, что вам нужно гораздо более высокое разрешение часов, чтобы избежать того, что поток, который пропускает этот фрагмент кода несколько раз в секунду, не очищает свой файл несколько раз подряд. Я не знаю, какой язык программирования вы используете, но в C на Linux вы можете использовать gettimeofday:

struct timeval tv;
gettimeofday(&tv, null);
double x = (double)tv.tv_sec * (double)1000000 + (double)tv.tv_usec; 
if (x % 3000000 == 0) {  // fsync every 3 seconds
  fsync();
}
Другие вопросы по тегам