En Linux, ¿desde cuándo comienza a contar el "tiempo de actividad"?

52

Mi computadora dice:

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

Y si reviso lastveo:

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

Y luego verifico:

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

Entonces veo en /var/log/syslogla primera línea de hoy ser:

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

Entonces, todo parece converger en 8:34el momento en que mi máquina se ha iniciado.

Sin embargo, me pregunto: ¿cuál es el tiempo exacto que uptimeusa? ¿Es uptimeun proceso que inicia y verifica algún archivo o es algo en el hardware?

Estoy ejecutando Ubuntu 14.04.

fedorqui
fuente
Estoy bastante seguro de que la marca de tiempo que ves en la parte superior del registro desde el inicio es el momento en que el demonio syslog recibió el mensaje para ser registrado. Eso no es lo mismo que cuando se encendió el sistema, o incluso lo mismo que cuando se inicializó el núcleo.
un CVn
Hasta donde sé, systemd-analyze blametambién contiene el tiempo antes de Kernel init, al menos en uefi.
Max Ried el
Con tuptime obtienes una salida clara y simple.
Rfraile
1
@Rikr interesante! Sin embargo, no puedo encontrar este comando en mi máquina. ¿Es este proyecto github ?
fedorqui
@fedorqui Sí, está en github.com/rfrail3/tuptime o dentro de Debian en Stretch o Sid
Rfraile

Respuestas:

79

En mi sistema obtiene el tiempo de actividad de /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

Desde la página de manual de proc :

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

El sistema de archivos proc contiene un conjunto de pseudo archivos. Esos no son archivos reales, solo se ven como archivos, pero contienen valores proporcionados directamente por el núcleo. Cada vez que lee un archivo, como /proc/uptime, su contenido se regenera sobre la marcha. El sistema de archivos proc es una interfaz para el núcleo.


En el código fuente del kernel de Linux del archivo fs/proc/uptime.cen la línea 49 , verá una llamada a la función:

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

Esto crea una entrada del sistema de archivos proc llamada uptime(el procfs generalmente está montado debajo /proc) y le asocia una función, que define operaciones de archivo válidas en ese pseudo archivo y las funciones asociadas a ellas. En caso de tiempo de actividad es justo read()y open()operaciones. Sin embargo, si rastrea las funciones, terminará aquí , donde se calcula el tiempo de actividad.


Internamente, hay una interrupción de temporizador que actualiza periódicamente el tiempo de actividad del sistema (además de otros valores). El intervalo, en el que el temporizador-interrupción marca, está definido por la macro preprocesador HZ, cuyo valor exacto se define en el archivo de configuración del núcleo y se aplica en el momento de la compilación.

El tiempo de inactividad y el número de ciclos de CPU, combinados con la frecuencia HZ(ciclos por segundo) se pueden calcular en un número (de segundos) desde el último arranque.


Para abordar su pregunta: ¿Desde cuándo comienza a contar el “tiempo de actividad”?

Dado que el tiempo de actividad es un valor interno del núcleo, que marca cada ciclo, comienza a contar cuando el núcleo se ha inicializado. Es decir, cuando el primer ciclo ha terminado. Incluso antes de que se monte algo, directamente después de que el gestor de arranque le da el control a la imagen del núcleo.

caos
fuente
2
+1, @chaos, ¿sería más exacto decir que el contador de tiempo de actividad comienza cuando se instala el controlador de interrupción del temporizador? ¿El núcleo configura este controlador?
Prem
3
@Prem Es parte de la inicialización del kernel. Justo antes de la inicialización del planificador, se registrará la interrupción del temporizador. Es la interrupción del temporizador la que llama a la primera iteración del código del planificador (solo por una llamada de función). Si está interesado, esta es una buena lectura: github.com/0xAX/linux-insides/blob/master/Initialization/…
caos
Pero a veces el valor de tiempo de actividad devuelto por el núcleo no siempre es el mismo. Como se calcula sobre la marcha, no en el arranque, si el servidor está ejecutando una sincronización de tiempo, o está bajo una carga pesada, este valor puede cambiar debido a los cambios en el HZ.
Rfraile
10

Por lo que sé, se uptimeutiliza /proc/uptimepara calcular el tiempo de actividad del sistema. Puede verlo más claramente en el código fuente 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);
    }
Inclooder
fuente
1
Prefiero decir que el pseudo archivo /proc/uptimese calcula a partir del tiempo de actividad.
Archemar
2
Eso no es cierto. Echa un vistazo al código fuente en el enlace de arriba.
Inclooder
6

En un sistema UNIX estándar (basado en las fuentes originales *), uptimelee /var/adm/utmpxy comprueba la última vez que se reinicia la entrada.

En otras palabras: esto es recuperar la fecha con la que también obtienes who -by luego calcula el tiempo desde entonces.

*) uptimees un enlace al wprograma y fue introducido por BSD alrededor de 1980.

astuto
fuente
Uhms, no puedo encontrar /var/adm/utmpxen mi sistema. De hecho, ni siquiera/var/adm
fedorqui
3
En tal caso, debe mencionar qué tipo de sistema operativo está utilizando.
schily
¡Mi culpa! Es Ubuntu 14.04.
fedorqui
OK, en Solaris, AIX, HP-UX y * BSD donde wse usa la implementación original, las cosas son de esta manera, pero Linux generalmente hace las cosas un poco diferentes.
schily
44
Creo que, por norma , te refieres a tradicional . El estándar Unix no especifica el uptimecomando, y mucho menos cómo debe implementarse. AFAICT, OS / X tampoco tiene un / var / adm / utmpx. Y algunos sistemas basados ​​en Linux han recibido la certificación de cumplimiento de Unix.
Stéphane Chazelas