Corestating / var / log / * cap waktu

20

/var/log/messages,, /var/log/syslogdan beberapa file log lainnya menggunakan stempel waktu yang berisi waktu absolut, seperti Jan 13 14:13:10.

/var/log/Xorg.0.logdan /var/log/dmesg, serta output dari $ dmesg, gunakan format yang terlihat seperti

[50595.991610] malkovich: malkovich malkovich malkovich malkovich

Saya menduga / mengumpulkan bahwa angka mewakili detik dan mikrodetik sejak startup.

Namun, upaya saya untuk mengkorelasikan dua set cap waktu ini (menggunakan output dari uptime) memberikan perbedaan sekitar 5000 detik.

Ini kira-kira jumlah waktu komputer saya diskors.

Apakah ada cara mudah untuk memetakan cap waktu numerik yang digunakan oleh dmesg dan Xorg menjadi cap waktu absolut?

memperbarui

Sebagai langkah awal menuju penyelesaian masalah ini, dan juga semoga membuat pertanyaan saya sedikit lebih jelas, saya telah menulis skrip Python untuk mengurai /var/log/syslogdan menampilkan waktu yang miring. Di komputer saya, menjalankan ubuntu 10.10, file itu berisi banyak baris yang berasal dari kernel yang dicap baik dengan stempel waktu dmesg dan stempel waktu syslog. Script menampilkan baris untuk setiap baris dalam file yang berisi cap waktu kernel.

Pemakaian:

python syslogdriver.py /var/log/syslog | column -nts $'\t'

Output yang dihapuskan (lihat di bawah untuk definisi kolom):

abs              abs_since_boot  rel_time      rel_offset  message
Jan 13 07:49:15  32842.1276569   32842.301498  0           malkovich malkovich

... rel_offsetadalah 0 untuk semua jalur intervensi ...

Jan 13 09:55:14  40401.1276569   40401.306386  0           PM: Syncing filesystems ... done.
Jan 13 09:55:14  40401.1276569   40401.347469  0           PM: Preparing system for mem sleep
Jan 13 11:23:21  45688.1276569   40402.128198  -5280       Skipping EDID probe due to cached edid
Jan 13 11:23:21  45688.1276569   40402.729152  -5280       Freezing user space processes ... (elapsed 0.03 seconds) done.
Jan 13 11:23:21  45688.1276569   40402.760110  -5280       Freezing remaining freezable tasks ... (elapsed 0.01 seconds) done.
Jan 13 11:23:21  45688.1276569   40402.776102  -5280       PM: Entering mem sleep

... rel_offsetadalah -5280 untuk semua saluran yang tersisa ...

Jan 13 11:23:21  45688.1276569   40403.149074  -5280       ACPI: Preparing to enter system sleep state S3
Jan 13 11:23:21  45688.1276569   40403.149477  -5280       PM: Saving platform NVS memory
Jan 13 11:23:21  45688.1276569   40403.149495  -5280       Disabling non-boot CPUs ...
Jan 13 11:23:21  45688.1276569   40403.149495  -5280       Back to C!
Jan 13 11:23:21  45688.1276569   40403.149495  -5280       PM: Restoring platform NVS memory
Jan 13 11:23:21  45688.1276569   40403.151034  -5280       ACPI: Waking up from system sleep state S3

... Baris terakhir dari sedikit lebih jauh ke bawah, masih jauh di atas akhir output. Beberapa dari mereka mungkin ditulis ke dmesgbuffer bundar sebelum penangguhan terjadi, dan hanya diperbanyak syslogsetelah itu. Ini menjelaskan mengapa mereka semua memiliki stempel waktu syslog yang sama.

Definisi kolom:

abs adalah waktu dicatat oleh syslog.

abs_since_bootadalah waktu yang sama dalam hitungan detik sejak startup sistem, berdasarkan pada isi /proc/uptimedan nilai time.time().

rel_time adalah cap waktu kernel.

rel_offsetperbedaan antara abs_since_bootdan rel_time. Saya membulatkan ini ke puluhan detik untuk menghindari kesalahan satu kali karena syslogcap waktu absolut (yaitu yang dihasilkan) hanya memiliki ketepatan detik. Itu sebenarnya bukan cara yang tepat untuk melakukannya, karena itu benar-benar (saya pikir ..) hanya menghasilkan peluang lebih kecil untuk memiliki kesalahan off-by-10. Jika seseorang memiliki ide yang lebih baik, beri tahu saya.

Saya juga memiliki beberapa pertanyaan tentang format tanggal syslog; khususnya, saya bertanya-tanya apakah setahun pernah muncul di dalamnya. Saya kira tidak, dan dalam hal apa pun kemungkinan besar bisa membantu diri saya sendiri untuk informasi itu di TFM, tetapi jika seseorang mengetahui hal itu akan berguna. ..Menganggap, tentu saja, bahwa seseorang menggunakan skrip ini di beberapa titik di masa depan, bukan hanya menerobos beberapa baris kode Perl.

Berikutnya:

Jadi, kecuali jika beberapa sambutan selamat datang kepada saya diberikan oleh salah satu dari Anda, langkah saya berikutnya adalah menambahkan fungsi untuk mendapatkan waktu yang miring untuk cap waktu kernel yang diberikan. Saya seharusnya dapat memberi makan script satu atau satu set syslog, bersama dengan cap waktu kernel, untuk mendapatkan cap waktu absolut. Lalu saya bisa kembali ke debugging masalah Xorg saya, yang melarikan diri saya saat ini.

intuisi
sumber
1
Saya pikir ini memenuhi syarat sebagai bug dan harus dilaporkan. BTW syslog-ng menggunakan cap waktu waras yang dapat Anda sortir sort, memiliki tahun, zona waktu, dll. +1 untuk skrip python.
stribika
@stribika: apakah itu masalah kernel atau masalah syslog? Atau keduanya? Sepertinya syslog perlu diberi tahu bahwa sistem telah ditangguhkan .. mungkin bisa melakukannya sendiri dengan menangguhkan dan melanjutkan pengait.
intuited
Bagi saya sepertinya kernel itu salah. Nilai rel_time tidak "melewatkan" waktu ketika sistem ditangguhkan. Namun saya merasa aneh bahwa kemiringan dimulai sebelum penundaan benar-benar terjadi. Nilai-nilainya sudah salah Freezing user space processesyang jelas dilakukan sebelum tidur.
stribika
2
@stribika: Teori kerja saya tentang itu adalah bahwa peristiwa itu tidak didorong ke syslog sampai setelah resume, karena mereka terjadi setelah syslog itu sendiri telah ditangguhkan.
intuited
@stribika: Juga, Anda benar tentang kernel yang "salah": seperti yang saya pahami (setelah mempertimbangkan kembali), syslog hanya awalan stempel waktu absolut ke teks (dimulai dengan [12345.6789]..) yang dipancarkan oleh kernel, sehingga ia melakukan hal-hal dengan benar , tunduk pada masalah yang dibahas oleh komentar terakhir saya. Saya tidak yakin apa yang seharusnya dilakukan kernel di sini; itu tergantung pada apa cap waktu relatif startup yang dimaksudkan untuk menunjukkan. Waktu berjalan (sebagai lawan dari waktu sejak boot) mungkin bermakna dalam beberapa konteks. Saya kira idealnya akan ada catatan yang dapat diandalkan dari kedua nilai tersebut.
intuited

Jawaban:

4

Masalah yang menarik, Tidak yakin saya pernah mencoba melakukan ini. Tapi saya perhatikan cap waktu yang Anda bicarakan dan saya selalu menganggapnya sebagai detik sejak bootup.

Di syslog yang saya miliki di server, saya punya:

Jan 10 19:58:55 wdgitial kernel: [    0.000000] Initializing cgroup subsys cpuset
Jan 10 19:58:55 wdgitial kernel: [    0.000000] Initializing cgroup subsys cpu
Jan 10 19:58:55 wdgitial kernel: [    0.000000] Linux version 2.6.32-21-server (buildd@yellow) (gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5) ) #32-Ubuntu SMP Fri Apr 16     09:17:34 UTC 2010 (Ubuntu 2.6.32-21.32-server 2.6.32.11+drm33.2)
Jan 10 19:58:55 wdgitial kernel: [    0.000000] Command line:  root=/dev/xvda1 ro quiet splash

Saya akan membayangkan ini cukup konsisten di antara kebanyakan distro Linux karena ini adalah kernel yang meludahkannya.

Dan di sini saya punya tanggal bersama dengan stempel waktu.

Ryan Gibbons
sumber
3

Anda bisa mencobanya:

Pertama, dapatkan stempel waktu dari file dmesg (asumsi saya adalah ini akan menjadi waktu dmesg 0). Anda akan menggunakannya

ls -l --waktu-gaya = +% s

/var/log$ ls -l --time-style=+%s dmesg
-rw-r----- 1 root adm 56181 1294941018 dmesg

Anda dapat mengubah detik menjadi tanggal yang dapat dibaca oleh manusia

perl -e 'print scalar localtime(1294941018)' 

Jadi untuk melihat waktu acara yang dapat dibaca, tambahkan detik dari acara di dmesg. Jika acara dmesg adalah 55.290387 detik, tambahkan 55 atau 55.290387:

perl -e 'print scalar localtime(1294953978 + 55)'

Cara lain untuk mengubah detik berakar zaman menjadi waktu yang dapat dibaca adalah dengan menggunakan tanggal -d seperti yang disarankan. Jika Anda memberi tahu 'tanggal' untuk mewakili waktu yang diberikan dengan -d, Anda dapat menunjukkan bahwa waktu yang akan dikonversi adalah dalam detik-sejak-zaman-dengan menggunakan @.

date -d "@1294953978"

Ini memberi Anda sesuatu seperti "Kamis 13 Jan 15:26:18 CST 2011" sebagai output.

tanggal +% s
akan mencetak waktu saat ini dalam format detik sejak zaman.

Saya tidak ingat bagaimana melakukan shell matematika, jadi saya biasanya menggunakan metode perl seperti di atas. :)

belacqua
sumber
1
@ jgbelacqua: Anda mau date -d @$((1294953978 + 55)), setidaknya di bawah bash. Namun, beberapa cap waktu kernel miring, yang berarti bahwa waktu yang dihasilkan oleh metode ini akan lebih awal dari cap waktu yang sesuai di /var/log/syslog. Sepertinya ini terjadi sebagai akibat dari peristiwa suspend-to-RAM, mungkin di samping hibernasi dan mungkin beberapa hal lainnya, karena waktu kernel tidak bertambah selama periode tersebut. Lihat pembaruan pertanyaan untuk info lebih lanjut.
intuited
2

Cara termudah untuk memetakan nomor dari dmesg ke tanggal adalah menggunakan dateprogram.

date -d "-50595 seconds"

Perintah ini menampilkan tanggal untuk waktu saat ini minus 50595 detik.

Dari man date:

-d, --date=STRING
       display time described by STRING, not `now'

Jumlahnya sama dengan waktu dihidupkan, bukan waktu yang berlalu sejak waktu boot.

Lekensteyn
sumber
2

Karena Anda mencatat waktu condong berubah selama penangguhan / resume, saya perhatikan ini didokumentasikan di setidaknya satu tempat. Halaman manual dmesg (1) mengatakan:

Sumber waktu yang digunakan untuk log tidak diperbarui setelah sistem SUSPEND / RESUME.

Saya tidak dapat menemukan cara untuk membuat kernel menjaga cap waktu ini tetap sinkron dengan waktu dinding.

Andrew
sumber
1

Cepat, kotor, berhasil.

$ dmesg | grep 3w | perl /root/print_time_offset.pl

Isi skrip itu:

$ cat /root/print_time_offset.pl

#!/usr/bin/perl

$uptime = `cat /proc/uptime | awk '{print $1}';`;
$boot = time() - $uptime;
chomp $boot;
while (<STDIN>) {
        if ($_ =~ /^\[([\s\d\.]+)\]/) {
                $time_offset = $1;
        }
        $real_time = sprintf scalar localtime($boot + $time_offset);
        $_ =~ s/\[[\s\d\.]+\]/\[$real_time\]/;
        print $_;
}

Output sampel adalah sebagai berikut:

[Mon Feb 21 23:06:33 2011] 3ware 9000 Storage Controller device driver for Linux v2.26.02.012.
[Mon Feb 21 23:06:33 2011] 3w-9xxx 0000:03:00.0: PCI INT A -> GSI 16 (level, low) -> IRQ 16
[Mon Feb 21 23:06:33 2011] 3w-9xxx 0000:03:00.0: setting latency timer to 64
[Mon Feb 21 23:06:33 2011] scsi4 : 3ware 9000 Storage Controller
[Mon Feb 21 23:06:33 2011] 3w-9xxx: scsi4: Found a 3ware 9000 Storage Controller at 0xfbcde000, IRQ: 16.
[Mon Feb 21 23:06:34 2011] 3w-9xxx: scsi4: Firmware FE9X 4.08.00.006, BIOS BE9X 4.08.00.001, Ports: 4.
[Mon Feb 21 23:06:35 2011] 3w-9xxx: scsi4: ERROR: (0x03:0x0101): Invalid command opcode:opcode=0x85.
[Mon Feb 21 23:06:35 2011] 3w-9xxx: scsi4: ERROR: (0x03:0x0101): Invalid command opcode:opcode=0x85.
[Mon Feb 21 23:06:35 2011] 3w-9xxx: scsi4: ERROR: (0x03:0x0101): Invalid command opcode:opcode=0x85.
[Mon Feb 21 23:06:35 2011] 3w-9xxx: scsi4: ERROR: (0x03:0x0101): Invalid command opcode:opcode=0x85.
[Mon Feb 21 23:06:35 2011] 3w-9xxx: scsi4: ERROR: (0x03:0x0101): Invalid command opcode:opcode=0x85.
[Mon Feb 21 23:06:35 2011] 3w-9xxx: scsi4: ERROR: (0x03:0x0101): Invalid command opcode:opcode=0x85.
[Sat Feb 26 02:01:01 2011] 3w-9xxx: scsi4: AEN: INFO (0x04:0x0029): Verify started:unit=0, subunit=1.
[Sat Feb 26 02:01:01 2011] 3w-9xxx: scsi4: AEN: INFO (0x04:0x0029): Verify started:unit=0, subunit=0.
[Sat Feb 26 16:49:13 2011] 3w-9xxx: scsi4: AEN: INFO (0x04:0x002B): Verify completed:unit=0, subunit=1.
[Sat Feb 26 17:07:19 2011] 3w-9xxx: scsi4: AEN: INFO (0x04:0x002B): Verify completed:unit=0, subunit=0.
[Sat Mar  5 02:00:16 2011] 3w-9xxx: scsi4: AEN: INFO (0x04:0x0029): Verify started:unit=0, subunit=1.
[Sat Mar  5 02:00:16 2011] 3w-9xxx: scsi4: AEN: INFO (0x04:0x0029): Verify started:unit=0, subunit=0.
[Sat Mar  5 18:48:57 2011] 3w-9xxx: scsi4: AEN: INFO (0x04:0x002B): Verify completed:unit=0, subunit=1.
[Sat Mar  5 19:05:17 2011] 3w-9xxx: scsi4: AEN: INFO (0x04:0x002B): Verify completed:unit=0, subunit=0.
[Sat Mar 12 02:00:30 2011] 3w-9xxx: scsi4: AEN: INFO (0x04:0x0029): Verify started:unit=0, subunit=1.
[Sat Mar 12 02:00:30 2011] 3w-9xxx: scsi4: AEN: INFO (0x04:0x0029): Verify started:unit=0, subunit=0.
Dacav
sumber
1
Saya kira Anda hanya membaca beberapa paragraf pertama dari pertanyaan itu. Lihat lagi dengan lebih detail. Atau, sebagai alternatif, coba menangguhkan komputer Anda dan memeriksa untuk melihat apakah skrip Anda dengan benar melaporkan cap waktu absolut dari pesan yang baru dicatat.
intuited