Debugging lock-up - systemd kehilangan log saya

8

Sejak saya "memutakhirkan" ke systemd di Arch Linux, saya terus kehilangan log ketika terjadi penguncian yang tidak terduga. Saya menemukan masalah kehilangan-log yang sama satu bulan yang lalu dan hanya menemukan masalah lagi. Ada juga konfirmasi independen lainnya .

Situasi:

  • Saat melakukan beberapa hal di Jawa dan dengan utilitas terkait jaringan, saya melihat bahwa KDE (jam) dibekukan. Kipas CPU menjadi bising dan panasnya meningkat. Pointer mouse masih bisa dipindahkan.
  • Saya mencoba ssh dari komputer lain (gagal karena "tidak ada rute ke host")
  • Saya menunggu beberapa menit, mungkin pengawas NMI dapat membunuh tugas yang menyinggung. Tidak ada dadu.
  • Ctrl+ Alt+ F1tidak berfungsi, bahkan setelah SysRq+R
  • Karena langkah-langkah di atas tidak berhasil, saya memutuskan untuk mengeluarkan urutan SysRq REI. Setelah itu E, layar menjadi hitam, tetapi tidak ada konsol juga. Bahkan setelah SysRq+K
  • Jadi, sesi ini tampaknya hilang, satu-satunya hal yang dapat dilakukan adalah mengumpulkan informasi debug. Melihat Wikipedia , saya memutuskan untuk menekan SysRq+ d(tampilan memegang kunci) di antara beberapa lainnya.
  • Setelah menekan SysRq+ Ssaya menunggu sebentar dan kemudian reboot dengan SysRq+ B.
  • Setelah reboot dan masuk ke konsol, saya tidak melihat jejak crash. Entri yang terakhir dicatat dari menggunakan Wireshark, tetapi masih ada celah 45 menit.

(Saya menjalankan Linux v3.8-rc5-218-ga56e160 btw)

Jadi, bagaimana saya bisa memastikan bahwa log saya dipertahankan ketika reboot normal karena penguncian?

Lekensteyn
sumber
apakah Anda tahu apakah masalah ini akhirnya diatasi oleh systemdatau tidak? Baru-baru ini saya melihat masalah serupa. Saya telah memposting detailnya di sini -> unix.stackexchange.com/questions/414871/…
kaptan
@kaptan systemd masih tidak secara langsung menyiram log ke penyimpanan persisten. Lihat SyncIntervalSecopsi (antara lain) pada manusia journald.conf(5).
Lekensteyn
tnx untuk balasan Anda. from man jounrnald.conf(5): SyncIntervalSec = ... Perhatikan bahwa sinkronisasi dilakukan tanpa syarat segera setelah pesan log dari prioritas CRIT, ALERT atau EMERG telah dicatat. Pengaturan ini karenanya hanya berlaku untuk pesan tingkat ERR, PERINGATAN, PEMBERITAHUAN, INFO, DEBUG. Bukankah ini hanya berarti bahwa jika kesalahan kritis dicatat itu seharusnya disinkronkan "segera" tanpa menunggu interval? Jadi artinya jika terjadi kesalahan kritis kita seharusnya melihatnya dalam journaldlog. Apakah saya kehilangan sesuatu ?!
kaptan
@kaptan Sangat sedikit pesan yang dicatat dengan tingkat keparahan CRIT. Jika aplikasi memang menggunakan pesan yang disetel dengan properti ini (kebanyakan tidak), ini dapat memicu pembilasan. Dalam kasus lain (misalnya ERR), itu tidak akan segera memerah.
Lekensteyn

Jawaban:

4

Jadi saya bertanya pada saluran IRC #systemd dan ternyata journald (daemon logging dari systemd) tidak secara berkala menyiram log ke disk sama sekali. Ini berarti bahwa log Anda selalu berisiko kapan saja.

Mengirim SIGUSR2ke journaldpenyebab log untuk ditulis ke disk, tetapi jika Anda melakukan ini beberapa kali, banyak file akan dibuat. (opsi ini sebenarnya digambarkan sebagai "rotating log").

Pada akhirnya, saya memutuskan untuk pergi dengan saran lain: menggunakan daemon syslog khusus untuk mengumpulkan log kernel. Sebagai rsyslog disarankan (dan saya sudah berpengalaman dengan itu), saya mengeksplorasi opsi itu lebih lanjut. Saya telah menulis beberapa detail lagi di Arch Wiki tentang penggunaan rsyslog.

Idenya adalah menjalankan rsyslog, hanya mengumpulkan data dari fasilitas kernel. Ketika rsyslog membaca dari /proc/kmsg(yang hanya mengizinkan satu pembaca) dan journald membaca dari /dev/kmsg(banyak pembaca diizinkan), tidak ada cara daemon kehilangan log (sangat penting bagi saya!). Konfigurasikan rsyslog untuk menulis pesan kernel ke file dan pastikan file ini diputar untuk mencegah memakan ruang disk Anda.

Solusi ini tidak sempurna:

  • Log lain (misalnya, dari NetworkManager) hilang. Ini dapat diselesaikan dengan meneruskan lebih banyak log dari syslog ke journald (ini berarti duplikasi!)
  • Duplikasi log. Pesan-pesan kernel ditulis ke dua file. Ini bukan masalah, secara umum jumlah log kecil dan Anda lebih suka memiliki lebih banyak salinan log daripada tidak sama sekali. Anda juga dapat menggunakan alat cepat seperti greppada file log tunggal atau lebih lambat, tetapi lebih bagus journalctl.

Ada item TODO untuk pembilasan log lebih sering, tetapi itu masih belum cukup andal:

jurnal: kirim pesan penanda setiap sekarang dan kemudian, dan segera sinkronkan dengan fdatasync () sesudahnya, untuk mendapatkan sinkronisasi yang dijamin setiap jam.

Sekarang, semoga systemd / journald akan mendapatkan opsi untuk menulis log ke disk, tetapi sementara itu kita dapat menggabungkan alat untuk mencapai tujuan.

Lekensteyn
sumber
2

Ada dua pembaruan:

  1. Sekarang, semoga systemd / journald akan mendapatkan opsi untuk menulis log ke disk, tetapi sementara itu kita dapat menggabungkan alat untuk mencapai tujuan.

Ada opsi --sync:

Meminta daemon jurnal untuk menulis semua data jurnal yang belum ditulis ke sistem file pendukung dan menyinkronkan semua jurnal. Panggilan ini tidak kembali sampai operasi sinkronisasi selesai. Perintah ini menjamin bahwa setiap pesan log yang ditulis sebelum doa disimpan dengan aman di disk pada saat ia kembali.

--synctersedia sejak v228:

journalctl memperoleh sakelar "--sync" baru yang meminta daemon jurnal untuk menulis semua pesan log yang tidak tertulis sejauh ini ke disk dan menyinkronkan file, sebelum kembali.

  1. Ternyata journald (daemon logging dari systemd) tidak secara berkala menyiram log ke disk sama sekali. Ini berarti bahwa log Anda selalu berisiko kapan saja.

man journald.conf(5) mengatakan:

SyncIntervalSec =

Batas waktu sebelum menyinkronkan file jurnal ke disk. Setelah disinkronkan, file jurnal ditempatkan dalam status OFFLINE. Perhatikan bahwa sinkronisasi dilakukan tanpa syarat segera setelah pesan log dari prioritas CRIT, ALERT atau EMERG telah dicatat. Pengaturan ini karenanya hanya berlaku untuk pesan tingkat ERR, PERINGATAN, PEMBERITAHUAN, INFO, DEBUG. Batas waktu default adalah 5 menit.

SyncIntervalSec=tersedia sejak v199:

journald sekarang akan secara eksplisit menyiram file jurnal ke disk paling lambat 5 menit setelah setiap penulisan. File tersebut kemudian akan ditandai secara offline hingga penulisan berikutnya. Ini harus meningkatkan keandalan jika terjadi kerusakan. Penundaan sinkronisasi dapat dikonfigurasi melalui SyncIntervalSec = di journald.conf.

Lihat juga:

journald: kirim SIGTERM / SIGINT dengan prioritas rendah

Mari kita pastikan untuk memproses semua data log yang antri sebelum keluar, sehingga kita tidak perlu kehilangan pesan saat dimatikan.

Evgeny Vereshchagin
sumber
Informasi bagus, tetapi bukankah "[journald] tidak secara berkala menyiram log ke disk" yang bertentangan dengan opsi SyncIntervalSec?
Lekensteyn
"[journald] tidak secara berkala membersihkan log ke disk" adalah kutipan dari jawaban asli. "SyncIntervalSec" adalah pembaruan.
Evgeny Vereshchagin
Ah, saya tidak memperhatikan bahwa posting saya yang lain dikutip.
Formatnya