Вопрос или проблема
Программы на базе GNOME всегда запускаются примерно за 30 секунд по SSH. Даже самые простые, такие как gnome-calculator
. После запуска эти программы работают абсолютно нормально. Я начинаю сессию SSH, используя команду ssh <user>@<host> -YC
. Я пытался проверить использование процессора в этот период ожидания, но ничего необычного не было. Потребление сетевой полосы также не кажется чрезмерным (в пределах 0,2 до 2 KiB/s).
Я часто использую свой компьютер с Ubuntu 19.10 по SSH и это довольно серьезная проблема для меня. Я замечал эту проблему и в более ранних версиях Ubuntu.
ИСПРАВЛЕНИЕ: Я выяснил, что задержка возникает при вызове g_application_run()
. Запуск strace
объясняет это время задержки. Последний системный вызов перед этой задержкой – это poll([{fd=11, events=POLLIN}], 1, 25000)
. 25000 – это тайм-аут в миллисекундах. Все затронутые программы зависают на этом конкретном системном вызове. Файловый дескриптор 11 создается с помощью eventfd2(0, EFD_CLOEXEC|EFD_NONBLOCK)
. Все это означает, что программа ждет какого-то события, которое никогда не происходит. Но что это может быть и что может его вызывать?
Я полагаю, что это связано с тем, что переменная окружения DISPLAY не передается локальной службе под названием “xdg-desktop-portal-gtk”. Если она не удается запуститься, каждое приложение GNOME попытается запустить ее во время старта, будет ждать, пока она запустится, а затем тайм-аут примерно через 25 секунд, когда она не удается.
Вы можете исправить это вручную, сделав это после входа в систему. Сначала обновите окружение для процессов D-Bus:
$ dbus-update-activation-environment --systemd DBUS_SESSION_BUS_ADDRESS DISPLAY XAUTHORITY
Затем запустите службу:
$ systemctl --user start xdg-desktop-portal-gtk
Теперь запуск должен быть снова быстрым.
Если кто-то знает лучший/самый изящный способ сделать это автоматически для каждого пользователя, входящего в удаленную систему, я бы хотел об этом узнать.
30 секунд звучит очень похоже на тайм-аут DNS.
Обновите вопрос с:
time ssh localhost echo
time ssh -YC user@remote echo
time ssh -YC localhost gnome-calculator
Мое предположение, что remote
не может выполнить обратный поиск вашего IP-адреса. Попробуйте добавить это в server:/etc/hosts
i.p.n.o myclient
где i.p.n.o – это IP-адрес вашего клиента.
Это заставляет задуматься (с иронией), почему программы GNOME не выполняют
systemctl --user import-environment --all
и/или
dbus-update-activation-environment --all
для вас…
Я помню, что эта ерунда была проблемой в дни GNOME Bonobo около 20 лет назад, когда я безумно ломал голову, почему мои программы не загружаются через удаленную сессию SSH -X
, только чтобы выяснить, когда я вернулся домой, что они все были загружены на моем рабочем столе.
Теперь та же ошибка совершается снова.
Возможно, это лучшее решение, предоставляющее загрузчик dbus для каждого входа:
https://unix.stackexchange.com/a/346092/139357
Я добавил следующую строку в ~/.profile. Это устанавливает переменную DBUS_SESSION_BUS_ADDRESS. Это решило проблему для меня.
eval `dbus-launch --sh-syntax`
Ответ или решение
При запуске программ на базе GNOME через SSH обычно возникает задержка около 30 секунд. Эта проблема часто связана с неправильной конфигурацией, которая мешает приложениям корректно взаимодействовать с параметрами окружения и сервисами. В данном ответе мы постараемся подробно разобраться в причинах этой задержки и возможных решениях.
Основная Проблема
Как указано в приведённом вами описании, основное затруднение возникает во время выполнения вызова g_application_run()
, когда происходит системный вызов poll([{fd=11, events=POLLIN}], 1, 25000)
. Это означает, что программа пытается дождаться события, которое никогда не происходит, и, как следствие, время ожидания истекает. Этот конкретный файл-дескриптор создаётся через eventfd2(0, EFD_CLOEXEC|EFD_NONBLOCK)
, что указывает на то, что приложения ждут события от сервиса, который не работает, или от неправильно настроенного окружения.
Возможные Причины
-
Проблемы с D-Bus и xdg-desktop-portal-gtk: Приложения GNOME зависят от правильной настройки D-Bus для активации сессий. Если переменные окружения, такие как
DISPLAY
, не были корректно инициализированы, это может привести к тому, что сервисxdg-desktop-portal-gtk
не стартует. В результате все запущенные программы ожидают его и в случае неудачи терпят таймаут. -
Настройки сети и DNS: Задержка может быть связана и с проблемами в сетевой конфигурации, такими как невозможность разрешения имени хоста или IP-адреса. Если SSH-сервер не может выполнить обратный DNS-запрос для клиента, это также может вызывать подобные задержки.
-
Неправильные настройки окружения: Отсутствие необходимых переменных окружения, таких как
DBUS_SESSION_BUS_ADDRESS
,DISPLAY
иXAUTHORITY
, может вызвать долгие задержки при запуске приложений. Программы GNOME ожидают, что эти переменные будут установлены, и если они отсутствуют, это приводит к временным задержкам.
Решения
-
Инициализация переменных окружения: После входа в систему через SSH вы можете вручную инициализировать переменные окружения для D-Bus:
dbus-update-activation-environment --systemd DBUS_SESSION_BUS_ADDRESS DISPLAY XAUTHORITY systemctl --user start xdg-desktop-portal-gtk
-
Автоматизация процесса: Чтобы избежать повторного выполнения этих команд при каждом входе, можно добавить следующее в файл
~/.profile
:eval `dbus-launch --sh-syntax`
-
Настройка файла hosts: Если задержка связана с проблемами с DNS, добавьте ваш IP-адрес в файл
/etc/hosts
на сервере:i.p.n.o myclient
-
Использование системных сервисов: Рассмотрите возможность использования
systemctl --user import-environment --all
, чтобы автоматически импортировать все переменные окружения для пользователя.
Заключение
Проблемы с задержкой запуска программ GNOME при работе через SSH могут быть вызваны множеством факторов, начиная от неправильной настройки D-Bus и заканчивая проблемами с разрешением DNS. Следуя предложенным шагам, вы сможете значительно сократить время ожидания и улучшить опыт работы с приложениями на вашей системе. Если вам необходимо более глубокое расследование проблемы или у вас есть дополнительные вопросы, не стесняйтесь обращаться за помощью.