logging asynchronous melalui rsyslogd (8) dan menulis peningkatan buffer

10

Pada situs web lalu lintas yang cukup tinggi yang berjalan dalam wadah virtual (VMware) dan kurang penyimpanan lokal, kami telah berhasil meningkatkan throughput (permintaan per detik) secara signifikan dengan beralih dari masuk langsung ke file log (yang berada di penyimpanan jaringan jarak jauh) ke rsyslogd .

Pada dasarnya kami telah beralih dari pencatatan sinkron ke asinkron. Pekerja server web menulis menggunakan syslog (3) ke beberapa buffer memori dan rsyslogd (8) mengirimkan data ke file aktual secara paralel, dan dengan kecepatannya sendiri, sehingga proses tidak memblokir IO saat masuk.

Sejauh ini bagus. Masalahnya adalah bahwa kadang - kadang rsyslogd dicegah dari menulis (misalnya pemadaman jaringan sementara / berkepanjangan) dan buffer yang masuk dengan cepat terisi.

Pertanyaan saya adalah:

  • Bisakah klien memblokir ketika menulis ke rsyslogd menggunakan syslog (3) ?
  • Apakah ada cara untuk melihat statistik rsyslogd , misalnya seberapa besar / penuh buffer?
  • Apakah ada cara untuk meningkatkan ukuran buffer masuk rsyslogd ?
diri sendiri
sumber
2
Apakah Anda pernah memecahkan ini? Jika demikian, saya akan tertarik membaca jawaban Anda.
djeikyb
1
@djeikyb: maaf tidak. Saya melihat minat (suara pada pertanyaan) tetapi belum ada yang menjawabnya. Sepertinya ini membutuhkan menyelam kode sumber.
arielf
1
Anda tidak mengatakan server web mana yang Anda gunakan. Mungkin Anda seharusnya tidak menggunakan syslog sama sekali. Apakah Apache, misalnya, menggunakan syslog untuk login, atau hanya menulis untuk mencatat file? Masuk ke database adalah kemungkinan lain.
blujay

Jawaban:

1

Sejauh yang saya ingat mode default untuk antrian pesan utama di rsyslog adalah array ukuran tetap. Ini memiliki batas untuk elemen 10k atau lebih. Cobalah untuk mengubahnya ke daftar antrean tertaut. Antrian ini akan menangani pesan sesekali Anda dengan lebih baik.

Ya, ada FixedArraydan LinkedListantrian.

hostmaster
sumber
"Coba ubah" ... Bisakah Anda lebih eksplisit? Melihat /etc/rsyslog.conf: Saya tidak melihat apa pun yang terkait dengan jenis antrian yang Anda sebutkan. Apakah ini memerlukan perubahan kode? Di mana dan bagaimana ini dapat dikonfigurasi? Terima kasih!
arielf
1

Jawaban untuk pertanyaan pertama Anda adalah:

Ya, semua panggilan ke syslog () sedang diblokir. Mungkin untuk waktu yang sangat singkat, tetapi masih merupakan panggilan sinkron yang melibatkan deskriptor file. Lihat man 3 sysloglebih banyak detial.

Kecuali jika server Anda menggunakan arsitektur dan primitif asinkron, akan selalu ada penguncian. Ini dapat dikurangi, tetapi tidak dihilangkan, misalnya dengan menggunakan separatethread untuk logging. Untuk dua pertanyaan lain saya tidak benar-benar tahu tetapi pemeriksaan ke kode sumber rsyslogd (serta ke satu untuk keluarga fungsi syslog ()) adalah satu-satunya cara untuk tahu.

Lebih umum, jika Anda memindahkan logging ke server eksternal melalui UDP: 514 "protokol syslog jaringan", maka Anda membawa kemungkinan untuk membuat kunci hampir nol. Dengan kelemahan kemungkinan hilangnya beberapa penebangan saat beban tinggi.

Pertama , di server "asal" Anda perlu memastikan semua logging terjadi melalui syslog. Misalnya, di Apache2 Anda perlu menentukan:

ErrorLog "syslog:daemon"

Untuk server lain, silakan merujuk ke halaman manual yang tepat. Jika Anda tidak dapat memastikan ini, harap diingat bahwa pencatatan pada sistem file dapat dibuat

Kedua , dalam konfigurasi rsyslogd yang berasal Anda meminta untuk mengarahkan semua lalu lintas syslog untuk fasilitas yang Anda pilih ("daemon" dalam contoh ini) ke satu atau lebih server syslog eksternal. Dalam file konfigurasi rsyslog Anda dapat menentukan:

daemon.* @192.168.128.1
daemon.* @192.168.254.1

untuk memiliki dua salinan log untuk dikirim ke dua server yang berbeda secara bersamaan.

Ketiga , di server tujuan Anda mengaktifkan penerimaan pesan syslog melalui UDP: 514. Itu ada dalam file konfigurasi rsyslogd (tujuan) dan biasanya dinonaktifkan oleh defualt (itu akan cukup untuk menghapus #s yang memimpin:

$ModLoad imudp
$UDPServerRun 514

Keempat , opsional tetapi sangat dianjurkan, saya juga akan mengaktifkan cap waktu resolusi tinggi:

$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

Juga opsi ini biasanya dinonaktifkan secara default (mengapa di Bumi?).

EnzoR
sumber