Назад | Перейти на главную страницу

Что более эффективно: запустить скрипт с циклом или заставить systemd выполнить его с таймером?

Я хотел бы, чтобы сценарий (bash) выполнялся один или два раза в секунду в фоновом режиме. Я вижу два возможных решения:

  1. Включите цикл в сценарий (с командой сна) и выполните сценарий один раз.
  2. Не включайте цикл и повторяйте выполнение сценария через системный таймер.

Итак, мои вопросы:

«Один или два раза в секунду» - это достаточно часто, чтобы я выбрал вариант цикла, но давайте рассмотрим некоторые различия.

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

    • В случае сценария оболочки (в отличие, например, от сценария Python) вы также платите небольшую плату за запуск новых sleep обрабатывает все время. (Если только sleep встроен в вашу оболочку, но не в Bash.)
  • Таймер каждый раз оплачивает стоимость запуска программы. Эта стоимость зависит от программы (например, для Java-программы она будет значительной, отбрасывая результаты оптимизации каждый раз, когда программа заканчивается; для сценария оболочки это, вероятно, менее серьезно).

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

  • Запуск нового экземпляра службы каждый раз по истечении таймера дает вам отдельный учет ресурсов для каждого экземпляра (см. systemd.resource-контроль (5)). Если e. грамм. по какой-то причине ваша служба потребляла гораздо больше дисковых операций ввода-вывода в час ночи, это будет записано в журнал для последующего анализа, если вы включите учет (это часть сообщения журнала: «Потреблено Икс Процессорное время, читать y с диска »и др.).

  • Таймеры systemd по умолчанию имеют точность всего одну минуту, что позволяет запускать несколько таймеров одновременно, что снижает вероятность пробуждения ЦП. Это можно изменить (например, AccuracySec=1us, видеть systemd.timer (5)), но это может быть признаком того, что посекундная активация таймера выходит за рамки наиболее типичного варианта использования.

  • Таймер systemd позволяет вам удобно видеть, когда он последний раз истек, и когда он снова истечет по расписанию, используя systemctl list-timers. Самодельная петля для сна, вероятно, не дает такого же уровня понимания.

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

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