Di Linux, kapan "uptime" mulai dihitung?

52

Komputer saya mengatakan:

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

Dan jika saya periksa lastsaya melihat:

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

Dan kemudian saya periksa:

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

Lalu saya melihat di /var/log/syslogbaris pertama hari ini adalah:

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

Jadi semua sepertinya menyatu 8:34saat mesin saya boot.

Namun, saya bertanya-tanya: berapa tepatnya waktu yang uptimedigunakan? Apakah uptimeproses yang meluncurkan dan memeriksa beberapa file atau ada sesuatu pada perangkat keras?

Saya menjalankan Ubuntu 14.04.

fedorqui
sumber
Saya cukup yakin cap waktu yang Anda lihat di bagian atas log dari boot adalah waktu ketika daemon syslog menerima pesan untuk dicatat. Itu tidak sama dengan ketika sistem dinyalakan, atau bahkan hal yang sama seperti ketika kernel diinisialisasi.
CVn
Sejauh yang saya tahu systemd-analyze blamejuga mengandung waktu sebelum Kernel init, setidaknya di uefi.
Max Ried
Dengan tuptime Anda mendapatkan output yang jelas dan sederhana.
Rfraile
1
@Rikr menarik! Namun, saya tidak dapat menemukan perintah ini di mesin saya. Apakah ini proyek github ?
fedorqui
@fedorqui Ya, itu ada di github.com/rfrail3/tuptime atau di dalam Debian in Stretch atau Sid
Rfraile

Jawaban:

79

Di sistem saya ia mendapat uptime dari /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

Dari halaman proc :

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

Sistem file proc berisi satu set file pseudo. Itu bukan file nyata, mereka hanya terlihat seperti file, tetapi mereka berisi nilai-nilai yang disediakan langsung oleh kernel. Setiap kali Anda membaca file, seperti /proc/uptime, isinya dibuat ulang dengan cepat. Sistem file proc adalah antarmuka ke kernel.


Dalam kode sumber kernel linux file fs/proc/uptime.cdi baris 49 , Anda melihat panggilan fungsi:

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

Ini menciptakan entri sistem file proc yang disebut uptime(procfs biasanya di-mount di bawah /proc), dan mengaitkan suatu fungsi padanya, yang mendefinisikan operasi file yang valid pada file pseudo itu dan fungsi yang terkait dengannya. Dalam hal uptime, itu hanya read()dan open()operasi. Namun, jika Anda melacak kembali fungsi Anda akan berakhir di sini , di mana uptime dihitung.


Secara internal, ada timer-interupt yang memperbarui uptime sistem secara berkala (selain nilai-nilai lainnya). Interval, di mana timer-interupt ticks, ditentukan oleh preprocessor-macro HZ, yang nilai pastinya didefinisikan dalam file konfigurasi kernel dan diterapkan pada waktu kompilasi.

Waktu idle dan jumlah siklus CPU, dikombinasikan dengan frekuensi HZ(siklus per detik) dapat dihitung dalam jumlah (detik) sejak boot terakhir.


Untuk menjawab pertanyaan Anda: Kapan "waktu aktif" mulai dihitung?

Karena uptime adalah nilai internal kernel, yang menandai setiap siklus, ia mulai menghitung ketika kernel telah diinisialisasi. Yaitu, ketika siklus pertama telah berakhir. Bahkan sebelum apa pun di-mount, langsung setelah bootloader memberi kendali pada gambar kernel.

kekacauan
sumber
2
+1, @chaos, apakah akan lebih akurat untuk mengatakan bahwa penghitung waktu aktif dimulai ketika pengendali penghenti waktu diinstal? Apakah kernel mengkonfigurasi handler ini?
Prem
3
@Prem Ini bagian dari inisialisasi kernel. Tepat sebelum inisialisasi scheduler, interupsi timer akan didaftarkan. Ini adalah penghitung waktu yang memanggil iterasi pertama dari kode penjadwal (hanya dengan panggilan fungsi). Jika Anda diinterupsi, ini adalah bacaan yang bagus: github.com/0xAX/linux-insides/blob/master/Initialization/…
chaos
Tetapi terkadang nilai uptime yang dikembalikan dari kernel tidak selalu sama. Seperti yang dihitung dengan cepat, bukan saat boot, jika server menjalankan sinkronisasi waktu, atau berada di bawah beban berat, nilai ini dapat berubah, karena pergeseran pada HZ.
Rfraile
10

Selama saya tahu, uptimedigunakan /proc/uptimeuntuk menghitung waktu kerja sistem. Anda dapat melihatnya dengan lebih jelas di kode sumber 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);
    }
Pembanjir
sumber
1
Saya lebih suka mengatakan bahwa file pseudo /proc/uptimedihitung dari uptime.
Archemar
2
Itu tidak benar. Lihatlah kode sumber di tautan di atas.
Inclooder
6

Pada sistem UNIX standar (berdasarkan sumber asli *), uptimebaca /var/adm/utmpxdan periksa untuk terakhir kali entri reboot.

Dengan kata lain: ini mengambil tanggal yang Anda dapatkan bersama who -bdan kemudian menghitung waktu sejak itu.

*) uptimeadalah tautan ke wprogram dan diperkenalkan oleh BSD sekitar tahun 1980.

schily
sumber
Uhms, saya tidak dapat menemukan /var/adm/utmpxdi sistem saya. Bahkan, bahkan tidak/var/adm
fedorqui
3
Dalam kasus seperti itu, Anda harus menyebutkan jenis OS yang Anda gunakan.
schily
Salahku! Ini adalah Ubuntu 14.04.
fedorqui
OK, pada Solaris, AIX, HP-UX dan * BSD di mana wimplementasi aslinya digunakan, dengan cara ini, tetapi Linux biasanya melakukan hal-hal yang sedikit berbeda.
schily
4
Saya pikir menurut standar , yang Anda maksud tradisional . Standar Unix tidak menentukan uptimeperintah, apalagi bagaimana itu harus diterapkan. AFAICT, OS / X tidak memiliki / var / adm / utmpx. Dan beberapa sistem berbasis Linux telah menerima sertifikasi kepatuhan Unix.
Stéphane Chazelas