Запрос на ускорение interprocess :: file_lock в NFS - PullRequest
0 голосов
/ 20 июня 2020

У нас есть приложение, которое пользователь может запустить для генерации данных по указанному пользователем пути. Эти уникальные выходные данные генерируются относительно одного уникального набора входных данных - эти входные данные предоставляются пользователем.

Когда мы первоначально разрабатывали приложение, мы никогда не ожидали, что количество уникальных входных наборов данных будет быть большим (из-за характера приложения). Мы ожидали, что количество уникальных входных наборов данных может быть порядка 10, в то время как у одного пользователя это число равно 1000. Итак, этот конкретный пользователь запустил 1000 заданий нашего приложения в сетке и все записывают данные по одному и тому же пути. Обратите внимание: эти 1000 заданий не запускаются из нашего приложения, а скорее он порождал 1000 процессов нашего приложения на разных машинах.

Теперь это привело к некоторому конфликту и потере данных. , Планирую синхронизацию с помощью boost :: interprocess. Это то, что я планирую:

// usual processing of input data ...

boost::filesystem::path reportLockFilePath(boost::filesystem::system_complete(userDir));
rerportLockFilePath.append("report.lock");

// if lock file does not exist, create one
if (!boost::filesystem::exists(reportLockFilePath) {
    boost::interprocess::named_mutex reportLockMutex(boost::interprocess::open_or_create, "report_mutex");
    boost::interprocess::scoped_lock< boost::interprocess::named_mutex > lock(reportLockMutex);

    std::ofstream lockStrm(reportLockFilePath.string().c_str());
    lockStrm << "## report lock file ##" << std::endl;
    lockStrm.flush();
}

 boost::interprocess::file_lock reportFileLock(reportLockFilePath.string().c_str());
 boost::interprocess::scoped_lock< boost::interprocess::file_lock > lock(reportFileLock);

 // usual reporting code that we already have ...

Теперь вопросов -

  • Если это правильная синхронизация для решаемой проблемы
  • Если эта схема синхронизации будет работать, когда задания находятся на разных машинах и путь указан в NFS
  • Если на NFS et c., Это не сработает, каковы альтернативы C ++? Я предпочитаю избегать функций нижнего уровня C, чтобы избежать состояния гонки из-за блокировки, когда один экземпляр выполнения дает сбой и т. Д. c.

1 Ответ

0 голосов
/ 19 июля 2020

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

std::ofstream lockStrm(reportLockFilePath.string().c_str(), std::ios_base::app);
    

И это сработало, по крайней мере, при нашем внутреннем тестировании.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...