У меня есть демон на основе Python, который предоставляет REST-подобный интерфейс через HTTP для некоторых инструментов командной строки . Общая природа инструмента состоит в том, чтобы принять запрос, выполнить какое-либо действие командной строки, сохранить структурированную структуру данных на диск и вернуть некоторые данные вызывающей стороне. При запуске демона создается вторичный поток, который периодически просматривает эти обработанные данные на диске и выполняет некоторую очистку на основе того, что содержится в данных.
Это прекрасно работает, если диск, на котором находятся обработанные данные, является локальным диском на машине с Linux. Если вы переключаетесь на диск, смонтированный по NFS, демон начинает свою жизнь нормально, но со временем общий ресурс, смонтированный по NFS, «исчезает», и демон больше не может определить, где он находится на диске, с помощью вызовов типа os.getcwd()
. Вы начнете видеть, что он регистрирует такие ошибки, как:
2011-07-13 09:19:36,238 INFO Retrieved submit directory '/tech/condor_logs/submit'
2011-07-13 09:19:36,239 DEBUG CondorAgent.post_submit.do_submit(): handler.path: /condor/submit?queue=Q2%40scheduler
2011-07-13 09:19:36,239 DEBUG CondorAgent.post_submit.do_submit(): submitting from temporary submission directory '/tech/condor_logs/submit/tmpoF8YXk'
2011-07-13 09:19:36,240 ERROR Caught un-handled exception: [Errno 2] No such file or directory
2011-07-13 09:19:36,241 INFO submitter - - [13/Jul/2011 09:19:36] "POST /condor/submit?queue=Q2%40scheduler HTTP/1.1" 500 -
Необработанное исключение разрешается тем, что демон больше не может видеть диск. Любые попытки определить текущий рабочий каталог демона с помощью os.getcwd()
на этом этапе потерпят неудачу. Даже попытка перейти в корень монтирования NFS /tech
потерпит неудачу. Все это время методы logger.logging.*
радостно записывают журналы и отладочные сообщения в файл журнала, расположенный на общем ресурсе, подключенном к NFS, по адресу /tech/condor_logs/logs/CondorAgentLog
.
Диск определенно все еще доступен. Существуют и другие демоны на основе C++, выполняющие чтение и запись с гораздо более высокой частотой в этом общем ресурсе по сравнению с демоном на основе python.
Я зашел в тупик, решая эту проблему. Поскольку он работает на локальном диске, общая структура кода должна быть хорошей, верно? Что-то несовместимо с общими ресурсами NFS и моим кодом, но я не могу сказать, что это может быть.
Есть ли какие-то особые соображения, которые необходимо учитывать при работе с демоном Python, работающим в течение длительного времени, который будет часто выполнять чтение и запись в общий файловый ресурс, подключенный к NFS?
Если кто-то хочет увидеть код, часть, которая обрабатывает HTTP-запрос и записывает маринованный объект на диск, находится в github здесь. И часть, которую подпоток использует для периодической очистки данных с диска путем чтения маринованных объектов, — это здесь.