No Linux, quando é que o tempo de atividade começa a contar?

52

Meu computador diz:

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

E se eu verificar last, vejo:

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

E então eu verifico:

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

Então eu vejo na /var/log/syslogprimeira linha de hoje:

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

Então tudo parece convergir para 8:34o momento em que minha máquina foi inicializada.

No entanto, eu me pergunto: qual é o tempo exato uptime? É uptimeum processo que inicia e verifica algum arquivo ou é algo no hardware?

Estou executando o Ubuntu 14.04.

fedorqui
fonte
Tenho certeza de que o carimbo de data / hora que você vê na parte superior do log da inicialização é o horário em que o daemon syslog recebeu a mensagem a ser registrada. Isso não é o mesmo que quando o sistema foi ligado, ou mesmo o mesmo que quando o kernel foi inicializado.
um CVn
Tanto quanto sei, systemd-analyze blametambém contém o tempo antes do Kernel init, pelo menos no uefi.
Max Ried
Com o tempo de inicialização, você obtém uma saída clara e simples.
Rfraile
11
@Rikr interessante! No entanto, não consigo encontrar este comando na minha máquina. É este projeto do github ?
Fedorqui # 13/16
@fedorqui Sim, é no github.com/rfrail3/tuptime ou dentro Debian em esticar ou Sid
Rfraile

Respostas:

79

No meu sistema, ele obtém o tempo de atividade 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

Na página de manual do proc :

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

O sistema de arquivos proc contém um conjunto de pseudo arquivos. Esses não são arquivos reais, apenas se parecem com arquivos, mas contêm valores que são fornecidos diretamente pelo kernel. Toda vez que você lê um arquivo, como /proc/uptime, seu conteúdo é regenerado rapidamente. O sistema de arquivos proc é uma interface para o kernel.


No código-fonte do kernel linux do arquivo fs/proc/uptime.cna linha 49 , você vê uma chamada de função:

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

Isso cria uma entrada do sistema de arquivos proc chamada uptime(o procfs geralmente é montado em baixo /proc) e associa uma função a ela, que define operações de arquivo válidas nesse pseudo arquivo e as funções associadas a eles. Em caso de uptime é apenas read()e open()operações. No entanto, se você rastrear as funções de volta, você terminará aqui , onde o tempo de atividade é calculado.


Internamente, há uma interrupção do timer que atualiza periodicamente o tempo de atividade do sistema (além de outros valores). O intervalo, no qual a interrupção do timer é marcada, é definido pela macro do pré-processador HZ, cujo valor exato é definido no arquivo de configuração do kernel e aplicado no momento da compilação.

O tempo ocioso e o número de ciclos da CPU, combinados com a frequência HZ(ciclos por segundo) podem ser calculados em um número (de segundos) desde a última inicialização.


Para responder à sua pergunta: Quando o tempo de atividade começa a contar?

Como o tempo de atividade é um valor interno do kernel, que aumenta a cada ciclo, ele começa a contar quando o kernel é inicializado. Ou seja, quando o primeiro ciclo terminar. Mesmo antes de qualquer coisa ser montada, logo após o gerenciador de inicialização controlar a imagem do kernel.

caos
fonte
2
+1, @chaos, seria mais preciso dizer que o contador de tempo de atividade é iniciado quando o manipulador de interrupção do timer está instalado? O kernel configura esse manipulador?
Prem
3
@Prem Faz parte da inicialização do kernel. Logo antes da inicialização do agendador, a interrupção do timer será registrada. É a interrupção do timer que chama a primeira iteração do código do agendador (apenas por uma chamada de função). Se você está interessted, esta é uma boa leitura: github.com/0xAX/linux-insides/blob/master/Initialization/...
caos
Mas, às vezes, o valor de tempo de atividade retornado do kernel nem sempre é o mesmo. Como é calculado em tempo real, não na inicialização, se o servidor estiver executando alguma sincronização de tempo ou estiver com carga pesada, esse valor poderá mudar devido às mudanças no HZ.
Rfraile 13/04
10

Desde que eu saiba, uptimeusa /proc/uptimepara calcular o tempo de atividade do sistema. Você pode vê-lo mais claramente no tempo de atividade do código fonte.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
fonte
11
Prefiro dizer que o pseudo arquivo /proc/uptimeé calculado desde o tempo de atividade.
Archemar # 12/16
2
Isso não é verdade. Dê uma olhada no código fonte no link acima.
precisa saber é o seguinte
6

Em um sistema UNIX padrão (com base nas fontes originais *), uptime/var/adm/utmpxe verifica a última vez em que a entrada de reinicialização é iniciada.

Em outras palavras: isso está recuperando a data com a qual você também entra who -be calcula o tempo desde então.

*) uptimeé um link para o wprograma e foi introduzido pelo BSD por volta de 1980.

esperto
fonte
Uhms, não consigo encontrar /var/adm/utmpxno meu sistema. Na verdade, nem mesmo/var/adm
fedorqui
3
Nesse caso, você deve mencionar que tipo de sistema operacional você está usando.
schily
Minha culpa! É o Ubuntu 14.04.
Fedorqui # 12/16
OK, no Solaris, AIX, HP-UX e * BSD, onde a wimplementação original é usada, as coisas são assim, mas o Linux geralmente faz as coisas um pouco diferentes.
Schily
4
Eu acho que por padrão você quer dizer tradicional . O padrão Unix não especifica o uptimecomando, muito menos como deve ser implementado. AFAICT, OS / X também não possui um / var / adm / utmpx. E alguns sistemas baseados em Linux receberam certificação de conformidade com Unix.
Stéphane Chazelas 13/04