Я использую ядро Linux 2.6.36 и вижу несколько случайных ошибок. Вещи как
ls: error while loading shared libraries: libpthread.so.0: cannot open shared object file: Error 23
Да, моя система не может последовательно запускать команду ls. :(
Я отмечаю несколько ошибок в моем выводе dmesg:
# dmesg | tail
[2808967.543203] EXT4-fs (sda3): re-mounted. Opts: (null)
[2837776.220605] xv[14450] general protection ip:7f20c20c6ac6 sp:7fff3641b368 error:0 in libpng14.so.14.4.0[7f20c20a9000+29000]
[4931344.685302] EXT4-fs (md16): re-mounted. Opts: (null)
[4982666.631444] VFS: file-max limit 1231582 reached
[4982666.764240] VFS: file-max limit 1231582 reached
[4982767.360574] VFS: file-max limit 1231582 reached
[4982901.904628] VFS: file-max limit 1231582 reached
[4982964.930556] VFS: file-max limit 1231582 reached
[4982966.352170] VFS: file-max limit 1231582 reached
[4982966.649195] top[31095]: segfault at 14 ip 00007fd6ace42700 sp 00007fff20746530 error 6 in libproc-3.2.8.so[7fd6ace3b000+e000]
Очевидно, что ошибки file-max выглядят подозрительно, поскольку они сгруппированы вместе и являются недавними.
# cat /proc/sys/fs/file-max
1231582
# cat /proc/sys/fs/file-nr
1231712 0 1231582
Мне это тоже кажется немного странным, но дело в том, что в этой системе у меня нет открытых 1,2 миллиона файлов. Я единственный использую его, и он не виден никому за пределами локальной сети.
# lsof | wc
16046 148253 1882901
# ps -ef | wc
574 6104 44260
Я видел документацию, в которой говорилось:
файл-макс и номер-файла:
Ядро выделяет дескрипторы файлов динамически, но пока не освобождает их снова.
Значение в file-max обозначает максимальное количество дескрипторов файлов, которые ядро Linux выделяет. Когда вы получаете много сообщений об ошибках, связанных с нехваткой дескрипторов файлов, вы можете увеличить этот предел.
Исторически три значения в file-nr обозначали количество выделенных файловых дескрипторов, количество выделенных, но неиспользуемых файловых дескрипторов и максимальное количество файловых дескрипторов. Linux 2.6 всегда сообщает 0 как количество свободных дескрипторов файлов - это не ошибка, это просто означает, что количество выделенных дескрипторов файлов точно совпадает с количеством используемых дескрипторов файлов.
Попытки выделить больше файловых дескрипторов, чем файл-макс, сообщаются с помощью printk, ищите «VFS: достигнут предел максимального файла».
Мое первое прочтение этого состоит в том, что ядро в основном имеет встроенную утечку файлового дескриптора, но мне очень трудно в это поверить. Это означало бы, что любую активно используемую систему необходимо периодически перезагружать, чтобы освободить файловые дескрипторы. Как я уже сказал, я не могу поверить, что это будет правдой, поскольку для меня нормально, когда системы Linux работают месяцами (даже годами). С другой стороны, я также не могу поверить, что моя почти бездействующая система содержит более миллиона открытых файлов.
Есть ли у кого-нибудь идеи по поводу исправлений или дальнейшей диагностики? Я мог бы, конечно, просто перезагрузить систему, но я не хочу, чтобы это повторялось каждые несколько недель. В качестве временной меры я ушел из Firefox, на который приходилось почти 2000 строк вывода lsof (!), Хотя у меня было открыто только одно окно, и теперь я могу снова запустить ls, но я сомневаюсь, что это исправит проблема надолго. (править: Ой, заговорил слишком рано. К тому времени, когда я закончил вводить этот вопрос, симптом вернулся / вернулся)
Заранее благодарю за любую помощь.
И еще одно обновление: моя система была практически непригодна для использования, поэтому я решил, что у меня нет другого выхода, кроме как перезагрузиться. Но прежде, чем я это сделал, я осторожно заканчивал по одному процессу за раз, проверяя /proc/sys/fs/file-nr
после каждого прекращения. Я обнаружил, что, как и ожидалось, количество открытых файлов постепенно уменьшалось по мере того, как я закрывал их. К сожалению, большого эффекта не было. Да, мне удалось очистить 5000-10000 открытых файлов, но их все еще оставалось более 1,2 миллиона. Я закрыл почти все. Все интерактивные оболочки, за исключением одного ssh, который я оставил открытым, чтобы завершить закрытие, httpd и даже службы nfs. В основном все в таблице процессов не было процессом ядра, и ужасающее количество файлов, по-видимому, оставалось открытым.
После перезагрузки обнаружил, что /proc/sys/fs/file-nr
показал около 2000 открытых файлов, что намного разумнее. Запуск двух сеансов Xvnc как обычно вместе с дюжиной или около того окон мониторинга, которые я люблю держать открытыми, в результате увеличил общее количество файлов примерно до 4000. Я, конечно, не вижу в этом ничего плохого, но я, очевидно, не смог определить основную причину.
Я все еще ищу идеи, так как определенно ожидаю, что это повторится снова.
И еще одно обновление на следующий день:
Я внимательно следил за системой и обнаружил, что /proc/sys/fs/file-nr
показал рост около 900 открытых файлов в час. Я выключил единственный клиент NFS в системе на ночь, и рост остановился. Имейте в виду, это не высвободило ресурсы, но, по крайней мере, перестало потреблять больше. Это известная ошибка NFS? Я верну клиент NFS сегодня в онлайн, и я сузил круг вопросов.
Если кто-то знаком с таким поведением, смело вставляйте «Да, у NFS4 есть эта проблема, вернитесь к NFS3» или что-то в этом роде.
После небольшого дополнительного тестирования я считаю, что это ошибка сервера NFS. Когда процесс на клиенте NFS устанавливает блокировку записи в файл, сервер резервирует дескриптор открытого файла (это может быть неправильная терминология - приношу свои извинения любым настоящим гуру ядра, читающим это). Вероятно, это было бы нормально, если бы сервер освободил дескриптор при снятии блокировки, но, по-видимому, это не так.
Моя первоначальная проблема возникла с rrdtool. rrdtool открывает файл для чтения / записи, блокирует файл для записи, вносит изменения и завершает работу. Каждый раз, когда я запускаю rrdtool, количество открытых файлов на сервере увеличивается на один. (Непонятная деталь - сервер фактически выделяет фрагменты по 32, так что это больше похоже на «32 запуска создают 32 открытых файловых дескриптора», но в конечном итоге это несущественная деталь)
Я написал минимальную тестовую программу, чтобы проверить это поведение. Действительно, для этого достаточно открыть файл, заблокировать его, а затем выйти. Явное снятие блокировки перед выходом никак не помогает. Открытие файла без блокировки не вызвать проблему.
Пока я так и не нашел способа освободить ресурсы на сервере, кроме перезагрузки. Как отмечалось выше, перезапуска службы NFS недостаточно.
Я еще не тестировал NFS версии 3. Возможно, он работает лучше.
В любом случае, спасибо за попытку. Надеюсь, мой опыт может помочь кому-то еще в будущем.
Последнее обновление: Дж. Брюс Филдс, один из разработчиков NFSv4, подтвердил, что это ошибка, и сказал, что она ограничена NFSv4. Видимо, я был первым, кто сообщил об этом. Он надеется получить патч в ближайшее время.
Помните, дети: когда вы обнаружите ошибку, найдите подходящее место, чтобы сообщить о ней, и велика вероятность, что она будет исправлена. Ура открытым исходным кодом. :-)
Я выключил единственный клиент NFS в системе на ночь, и рост остановился. Имейте в виду, это не высвободило ресурсы, но, по крайней мере, перестало потреблять больше.
Видеть Использование NFS считается вредным, в частности, пункт III.B. Когда ваш клиент NFS становится недоступным, его блокировки не снимаются, поэтому количество открытых файлов не уменьшается. Если вы отключите сервер NFS (или, точнее, демон блокировки), вы увидите, что количество открытых файлов уменьшилось.
Я думаю, вы можете смело приписать проблему тому, что делает клиент NFS, чего вы не указали в вопросе выше, насколько я могу судить.
В error loading shared libraries
ошибки возникают из-за того, что вы достигли максимального количества файлов, которые можно открыть; когда ты бежишь ls
, ядро пытается открыть библиотеку ls
динамически связан с; очевидно, что это не удается, поскольку вы достигли максимального количества открытых файлов для этой файловой системы, отсюда и ошибка.
Ваш клиент открывает 900 файлов в час. Это ведь не Mac, на котором работает Spotlight с экспортом NFS?
У меня такие же проблемы. Установлен кластер HA-серверов, который мы используем как центральное сетевое хранилище. В этом кластере DRBD работает сервер NFS4.
Каждый час мы генерируем тысячи небольших файлов данных и храним их на этом сервере NFS4.
С момента запуска сервера NFS4 проходит около 30 дней, пока fs.file-nr не достигнет предела в 1,2 млн файлов, а затем в течение 24 часов произойдет сбой всей машины.
Только сейчас, через два часа после того, как машина резервного копирования HA взяла на себя управление после сбоя, это показывает
fs.file-nr = 19552 0 488906
увеличивается на +3000 за 20 минут.
Резервная машина высокой доступности находилась в режиме ожидания в течение 30 дней, и у нее все время было 580 0 488906. Изменилось только то, что сервер NFS4 был запущен.
Был бы очень рад, если бы для этого было решение ..
Я запускаю MDV 2010 с настроенным ядром x64 2.6.37 RC3