Вопрос или проблема
У меня есть 2 сервера AIX.
сервер A: монтирует NFS с nfs_server_A в /some_location/
сервер B: монтирует NFS с nfs_server_B в /some_location/
Оба используют одни и те же параметры: "bg,hard,rsize=262144,timeo=600,vers=3,proto=tcp"
Оба NFS-сервера идентичны (версия, установка и т.д.)
Оба сервера A и B "идентичны" (одна и та же ОС, одинаковые уровни обновлений, один и тот же метод установки)
Различие: смонтированная ФС на сервере B имеет больший размер
bash одинаковой версии на обоих серверах, из одних и тех же пакетов, set -o отображает ту же информацию (на обоих "noglob" выключен) и т.д.
Что меня беспокоит:
- на сервере B: когда я нахожусь где-то в /some_location (= на смонтированном NFS, в любой директории и с минимум 1 файлом или с несколькими сотнями):
ls *
,echo *
,echo foo?bar.txt
: всё работает, как в ksh, так и в bash.
- на сервере A: когда я нахожусь где-то в /some_location (= на смонтированном NFS, в любой директории и с минимум 1 файлом или с несколькими сотнями):
ls *
,echo *
,echo foo?bar.txt
: работает только в ksh и не работает в bash- в bash для “ls *” отображается:
ls: 0653-341 Файл * не существует
(то есть, bash не смог расширить глоб)- в любой директории вне смонтированных NFS: глобы bash работают идеально
Я попробовал: ( cd /some_location && truss bash -c 'ls ./somefile*' ) > truss_info 2>&1
на обоих:
Кажется, единственная разница видна сразу после очень раннего успешного statx("./" ...) =0
:
- на сервере A есть
getdirent(3, ...) Err#127 EOVERFLOW
- на сервере B есть
getdirent(3, ...) = 892
Я в недоумении, в чем может быть разница (такая же ОС, те же уровни обновлений, одна и та же версия и пакет bash, одинаковые NFS, одна и та же установка NFS-серверов) (единственное отличие, которое я смог найти: ФС больше на сервере B, но именно этот сервер работает…, на сервере A происходит переполнение при чтении getdirent() с меньшей ФС?), и был бы признателен за советы, на что обратить внимание.
Ответ или решение
Пользователю сталкиваются с проблемой, когда глобальные шаблоны bash на сервере A не работают должным образом в NFS-каталоге, в то время как на сервере B все в порядке. При этом система и стороннее ПО на обоих серверах идентичны. Основная проблема проявляется в том, что bash не может развернуть глобальные шаблоны на сервере A, сообщая об отсутствии файлов, даже если они существуют. Исследуем возможные причины и решения этой проблемы.
Форест: Объяснение текущей ситуации
F (The Feeling) – Ваши переживания
Несмотря на одинаковые условия среды и конфигурации, вы теряете временные ресурсы из-за неожиданной проблемы. Это поражает доверие к системам и их надежности, особенно при работе с идентичными серверами. Это разочаровывающее ограничение продуктивности требует понятного и действенного решения.
O (The Opportunity) – Ваша возможность
Эту проблему можно использовать как возможность углубленного изучения взаимодействия файловых систем и поведения bash при работе с NFS. Успешное решение укрепит уверенность в ваших навыках и повысит надежность вашей инфраструктуры.
Рекомендации по устранению проблемы
R (The Resolution) – Решение
-
Размер файловой системы и размер inode: Разные размеры файловых систем могут влиять на количество доступных inode, что может вызвать переполнение в некоторых системных вызовах. Убедитесь, что inode имеют одинаковую структуру и что нет недостатка в них.
-
Версия glibc и параметры компиляции: Время от времени различия в поведении могут возникать из-за различных версий библиотек или параметров компиляции. Проверьте, одинаковы ли версии версий libc и параметры на обоих серверах.
-
NFS-протокол и параметры: Ошибка
getdirent
связана с NFS. Проверьте, возможно, проблема в корректности монтирования или использованием другого подпротокола. Хотя параметры монтирования выглядят одинаково, стоит убедиться, что все тонкие настройки и ограничения сервера (например, максимальный размер файлов, поддерживаемый в NFS) аналогичны. -
Системные пределы и ulimit: Убедитесь, что системные параметры, такие как ulimit, выставлены корректно и однородно на обоих серверах.
-
Отладка через dtrace или аналогичные утилиты: Для лучшего понимания выполнения системных вызовов используйте dtrace или аналогичные возможности для более глубокой диагностики.
E (The Example) – Пример правильной работы
Постоянное тестирование различных аспектов системной конфигурации, процессов монтирования и сетевых коммуникаций позволит обеспечить гладкую и стабильную работу. Попробуйте создать ограниченные и управляемые тестовые кейсы с меньшим объемом данных, что может облегчить выявление основного источника проблемы.
S (Step Forward) – Следующий шаг
Проведите аудит вышеуказанных аспектов и начните тестирование поочередно. Ваш финальный шаг — сравнить результаты с обеими серверами после потенциальных изменений, особенно в конфигурации NFS и bash. Это обеспечит гладкую работу и позволит устранить любые идентифицированные проблемы.
Заключение
Понимание того, как системное окружение и конфигурационные нюансы могут повлиять на интерпретатор команд shell, является ключевым шагом к устойчивой работе серверов. Решая эту проблему, вы не только выстраиваете эффективные рабочие процессы, но и закрепляете свою экспертность в управлении инфраструктурой.
Внимательное изучение этих рекомендаций поможет устранить вашу текущую проблему и предотвратить аналогичные сложности в будущем.