В Linux, коли починається підрахунок "безперервного часу"?


52

Мій комп'ютер говорить:

$ uptime
 10:20:35 up  1:46,  3 users,  load average: 0,03, 0,10, 0,13

І якщо я перевіряю, lastя бачу:

reboot   system boot  3.19.0-51-generi Tue Apr 12 08:34 - 10:20  (01:45)    

А потім перевіряю:

$ ls -l /var/log/boot.log 
-rw-r--r-- 1 root root 4734 Apr 12 08:34 boot.log

Тоді я в /var/log/syslogпершому рядку сьогодні бачу :

Apr 12 08:34:39 PC... rsyslogd: [origin software="rsyslogd" swVersion="7.4.4" x-pid="820" x-info="http://www.rsyslog.com"] start

Тому все, схоже, сходиться 8:34тим часом, коли моя машина завантажилась.

Однак мені цікаво: який саме час uptimeвикористовує час ? Це uptimeпроцес, який запускає і перевіряє якийсь файл або це щось на апаратному забезпеченні?

Я запускаю Ubuntu 14.04.


Я майже впевнений, що часова марка, яку ви бачите у верхній частині журналу завантаження, - це час, коли демон syslog отримав повідомлення для реєстрації. Це не те саме, що при включенні системи, або навіть те саме, що ініціалізація ядра.
CVn

Наскільки я знаю, systemd-analyze blameтакож міститься час, перш ніж Kernel init, принаймні, на uefi.
Макс Рід

За час часу ви отримуєте чіткий і простий результат.
Rfraile

1
@Rikr цікаво! Однак я не можу знайти цю команду в своїй машині. Це проект github ?
fedorqui

@fedorqui Так, це в github.com/rfrail3/tuptime або всередині Debian у Stretch or Sid
Rfraile

Відповіді:


79

У моїй системі він отримує час роботи /proc/uptime:

$ strace -eopen uptime
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib/libproc-3.2.8.so", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
open("/proc/version", O_RDONLY)         = 3
open("/sys/devices/system/cpu/online", O_RDONLY|O_CLOEXEC) = 3
open("/etc/localtime", O_RDONLY|O_CLOEXEC) = 3
open("/proc/uptime", O_RDONLY)          = 3
open("/var/run/utmp", O_RDONLY|O_CLOEXEC) = 4
open("/proc/loadavg", O_RDONLY)         = 4
 10:52:38 up 3 days, 23:38,  4 users,  load average: 0.00, 0.02, 0.05

З програми провід :

   /proc/uptime
          This file contains two numbers: the uptime of the system
          (seconds), and the amount of time spent in idle process
          (seconds).

Файлова система proc містить набір псевдофайлів. Це не справжні файли, вони просто схожі на файли, але містять значення, які надаються безпосередньо ядром. Кожен раз, коли ви читаєте такий файл, як /proc/uptime, наприклад , його вміст відновлюється з льоту. Файлова система proc - це інтерфейс до ядра.


У вихідному коді файлу ядра Linux fs/proc/uptime.cу рядку 49 ви бачите виклик функції:

proc_create("uptime", 0, NULL, &uptime_proc_fops);

Це створює запис файлової системи procuptime ( називається profs, як правило, встановлений під /proc), і пов'язує з ним функцію, яка визначає дійсні файлові операції з цим псевдофайлом та пов'язані з ними функції. У разі безперервної роботи це просто read()і open()операції. Однак якщо ви відстежите функції назад, ви опинитесь тут , де обчислюється тривалість часу.


Внутрішньо існує таймер-переривник, який періодично оновлює роботу системи (крім інших значень). Інтервал, на якому тикер-інтерпульт відзначається, визначається препроцесором-макросом HZ, точне значення якого визначено у файлі конфігурації ядра та застосовується під час компіляції.

Час очікування та кількість циклів процесора в поєднанні з частотою HZ(цикли в секунду) можуть бути обчислені за кількість (секунд) з моменту останнього завантаження.


Щоб вирішити своє запитання: звідки починається підрахунок часу "безперервного часу"?

Оскільки час роботи - це внутрішнє значення ядра, яке позначає кожен цикл, воно починає рахувати, коли ядро ​​ініціалізується. Тобто, коли перший цикл закінчився. Ще до того, як щось буде встановлено, безпосередньо після завантажувача надається управління зображенням ядра.


2
+1, @chaos, чи було б точніше сказати, що лічильник часу безперервної роботи починається, коли встановлено обробник переривання таймера? Чи налаштовує ядро ​​цей обробник?
Прем

3
@Prem Це частина ініціалізації ядра. Прямо перед ініціалізацією планувальника буде зареєстровано переривання таймера. Це тимчасове переривання, яке викликає першу ітерацію коду планувальника (лише за допомогою виклику функції). Якщо ви зацікавлені, це добре прочитайте: github.com/0xAX/linux-insides/blob/master/Initialization/…
хаос

Але іноді значення, що повертається з ядра, не завжди є однаковим. Оскільки обчислюється під час руху, а не під час завантаження, якщо сервер працює деякий час синхронізації або перебуває під великим навантаженням, це значення може змінюватися через зміни на HZ.
Rfraile

10

Наскільки я знаю, uptimeвикористовує /proc/uptimeдля обчислення часу роботи системи. Ви можете бачити це чіткіше у вихідному коді uptime.c

  FILE *fp;

  fp = fopen ("/proc/uptime", "r");
  if (fp != NULL)
    {
      char buf[BUFSIZ];
      char *b = fgets (buf, BUFSIZ, fp);
      if (b == buf)
        {
          char *end_ptr;
          double upsecs = c_strtod (buf, &end_ptr);
          if (buf != end_ptr)
            uptime = (0 <= upsecs && upsecs < TYPE_MAXIMUM (time_t)
                      ? upsecs : -1);
        }

      fclose (fp);
    }

1
Я скоріше скажу, що псевдофайл /proc/uptimeобчислюється з безперервного часу.
Архемар

2
Це не правда. Погляньте на вихідний код за посиланням вище.
Inclooder

6

У стандартній системі UNIX (на основі оригінальних джерел *) uptimeчитається /var/adm/utmpxта перевіряється останній час перезавантаження запису.

Іншими словами: це отримання дати, яку ви також отримаєте, who -bа потім обчислює час з тих пір.

*) uptimeє посиланням на wпрограму і був представлений BSD близько 1980 року.


Гм, я не можу знайти /var/adm/utmpxв своїй системі. Насправді навіть не/var/adm
fedorqui

3
У такому випадку вам слід згадати, яку саме ОС ви використовуєте.
schily

Моя провина! Це Ubuntu 14.04.
fedorqui

Гаразд, у Solaris, AIX, HP-UX та * BSD, де використовується оригінальна wреалізація, саме так, але Linux зазвичай робить дещо інакше.
schily

4
Я думаю, що стандартно , ви маєте на увазі традиційне . Стандарт Unix не визначає uptimeкоманду, не кажучи вже про те, як вона повинна бути реалізована. AFAICT, OS / X також не має / var / adm / utmpx. А деякі системи на базі Linux отримали сертифікацію відповідності Unix.
Стефан Шазелас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.