在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还包含内核初始化之前的时间,至少在uefi上。
Max Ried

使用tuptime,您可以获得清晰而简单的输出。
Rfraile

1
@Rikr有趣!但是,在我的机器上找不到该命令。这是github项目吗?
fedorqui '16

@fedorqui是的,它在github.com/rfrail3/tuptime中或在Debian的Stretch或Sid中
Rfraile 2016年

Answers:


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联机帮助页

   /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);

这将创建一个称为的proc文件系统条目uptime(通常将procfs安装在之下/proc),并将一个函数与其关联,该函数定义对该伪文件及其相关函数的有效文件操作。在正常运行的情况下,它只是read()open()操作。但是,如果您追溯这些功能,则最终将在此处计算正常运行时间。


内部有一个计时器中断,它定期更新系统正常运行时间(其他值除外)。timer-interupt滴答的间隔由preprocessor-macro HZ定义,其确切值在内核配置文件中定义并在编译时应用。

空闲时间和CPU周期数以及频率HZ(每秒周期数)可以自上次引导以来的数量(秒)进行计算。


要解决您的问题:“正常运行时间”从什么时候开始算起?

由于正常运行时间是内核内部值,每个周期都会增加一次,因此它在内核初始化时开始计数。也就是说,当第一个周期结束时。即使在挂载任何东西之前,也就是在引导加载程序将控制权交给内核映像之后。


2
+1 @chaos,说​​安装计时器中断处理程序后启动正常运行时间计数器会更准确吗?内核是否配置此处理程序?
2016年

3
@Prem这是内核初始化的一部分。在调度程序初始化之前,将记录定时器中断。是计时器中断,它调用调度程序代码的第一次迭代(仅通过函数调用)。如果您有兴趣,请
混乱

但是有时从内核返回的正常运行时间值并不总是相同的。正如动态计算的那样,而不是在启动时计算的,如果服务器正在运行一些时间同步或负载很重,由于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是从正常运行时间计算出来的。
Archemar

2
这不是真的。在上面的链接中查看源代码。
Inclooder

6

在标准UNIX系统上(基于原始来源*), uptime读取/var/adm/utmpx并检查最后一次重新引导输入。

换句话说:这是在检索您也得到的日期who -b,然后计算此后的时间。

*)uptime是该w程序的链接,由BSD在1980年左右引入。


嗯,我/var/adm/utmpx在系统中找不到。实际上,甚至都不是/var/adm
fedorqui '16

3
在这种情况下,您应该提及您使用的是哪种操作系统。
2016年

我的错!它是Ubuntu 14.04。
fedorqui '16

是的,在w使用原始实现的Solaris,AIX,HP-UX和* BSD上,事情是这样的,但是Linux通常会有所不同。
schily

4
我认为按标准来说,您的意思是传统。Unix标准没有指定uptime命令,更不用说应该如何实现了。AFAICT,OS / X也不具有/ var / adm / utmpx。一些基于Linux的系统已经获得Unix兼容认证。
斯特凡Chazelas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.