Утечка дескриптора файла (возможно) в библиотеке C создает проблемы с NFS (+ python, но это случайно)

вот довольно крутая проблема.

У меня есть скрипт Python (основной), который вызывает модуль Python (foo.py), который, в свою очередь, вызывает другой модуль Python (barwrapper.py), который использует LoadLibrary для динамического открытия и доступа к библиотеке libbar.so.

libbar и вся остальная цепочка открывают и создают файлы для выполнения своей задачи. Проблема возникает, когда мы запускаем rmtree в основном скрипте Python, чтобы избавиться от временного каталога, созданного импортированными модулями. rmtree вызывается в конце скрипта, непосредственно перед выходом. Вызов завершается неудачно, потому что каталог содержит .nfs-whatever скрытых файлов, которые, как я полагаю, являются удаленными файлами. Эти файлы, по-видимому, остаются открытыми в коде, что вынуждает nfs перемещать их в эти файлы .nfs-whatever до тех пор, пока дескриптор файла не будет освобожден. Эта ситуация не возникает в других файловых системах, потому что файлы, связанные с удерживаемыми дескрипторами, фактически удаляются, но остаются доступными для ядра до тех пор, пока дескриптор не будет закрыт.

Мы сильно подозреваем, что библиотека .so пропускает файловые дескрипторы, и эти незакрытые файлы портят вечеринку rmtree во время очистки. Я думал о выгрузке файла .so в barwrapper, но, видимо, нет способа сделать это, и я не уверен, действительно ли dynloader удалит библиотеку из пространства процесса и закроет дескрипторы или просто пометит ее как незагруженную и все, ждет замены на другой хлам, но с просочившимися дескрипторами.

Я действительно не могу придумать другие обходные пути решения проблемы (кроме исправления утечек, чего мы не хотели бы делать, поскольку это сторонняя библиотека). Понятно, что это происходит только на nfs. У вас есть идеи, что мы можем попытаться исправить это?


person Stefano Borini    schedule 18.05.2011    source источник


Ответы (2)


Хорошим решением является устранение утечки дескрипторов, но если вы не уверены в том, кто делает утечку, возможно, strace поможет вам локализовать утечку и сообщить об ошибке мейнтейнерам сторонней библиотеки (или лучше, если это библиотека с открытым исходным кодом, попробуйте отправить патч ;)).

С другой стороны, возможно, umount/mount на разделе nfs может помочь принудительно закрыть ручки.

person Cédric Julien    schedule 18.05.2011
comment
Я не могу размонтировать домашний раздел кластера. В любом случае файлы .nfs не являются постоянными. Они исчезают, как только мое приложение завершается, когда освобождаются файловые дескрипторы и ядро ​​может освободить файл (и, полагаю, синхронизировать статус nfs). - person Stefano Borini; 19.05.2011

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

person Aleksi Torhamo    schedule 19.05.2011