Анализируйте производительность запуска Linux

Мы предоставляем услуги удаленного администрирования серверов

Анализируйте производительность запуска Linux

Поделиться

Частью работы системного администратора является анализ производительности систем, а также поиск и устранение проблем, которые вызывают низкую производительность и длительное время запуска. Системным администраторам также необходимо проверить другие аспекты конфигурации и использования systemd.

Система инициализации systemd предоставляет systemd-analyzeинструмент, который может помочь обнаружить проблемы с производительностью и другую важную информацию о systemd. В предыдущей статье « Анализ системного календаря иsystemd-analyze временных интервалов» я использовал для анализа временных меток и временных интервалов в системных таймерах, но у этого инструмента есть много других применений, некоторые из которых я рассмотрю в этой статье.

Обзор запуска

Последовательность запуска Linux — хорошее место для начала изучения, поскольку многие systemd-analyzeфункции инструмента предназначены для запуска. Но сначала важно понять разницу между загрузкой и запуском. Последовательность загрузки начинается с самотестирования BIOS при включении питания (POST) и заканчивается, когда ядро ​​завершает загрузку и берет на себя управление хост-системой, что является началом запуска и моментом начала журнала systemd.

Результаты, которые я покажу ниже, получены с моей основной рабочей станции, что гораздо интереснее, чем результаты виртуальной машины. Эта рабочая станция состоит из материнской платы ASUS TUF X299 Mark 2, процессора Intel i9-7960X с 16 ядрами и 32 процессорами (потоков) и 64 ГБ оперативной памяти. Некоторые из приведенных ниже команд могут быть выполнены пользователем без полномочий root, но в этой статье я буду использовать root, чтобы не переключаться между пользователями.

Есть несколько вариантов проверки последовательности запуска. В простейшей форме systemd-analyzeкоманды отображается обзор количества времени, затраченного на каждый из основных разделов запуска, запуска, загрузки и запуска ядра initrd(т. Е. Начальный RAM-диск, временный образ системы, который используется для инициализации некоторого оборудования и монтирования /[корень] файловая система), и в пользовательском пространстве (где все программы и демоны должны принести хозяин до работоспособного состояния загружаются). Если команде не передана подкоманда, systemd-analyze timeподразумевается:

[root@admins24 ~]$ systemd-analyze
Startup finished in 53.921s (firmware) + 2.643s (loader) + 2.236s (kernel) + 4.348s (initrd) + 10.082s (userspace) = 1min 13.233s
graphical.target reached after 10.071s in userspace
[root@admins24 ~]#

Наиболее примечательными данными в этих выходных данных является количество времени, проведенное в прошивке (BIOS): почти 54 секунды. Это невероятное количество времени, и ни одна из других моих физических систем не занимает столько времени, чтобы пройти через BIOS.

Мой ноутбук System76 Oryx Pro проводит в BIOS всего 8,506 секунд, а все мои домашние системы — чуть меньше 10 секунд. После нескольких поисков в Интернете я обнаружил, что эта материнская плата известна чрезмерно долгим временем загрузки BIOS. Моя материнская плата никогда не «просто загружается». Он всегда зависает, и мне нужно выполнить цикл выключения / включения, а затем BIOS запускается с ошибкой, и мне нужно нажать F1, чтобы войти в конфигурацию BIOS, откуда я могу выбрать загрузочный диск и завершить загрузку. Вот откуда приходит дополнительное время.

Не все хосты показывают данные прошивки. Мои ненаучные эксперименты заставили меня поверить, что эти данные показаны только для процессоров Intel 9 поколения или выше. Но это могло быть неверно.

Этот обзор процесса загрузки при загрузке интересен и предоставляет хорошую (хотя и ограниченную) информацию, но о запуске доступно гораздо больше информации, о чем я расскажу ниже.

Назначение вины

Вы можете использовать его, systemd-analyze blameчтобы узнать, какие модули systemd инициализируются больше всего. Результаты отображаются в порядке времени, необходимого для инициализации, от наибольшего к наименьшему:

[root@admins24 ~]$ systemd-analyze blame                                                                        
       5.417s NetworkManager-wait-online.service                                                      
       3.423s dracut-initqueue.service                                                                
       2.715s systemd-udev-settle.service                                                              
       2.519s fstrim.service                                                                          
       1.275s udisks2.service                                                                          
       1.271s smartd.service                                                                          
        996ms upower.service                                                                          
        637ms lvm2-monitor.service                                                                    
        533ms lvm2-pvscan@8:17.service                                                                
        520ms dmraid-activation.service                                                                
        460ms vboxdrv.service                                                                          
        396ms initrd-switch-root.service
<SNIP – removed lots of entries with increasingly small times>

Поскольку многие из этих сервисов запускаются параллельно, эти числа могут в сумме значительно превышать сумму, указанную systemd-analyze timeдля всего, что указано после BIOS. Все это небольшие цифры, поэтому я не могу найти здесь значительной экономии.

Данные этой команды могут дать представление о том, какие службы вы могли бы рассмотреть для улучшения времени загрузки. Неиспользуемые службы можно отключить. Похоже, что нет ни одной службы, которая занимала бы слишком много времени во время этой последовательности запуска. Вы можете увидеть разные результаты для каждой загрузки и запуска.

Критические цепи

Как и критический путь в управлении проектами, критическая цепочка показывает критическую по времени цепочку событий, которые происходят во время запуска. Это модули systemd, на которые следует обратить внимание, если запуск происходит медленно, поскольку именно они могут вызывать задержки. Этот инструмент отображает не все запускаемые юниты, а только те, которые входят в эту критическую цепочку событий:

[root@admins24 ~]# systemd-analyze critical-chain
The time when unit became active or started is printed after the "@" character.
The time the unit took to start is printed after the "+" character.

graphical.target @10.071s
└─lxdm.service @10.071s
  └─plymouth-quit.service @10.047s +22ms
    └─systemd-user-sessions.service @10.031s +7ms
      └─remote-fs.target @10.026s
        └─remote-fs-pre.target @10.025s
          └─nfs-client.target @4.636s
            └─gssproxy.service @4.607s +28ms
              └─network.target @4.604s
                └─NetworkManager.service @4.383s +219ms
                  └─dbus-broker.service @4.434s +136ms
                    └─dbus.socket @4.369s
                      └─sysinit.target @4.354s
                        └─systemd-update-utmp.service @4.345s +9ms
                          └─auditd.service @4.301s +42ms
                            └─systemd-tmpfiles-setup.service @4.254s +42ms
                              └─import-state.service @4.233s +19ms
                                └─local-fs.target @4.229s
                                  └─Virtual.mount @4.019s +209ms
                                    └─systemd-fsck@dev-mapper-vg_admins2\x2dVirtual.service @3.742s +274ms
                                      └─local-fs-pre.target @3.726s
                                        └─lvm2-monitor.service @356ms +637ms
                                          └─dm-event.socket @319ms
                                            └─-.mount
                                              └─system.slice
                                                └─-.slice
[root@admins24 ~]#

Цифры перед ними @показывают абсолютное количество секунд с момента запуска, когда блок становится активным. Цифры, которым предшествует, +показывают количество времени, необходимое для запуска устройства.

Состояние системы

Иногда нужно определить текущее состояние системы. Команда systemd-analyze dumpвыгружает огромное количество данных о текущем состоянии системы. Он начинается со списка основных временных меток загрузки, списка каждого модуля systemd и полного описания состояния каждого:

[root@admins24 ~]# systemd-analyze dump
Timestamp firmware: 1min 7.983523s
Timestamp loader: 3.872325s
Timestamp kernel: Wed 2020-08-26 12:33:35 EDT
Timestamp initrd: Wed 2020-08-26 12:33:38 EDT
Timestamp userspace: Wed 2020-08-26 12:33:42 EDT
Timestamp finish: Wed 2020-08-26 16:33:56 EDT
Timestamp security-start: Wed 2020-08-26 12:33:42 EDT
Timestamp security-finish: Wed 2020-08-26 12:33:42 EDT
Timestamp generators-start: Wed 2020-08-26 16:33:42 EDT
Timestamp generators-finish: Wed 2020-08-26 16:33:43 EDT
Timestamp units-load-start: Wed 2020-08-26 16:33:43 EDT
Timestamp units-load-finish: Wed 2020-08-26 16:33:43 EDT
Timestamp initrd-security-start: Wed 2020-08-26 12:33:38 EDT
Timestamp initrd-security-finish: Wed 2020-08-26 12:33:38 EDT
Timestamp initrd-generators-start: Wed 2020-08-26 12:33:38 EDT
Timestamp initrd-generators-finish: Wed 2020-08-26 12:33:38 EDT
Timestamp initrd-units-load-start: Wed 2020-08-26 12:33:38 EDT
Timestamp initrd-units-load-finish: Wed 2020-08-26 12:33:38 EDT
-> Unit system.slice:
        Description: System Slice
        Instance: n/a
        Unit Load State: loaded
        Unit Active State: active
        State Change Timestamp: Wed 2020-08-26 12:33:38 EDT
        Inactive Exit Timestamp: Wed 2020-08-26 12:33:38 EDT
        Active Enter Timestamp: Wed 2020-08-26 12:33:38 EDT
        Active Exit Timestamp: n/a
        Inactive Enter Timestamp: n/a
        May GC: no
<SNIP – Deleted a bazillion lines of output>

На моей основной рабочей станции эта команда сгенерировала поток из 49 680 строк размером около 1,66 МБ. Эта команда очень быстрая, поэтому ждать результатов не нужно.

Мне нравится обилие деталей, обеспечиваемых различными подключенными устройствами, такими как хранилище. Каждый модуль systemd имеет раздел с подробностями, такими как режимы для различных времен выполнения, каталоги кешей и журналов, командная строка, используемая для запуска модуля, идентификатор процесса (PID), отметка времени начала, а также ограничения памяти и файлов.

Страница systemd-analyzeруководства для показывает systemd-analyze --user dumpпараметр, который предназначен для отображения информации о внутреннем состоянии диспетчера пользователей. У меня это не получается, и поиск в Интернете показывает, что с этим может быть проблема. В systemd --userэкземпляры используются для управления и контроля ресурсов иерархии процессов, принадлежащих каждому пользователю. Процессы для каждого пользователя являются частью контрольной группы, о которой я расскажу в следующей статье.

Аналитические графики

Большинство заостренных начальников (PHB) и многие хорошие менеджеры считают, что красивые графики легче читать и понимать, чем текстовые данные о производительности системы, которые я обычно предпочитаю. Тем не менее, иногда даже мне нравится хороший график, и я systemd-analyzeпредоставляю возможность отображать данные загрузки / запуска в виде диаграммы векторной графики SVG .

Следующая команда создает файл векторной графики, который отображает события, происходящие во время загрузки и запуска. Создание этого файла займет всего несколько секунд:

[root@admins24 ~]# systemd-analyze plot > /tmp/bootup.svg

Эта команда создает SVG, который представляет собой текстовый файл, который определяет серию графических векторов, которые приложения, в том числе Image Viewer, Ristretto, Okular, Eye of Mate, LibreOffice Draw и другие, используют для создания графика. Эти приложения обрабатывают файлы SVG для создания изображения.

Я использовал LibreOffice Draw для визуализации графика. График огромен, и вам нужно значительно увеличить масштаб, чтобы разглядеть какие-либо детали. Вот небольшая его часть:

Последовательность загрузки находится слева от нуля (0) на шкале времени на графике, а последовательность загрузки — справа от нуля. Эта небольшая часть показывает ядро initrd, и initrd запущенные процессы .

Этот график сразу показывает, что и когда началось, сколько времени потребовалось для запуска и основные зависимости. Критический путь выделен красным.

Другая команда, которая генерирует графический вывод, — это systemd-analyze plot. Он генерирует текстовые описания графов зависимостей в формате DOT . Полученный поток данных затем передается через dotслужебную программу, которая является частью семейства программ, которые можно использовать для создания файлов векторной графики из различных типов данных. Эти файлы SVG также можно обрабатывать с помощью перечисленных выше инструментов.

Сначала сгенерируйте файл. На моей основной рабочей станции это заняло почти девять минут:

[root@admins24 ~]# time systemd-analyze dot | dot -Tsvg > /tmp/test.svg
   Color legend: black     = Requires
                 dark blue = Requisite
                 dark grey = Wants
                 red       = Conflicts
                 green     = After

real    8m37.544s
user    8m35.375s
sys     0m0.070s
[root@admins24 ~]#

Я не буду воспроизводить здесь результат, потому что полученный график в значительной степени спагетти. Но вы должны попробовать и посмотреть результат, чтобы понять, что я имею в виду.

Условные

Одна из наиболее интересных, но в некоторой степени общих возможностей, которую я обнаружил при чтении systemd-analyze(1)страницы руководства, — это conditionподкоманда. (Да, я читаю справочные страницы, и это удивительно, что я узнал таким образом!) Эту conditionподкоманду можно использовать для проверки условий и утверждений, которые могут использоваться в файлах модулей systemd.

Его также можно использовать в сценариях для оценки одного или нескольких условий — он возвращает ноль (0), если все выполняются, или единицу (1), если какое-либо условие не выполняется. В любом случае он также извергает текст о своих выводах.

Приведенный ниже пример из справочной страницы немного сложен. Он проверяет версию ядра от 4.0 до 5.1, что хост работает от сети переменного тока, что архитектура системы не является ARM, и что каталог /etc/os-releaseсуществует. Я добавил echo $?инструкцию для печати кода возврата.

[root@admins24 ~]# systemd-analyze condition 'ConditionKernelVersion = ! <4.0' \
                    'ConditionKernelVersion = >=5.1' \
                    'ConditionACPower=|false' \
                    'ConditionArchitecture=|!arm' \
                    'AssertPathExists=/etc/os-release' ; \
echo $?
test.service: AssertPathExists=/etc/os-release succeeded.
Asserts succeeded.
test.service: ConditionArchitecture=|!arm succeeded.
test.service: ConditionACPower=|false failed.
test.service: ConditionKernelVersion=>=5.1 succeeded.
test.service: ConditionKernelVersion=!<4.0 succeeded.
Conditions succeeded.
0
[root@admins24 ~]#

Список условий и утверждений начинается примерно со строки 600 на systemd.unit(5)странице руководства .

Вывод файлов конфигурации

Этот systemd-analyzeинструмент предоставляет способ отправки содержимого различных файлов конфигурации STDOUT, как показано здесь. Базовый каталог /etc/:

[root@admins24 ~]# systemd-analyze cat-config systemd/system/display-manager.service
# /etc/systemd/system/display-manager.service
[Unit]
Description=LXDM (Lightweight X11 Display Manager)
#Documentation=man:lxdm(8)
Conflicts=getty@tty1.service
After=systemd-user-sessions.service getty@tty1.service plymouth-quit.service livesys-late.service
#Conflicts=plymouth-quit.service

[Service]
ExecStart=/usr/sbin/lxdm
Restart=always
IgnoreSIGPIPE=no
#BusName=org.freedesktop.lxdm

[Install]
Alias=display-manager.service
[root@admins24 ~]#

Это слишком много набора текста, чтобы делать ничего, кроме стандартной catкоманды. Следующая команда мне кажется немного полезной. Он может искать файлы с указанным шаблоном в стандартных местоположениях systemd:

[root@admins24 ~]# systemctl cat backup*
# /etc/systemd/system/backup.timer
# This timer unit runs the local backup program
# Licensed under GPL V2
#

[Unit]
Description=Perform system backups
Requires=backup.service

[Timer]
Unit=backup.service
OnCalendar=*-*-* 00:15:30

[Install]
WantedBy=timers.target


# /etc/systemd/system/backup.service
# This service unit runs the rsbu backup program
# Licensed under GPL V2
#

[Unit]
Description=Backup services using rsbu
Wants=backup.timer

[Service]
Type=oneshot
Environment="HOME=/root"
ExecStart=/usr/local/bin/rsbu -bvd1
ExecStart=/usr/local/bin/rsbu -buvd2

[Install]
WantedBy=multi-user.target

[root@admins24 ~]#

Обе эти команды предваряют содержимое каждого файла строкой комментария, содержащей полный путь и имя файла.

Проверка файла объекта

После создания нового файла модуля может быть полезно проверить его синтаксис. Это то, что verifyделает подкоманда. Он может перечислять неверно написанные директивы и вызывать отсутствующие служебные единицы:

[root@admins24 ~]# systemd-analyze verify /etc/systemd/system/backup.service

Придерживаясь философии Unix / Linux, согласно которой «тишина — это золото», отсутствие выходных сообщений означает, что в отсканированном файле нет ошибок.

Безопасность

В securityпроверяет Подкоманду уровень безопасности указанных услуг. Он работает только с служебными модулями, но не с другими типами файлов модулей:

[root@admins24 ~]# systemd-analyze security display-manager
  NAME                                                        DESCRIPTION                                                     >
✗ PrivateNetwork=                                             Service has access to the host's network                        >
✗ User=/DynamicUser=                                          Service runs as root user                                       >
✗ CapabilityBoundingSet=~CAP_SET(UID|GID|PCAP)                Service may change UID/GID identities/capabilities              >
✗ CapabilityBoundingSet=~CAP_SYS_ADMIN                        Service has administrator privileges                            >
✗ CapabilityBoundingSet=~CAP_SYS_PTRACE                       Service has ptrace() debugging abilities                        >
✗ RestrictAddressFamilies=~AF_(INET|INET6)                    Service may allocate Internet sockets                           >
✗ RestrictNamespaces=~CLONE_NEWUSER                           Service may create user namespaces                              >
✗ RestrictAddressFamilies=~…                                  Service may allocate exotic sockets                             >
✗ CapabilityBoundingSet=~CAP_(CHOWN|FSETID|SETFCAP)           Service may change file ownership/access mode/capabilities unres>
✗ CapabilityBoundingSet=~CAP_(DAC_*|FOWNER|IPC_OWNER)         Service may override UNIX file/IPC permission checks            >
✗ CapabilityBoundingSet=~CAP_NET_ADMIN                        Service has network configuration privileges                    >
✗ CapabilityBoundingSet=~CAP_SYS_MODULE                       Service may load kernel modules
<SNIP>
✗ CapabilityBoundingSet=~CAP_SYS_TTY_CONFIG                   Service may issue vhangup()                                     >
✗ CapabilityBoundingSet=~CAP_WAKE_ALARM                       Service may program timers that wake up the system              >
✗ RestrictAddressFamilies=~AF_UNIX                            Service may allocate local sockets                              >

→ Overall exposure level for backup.service: 9.6 UNSAFE 😨
lines 34-81/81 (END)

Да, смайлы — это часть вывода. Но, конечно же, многим сервисам для работы нужен практически полный доступ ко всему. Я запускал эту программу против нескольких служб, включая мою собственную службу резервного копирования; результаты могут отличаться, но итоги, кажется, в основном такие же.

Этот инструмент был бы очень полезен для проверки и исправления сервисных единиц пользовательского пространства в критических с точки зрения безопасности средах. Я не думаю, что он может многое предложить большинству из нас.

Последние мысли

Этот мощный инструмент предлагает несколько интересных и удивительно полезных функций. Большая часть того, что исследуется в этой статье, касается использования systemd-analyzeдля получения представления о производительности Linux при запуске с использованием systemd. Он также может анализировать другие аспекты systemd.

Некоторые из этих инструментов имеют ограниченное применение, и о некоторых следует полностью забыть. Но большинство из них можно использовать с хорошими результатами при решении проблем с запуском и другими функциями systemd.

 2019-2020 © linuxadmins all rights reserved

Facebook Twitter Vkontakte