Узнать время запуска процесса

Вы задавались вопросом, как найти время выполнения процесса в системе Linux или Unix? Это руководство покажет вам несколько инструментов, которые могут пригодиться при попытке найти время выполнения процесса в Linux.

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

Добрый день уважаемые читатели и гости блога pyatilistnik.org, как много люди говорят о времени, что оно быстро или медленно бежит, и все понимают, что оно бесценно и важно. Так и в инфраструктуре Active Directory, она является одним из важнейших факторов, правильного функционирования домена. В домене все друг другу доверяют, и один раз авторизовавшись и получив все тикеты от Kerberos, пользователь ходит куда угодно, ограничиваясь лишь своими доступными правами. Так вот если у вас не будет точного времени на ваших рабочих станциях к контроллеру домена, то можете считать, что у вас начинаются серьезные проблемы, о которых мы поговорим ниже и рассмотрим как их устранить с помощью настройки NTP сервера в Windows.

Вероятно, вы знаете время начала команды / процесса и как долго процесс выполняется в Unix-подобных системах.

Но когда вы его закончили и / или какое общее время, затраченное на выполнение команды / процесса?

В Unix-подобных системах есть утилита с именем «GNU time», специально предназначенная для этой цели.

Используя утилиту Time, мы можем легко измерить общее время выполнения команды или программы в операционных системах Linux.

Хорошо, что команда «Time» поставляется в большинстве дистрибутивов Linux, поэтому вам не нужно беспокоиться об установке.

Найти время выполнения команды или процесса в Linux

Чтобы измерить время выполнения команды / программы, просто запустите.

$ /usr/bin/time -p ls

$ time ls

Вышеуказанные команды отображают общее время выполнения команды «ls».

Замените «ls» любой командой / процессом по вашему выбору, чтобы найти общее время выполнения.

Time и /usr/bin/time

Как вы могли заметить, в приведенных выше примерах мы использовали две команды «time» и «/usr/bin/time».

Итак, вы можете задаться вопросом, в чем разница между ними.

Сначала давайте посмотрим, что на самом деле «timeя» использует команду «type».

Для тех, кто не знает, команда Type используется для получения информации о команде Linux.

$ type -a time
time is a shell keyword
time is /usr/bin/time

Как видите time  – две штуки

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

Но, когда вы запускаете /usr/bin/time, вы запускаете реальную программу времени GNU time.

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

Встроенное ключевое слово оболочки «time» доступно в большинстве оболочек, таких как BASH, ZSH, CSH, KSH, TCSH и т. д.

Ключевое слово оболочки «time» имеет меньше опций, чем исполняемые файлы.

Единственный вариант, который вы можете использовать в ключе «time», – это -p.

Теперь вы знаете, как найти общее время выполнения данной команды / процесса, используя команду «time».

Хотите узнать немного больше об утилите «GNU time»? Читайте дальше!

Краткое введение в программу «GNU time»

Программа  GNU time запускает команду / программу с заданными аргументами и суммирует использование системных ресурсов в качестве стандартного вывода после завершения команды.

В отличие от ключевого слова time, программа GNU time не просто отображает время, используемое командой / процессом, но и другие ресурсы, такие как память, вызовы ввода-вывода и IPC.

Типичным синтаксисом команды Time является:

options в приведенном выше синтаксисе ссылаются на набор флагов, которые могут использоваться  командой time для выполнения определенной функциональности.

Список доступных опций приведен ниже^

Если вы запустите ту же команду с встроенным ключевым словом «time», результат будет немного другим:

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

$ /usr/bin/time -o file.txt ls
dir1 dir2 file1 file2 file.txt mcelog

Как вы можете видеть на выходе, утилита Time не отображает результат. Потому что мы записываем вывод в файл с именем file.txt. Давайте посмотрим на этот файл:

Когда вы используете флаг -o, если нет файла с именем «file.txt», он будет создавать и записывать вывод в него.

Если файл.txt уже присутствует, он перезапишет его содержимое.

Вы также можете добавить вывод в файл, а не переписывать его, используя флаг -a.

$ /usr/bin/time -a file.txt ls

Флаг -f позволяет пользователям управлять форматом вывода по своему усмотрению.

Скажем, например, следующая команда отображает вывод команды «ls» и показывает только пользователя, систему и общее время.

Помните, что встроенная команда «time» не поддерживает все функции программы GNU time.

Для получения дополнительной информации о утилите времени GNU см. Справочные страницы.

$ man time

Синхронизация времени – важный и во многом достаточно критичный аспект работы Active Directory, особенно сегодня, когда широко используется взаимодействие с внешними системами и работа с сотрудниками, которые могут находиться в различных часовых поясах. Применение систем виртуализации вносит дополнительные особенности, которые также следует учитывать. Поэтому данный вопрос может оказаться не столь простым, как кажется, а синхронизация с внешним источником точного времени становится одной из актуальных задач.

:/>  Как перезагрузить (перезапустить) сервер удаленно или через команднусю строку | ✅ -

Прежде всего вспомним, как происходит синхронизация времени в Active Directory. В качестве эталона времени выступает контроллер, владеющий ролью эмулятора PDC. Это FSMO-роль и эмулятором PDC может являться только один контроллер в каждом домене. С ним синхронизируют время остальные контроллеры домена. Доменные ПК и рядовые серверы сверяют часы с ближайшим контроллером домена.

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

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

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

Давайте перейдем от теории к практике. Моделируем ситуацию когда PDC крутиться на Hyper-V. Начнем с того, что выясним кто из контроллеров является эмулятором PDC и эталоном времени для домена. Это можно сделать на любом контроллере домена командой:

netdom query fsmo

В выводе будут показаны все хозяева операций, нас интересует только эмулятор PDC.

Затем перейдем на указанный контроллер и узнаем источник времени для него, для этого выполните команду:

w32tm /query /source

Если в выводе вы увидите:

Local CMOS Clock

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

Free running system clock

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

Ну а если там будет:

VM IC Time Synchronization Provider

то вы имеете дело с виртуальной машиной, которая синхронизирует время с хостом, т.е. с сервером Hyper-V. Здесь уже важно как синхронизируется время самого сервера Hyper-V. Будем полагать что он является членом домена где рулит PDC.

Поэтому далее будем править настройки самого PDC.

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

и установите для параметра Enabled значение 0.

После данного изменения следует перезапустить Службу времени Windows (net stop w32time, net start w32time) или перезагрузить компьютер.

Получить список всех VM с HyperV-сервера, к примеру,  srv-hyperv01, которые нуждаются в перенастройке можно так:

$Hyper = “srv-hyperv01”

foreach ($server in $servers)

Следующим шагом будет настройка нашего эмулятора PDC на работу с внешними источниками точного времени. Все изменения также будут вноситься через реестр. Прежде всего изменим тип сервера на NTP, для этого откроем ветку

и для параметра Type укажем строковое значение NTP.  Для клиентов домена лучше ставить значение NT5DS. Ежели наблюдаете проблемы, то можете начать с AllSync. А для параметра NtpServer зададим адреса серверов точного времени, после каждого из которых, через запятую укажем 0x8, если мы хотим работать как стандартный NTP-клиент или 0x1 если будем использовать собственные параметры, например:

0.ru.pool.ntp.org,0x1 1.ru.pool.ntp.org,0x1 2.ru.pool.ntp.org,0x1

После чего в

Параметр Enabled установим в значение 1.

Затем перейдем в

и установим для параметра AnnounceFlags значение A.

Следующие параметры будут работать, только если мы при указании серверов добавили 0x1, иначе будут использоваться настройки, предлагаемые сервером. Чтобы задать период синхронизации откройте ветку

и для параметра SpecialPollInterval укажите десятичное значение в секундах.

и зададим максимальное время опережения и отставания часов, после которых синхронизация производиться не будет. Для этого используются параметры MaxPosPhaseCorrection (опережение) и MaxNegPhaseCorrection (отставание) для которых также следует задать десятичное значение в секундах. По умолчанию стоит 48 часов. Это значит, что если время на эмуляторе PDC уйдет от точного источника более чем на 48 часов в любую сторону, то синхронизация производиться не будет.

Если вы хотите, чтобы время синхронизировалось всегда, то установите в оба параметра шестнадцатеричное значение FFFFFFFF.

Выполнив настройки перезапустите Службу времени Windows, это также можно сделать в командной строке:

После чего еще раз выполним

и убедимся, что источником времени для эмулятора PDC является внешний сервер.

Затем выполним данную команду на рядовых контроллерах домена, в качестве источника времени там должен быть указан эмулятор PDC, и на обычных ПК, где в выводе будет присутствовать любой из контроллеров домена. Обязательно выполните контроль для виртуальных машин, чтобы быть уверенным, что они используют время домена, а не хоста виртуализации.

:/>  Компьютер перестает реагировать на клавиатуру и мышь

Правку параметров синхронизации можно выполнить и одной строкой:

w32tm /config /manualpeerlist:”0.ru.pool.ntp.org” /syncfromflags:manual /reliable:yes /update

или через GPO:

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

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

Я считаю, что есть только два способа проверить это.

Это можно сделать с помощью команды top и команды ps.

Я хотел бы рекомендовал использовать скорее top, нежели ps.

Но оба метода будут давать одинаковые результаты, поэтому вы можете выбрать тот, который вам нравится больше.

Обе эти опции широко используются администраторами Linux.

1) Как найти процесс с высокой загрузкой на процессор в Linux с помощью команды top

Команда top в Linux – это лучшая и наиболее известная команда, которую все используют для мониторинга производительности системы Linux.

Команда top обеспечивает динамическое представление в реальном времени запущенных процессов в системе Linux.

Она отображает сводную информацию о системе, список процессов, в настоящее время управляемых ядром Linux.

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

По умолчанию она сортирует верхние выходные данные с использованием ЦП и обновляет данные каждые 5 секунд.

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

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

Детали вышеупомянутой команды:

Если вы хотите увидеть полный путь к команде вместо ее имени, запустите следующий формат команды top:

2) Как найти процесс с высокой загрузкой процессора в Linux с помощью команды ps

ps обозначает processes status, она отображает информацию об активных / запущенных процессах в системе.

Она предоставляет снимок текущих процессов вместе с подробной информацией, такой как имя пользователя, идентификатор пользователя, использование процессора, использование памяти, дата начала процесса и имя команды времени и т. д.

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

Синхронизация времени в Active Directory

Среди компьютеров, участвующих в Active Directory работает следующая схема синхронизация времени.

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

Синхронизация клиентов корневого PDC может осуществятся как с его внутренних часов, так и с внешнего источника. В первом случае сервер времени корневого PDC объявляет себя как «надежный» (reliable).

Далее я приведу оптимальную с моей точки зрения конфигурацию сервера времени корневого PDC, при которой сам корневой PDC периодически синхронизирует свое время от достоверного источника в интернете, а время обращающихся к нему клиентов синхронизирует со своими внутренними часами.

Для того, чтобы понять кто у вас в сети является NTP сервером из контроллеров домена, прочитайте вот эту статью, многие вопросы отпадут сами собой

Вводим netdom query fsmo. В моем примере, роль PDC и NTP сервера, принадлежит контроллеру dc7


Узнать время запуска процесса

Проверка времени запущенного процесса с помощью команды ps

Вы можете использовать команду ps для проверки времени работы определенного процесса. Сначала нужно найти идентификатор процесса, а затем использовать его для поиска.

Чтобы определить идентификатор процесса, вы можете использовать такой инструмент, как pidof

$ pidof mpd 1388

Далее используйте ps с опциями -o etime, чтобы узнать время работы.

$ ps -p 1388 -o etime

Этот параметр команды также можно использовать для нескольких процессов. В примере ниже будет показано время запуска и время выполнения всех процессов на моем сервере Ubuntu.

$ ps -eo pid,lstart,etime,args


Узнать время запуска процесса

Время запуска и время выполнения всех процессов на сервере Ubuntu

Вывод имеет 4 колонки:

PID — идентификатор запущенного процесса.

STARTED — Время, когда процесс был запущен.

ELAPSED — Общее время работы процесса.

COMMAND — Обработка выполненной команды.

Конфигурация NTP-сервера на корневом PDC

Конфигурирование сервера времени в Windows (NTP-сервера) может осуществляться как с помощью утилиты командной строки w32tm, так и через реестр. Где возможно, я приведу оба варианта. Но в начале посмотрите полностью ваши настройки на компьютере, делается это командой:

w32tm /query /configuration

EventLogFlags: 2 (Локально) AnnounceFlags: 10 (Локально) TimeJumpAuditOffset: 28800 (Локально) MinPollInterval: 6 (Локально) MaxPollInterval: 10 (Локально) MaxNegPhaseCorrection: 172800 (Локально) MaxPosPhaseCorrection: 172800 (Локально) MaxAllowedPhaseOffset: 300 (Локально)

FrequencyCorrectRate: 4 (Локально) PollAdjustFactor: 5 (Локально) LargePhaseOffset: 50000000 (Локально) SpikeWatchPeriod: 900 (Локально) LocalClockDispersion: 10 (Локально) HoldPeriod: 5 (Локально) PhaseCorrectRate: 7 (Локально) UpdateInterval: 100 (Локально)

:/>  Можно ли разогнать монитор и как это сделать | Мониторы | Блог | Клуб DNS

NtpClient (Локально) DllName: C:Windowssystem32w32time.dll (Локально) Enabled: 1 (Локально) InputProvider: 1 (Локально) CrossSiteSyncFlags: 2 (Локально) AllowNonstandardModeCombinations: 1 (Локально) ResolvePeerBackoffMinutes: 15 (Локально) ResolvePeerBackoffMaxTimes: 7 (Локально) CompatibilityFlags: 2147483648 (Локально) EventLogFlags: 1 (Локально) LargeSampleSkew: 3 (Локально) SpecialPollInterval: 3600 (Локально) Type: NT5DS (Локально)

NtpServer (Локально) DllName: C:Windowssystem32w32time.dll (Локально) Enabled: 1 (Локально) InputProvider: 0 (Локально) AllowNonstandardModeCombinations: 1 (Локально)

VMICTimeProvider (Локально) DllName: C:WindowsSystem32mictimeprovider.dll (Локально) Enabled: 1 (Локально) InputProvider: 1 (Локально)


Узнать время запуска процесса

Включение синхронизации внутренних часов с внешним источником

Объявление NTP-сервера в качестве надежного

NTP-сервер по умолчанию включен на всех контроллерах домена, однако его можно включить и на рядовых серверах.

Задание списка внешних источников для синхронизации

Флаг 0×8 на конце означает, что синхронизация должна происходить в режиме клиента NTP, через предложенные этим сервером интервалы времени. Для того, чтобы задать свой интервал синхронизации, необходимо использовать флаг 0×1.

Задание интервала синхронизации с внешним источником

Время в секундах между опросами источника синхронизации, по умолчанию 900с = 15мин. Работает только для источников, помеченных флагом 0×1.

Установка минимальной положительной и отрицательной коррекции

Максимальная положительная и отрицательная коррекция времени (разница между внутренними часами и источником синхронизации) в секундах, при превышении которой синхронизация не происходит. Рекомендую значение 0xFFFFFFFF, при котором коррекция сможет производиться всегда.

Все необходимое одной строкой

w32tm.exe /config /manualpeerlist:”time.nist.gov,0x8 ntp1.imvp.ru,0x8 ntp2.imvp.ru,0x8 time.windows.com,0x8 pool.ntp.org,0x8″ /syncfromflags:manual /reliable:yes /update

Полезные команды

Контроллеры домена, работающие в виртуализированной среде, требуют к себе особенного отношения.

Проверка времени процесса Linux с помощью Gnomon

Gnomon — это утилита, используемая для аннотирования протоколов консоли временными метками и поиска медленных процессов в системе Linux. Этот инструмент полезен для поиска долго выполняющихся процессов, когда вы хотите получить справку о том, что занимает так много времени.

Использование команды time в Ubuntu

Команда time сообщает сколько времени заняло выполнение команды в системе Linux. Вы можете установить ее, если она отсутствует в системе Ubuntu. Для этого используйте следующую команду.

$ sudo apt-get install time

Использование команда time:

Выход времени будет иметь:

Рассмотрим следующий пример для проверки использования диска в каталоге /root.

# time du -sh /root/

Из вывода видно, что фактическое время выполнения команды составляет 0m0.007s.

Давайте сделаем еще один, пинг на 8.8.8.8.


Узнать время запуска процесса

Еще одна проверка пинг с командой time

Фактическое время выполнения составляет 2,059 секунды.

Заключение

Теперь вы знаете, как узнать время выполнения процесса в Linux. Первый метод идеально подходит для интерактивных процессов. Для процессов которые работают в фоновом режиме, всегда можно узнать их время выполнения с помощью команды ps.

Установка Gnomon

Так как Gnomon — это инструмент который написан на Node.js, в вашей системе должен быть установлен Node.js. Он необходим для установки gnomon с помощью менеджера пакетов npm. После того как инструмент npm будет установлен в вашей системе Linux. Перейдите к установке Gnomon с помощью команды:

Использование Gnomon

Чтобы добавить метку времени к каждой строке, нужно передать команду в gnomon. Это покажет, сколько времени заняло выполнение процесса. По умолчанию gnomon отображает секунды, прошедшие между каждой строкой, но это можно настроить.


Узнать время запуска процесса

Посмотрите на приведенный ниже пример, который показывает время, затраченное на выполнение 5 раз запроса ping к серверу google DNS.


Узнать время запуска процесса

Пример который показывает время затраченное на выполнение запроса ping

Общее время составляет 3,3842 секунды.

Доступны следующие варианты параметров

Ниже приведен список доступных вариантов:

Тип временной метки для отображения. elapsed-line: Количество секунд, в течение которых отображаемая строка была последней. elapsed-total: Количество секунд с начала процесса. absolute: Абсолютная временная метка в UTC.


Узнать время запуска процесса

Пример использования Gnomon

Пример отключения обновления в реальном времени:


Узнать время запуска процесса

Gnomon Отключение обновления в реальном времени

Настройка NTP сервера и клиента групповой политикой

Раз уж у нас с вами домен Active Directory, то глупо не использовать групповые политики, для массовой настройки серверов и рабочих станций, я покажу как настроить ваш NTP сервер в windows и клиента. Открываем оснастку “Редактор групповых политик”. Перед тем как настроить наш NTP сервер в Windows, нам необходимо создать WMI фильтр, который будет применять политику, только к серверу мастера PDC.


Узнать время запуска процесса

Вводим имя запроса, пространство имен, будет иметь значение “rootCIMv2” и запрос “Select * from Win32_ComputerSystem where DomainRole = 5”. Сохраняем его.


Узнать время запуска процесса

Затем вы создаете политику на контейнере Domain Controllers.


Узнать время запуска процесса

В самом низу политики применяете ваш созданный WMI фильтр.


Узнать время запуска процесса

Узнать время запуска процесса

Тут открываем политику “Настроить NTP-клиент Windows”. Задаем параметры


Узнать время запуска процесса

Делаем отдельную групповую политику для клиентских рабочих машин, вот с такими параметрами.

  • CrossSiteSyncFlags: 2
  • Resolve Peer BAckoffMaxTimes: 7
  • SpecilalPoolInterval: 3600
  • EventLogFlags: 0


Узнать время запуска процесса

Далее идем на клиента и обновляем групповые политики gpupdate /force и вводим команду w32tm /query /status


Узнать время запуска процесса