generasi rrdgraph gagal pada beban IO tinggi

8

Kami memiliki sistem produksi CPU 4 inti yang melakukan banyak cronjobs, memiliki antrian proc konstan dan beban biasa ~ 1,5.

Pada malam hari kami melakukan beberapa IO intensif dengan postgres. Kami menghasilkan grafik yang menunjukkan penggunaan beban / memori (rrd-updates.sh) Ini "gagal" kadang-kadang pada situasi beban IO tinggi. Ini terjadi hampir setiap malam, tetapi tidak pada setiap situasi IO tinggi.

Solusi "normal" saya adalah untuk memperbaiki dan memperbaiki hal-hal postgres dan meningkatkan prio dari pembuatan grafik. Namun ini masih gagal. Pembuatan grafik semi-thread-proof dengan kawanan. Saya mencatat waktu eksekusi dan untuk pembuatan grafik, kapasitasnya hingga 5 menit selama beban IO tinggi, tampaknya menghasilkan grafik yang hilang hingga 4 menit.
Kerangka waktu persis sesuai dengan aktivitas postgres (ini kadang-kadang terjadi pada siang hari juga, meskipun tidak sering) Mengionisasi hingga realtime prio (C1 N6 graph_cron vs C2 N3 postgres), jauh di atas postgres (-5 graph_cron vs 10 postgres ) tidak menyelesaikan masalah.

Dengan asumsi data tidak dikumpulkan, masalah tambahan adalah ionice / nice entah bagaimana masih tidak berfungsi.
Bahkan dengan 90% IOwait dan beban 100 saya masih dapat menggunakan perintah pembuatan data gratis tanpa lebih dari mungkin penundaan 5 detik (untuk menguji setidaknya).

Sayangnya saya belum dapat mereproduksi ini persis dalam pengujian (hanya memiliki sistem dev tervirtualisasi)

Versi:

Kernel 2.6.32-5-686-bigmem
Debian Squeeze rrdtool 1.4.3 Hardware: SAS 15K RPM HDD dengan LVM di hardware RAID1
mount options: ext3 with rw, errors = remount-ro
Scheduler: CFQ
crontab:

* * * * *               root    flock -n /var/lock/rrd-updates.sh nice -n-1 ionice -c1 -n7 /opt/bin/rrd-updates.sh

Tampaknya ada BUG entah bagaimana terkait mungkin dari Mr Oetiker di github untuk rrdcache:
https://github.com/oetiker/rrdtool-1.x/issues/326

Ini sebenarnya bisa menjadi masalah saya (menulis bersamaan) tetapi tidak menjelaskan cronjob untuk tidak gagal. Dalam asumsi saya benar-benar memiliki 2 menulis bersamaan flock -nakan mengembalikan kode keluar 1 (per halaman manual, dikonfirmasi dalam pengujian) Karena saya tidak mendapatkan email dengan output baik dan pengamatan bahwa cronjob benar-benar berjalan dengan baik sepanjang waktu saya entah bagaimana hilang.

Contoh output: cpu memuat grafik dengan garis yang hilang

Berdasarkan komentar saya menambahkan sumber penting dari skrip pembaruan.

rrdtool update /var/rrd/cpu.rrd $(vmstat 5 2 | tail -n 1 | awk '{print "N:"$14":"$13}')
rrdtool update /var/rrd/mem.rrd $(free | grep Mem: | awk '{print "N:"$2":"$3":"$4}')
rrdtool update /var/rrd/mem_bfcach.rrd $(free | grep buffers/cache: | awk '{print "N:"$3+$4":"$3":"$4}')

Apa yang saya lewatkan atau di mana saya dapat memeriksa lebih lanjut?

Ingat: Sistem produktif jadi tidak ada dev, tidak ada stacktrace atau sejenisnya yang tersedia atau dapat diinstal.

Dennis Nolte
sumber
1
Jalan kembali ketika MRTG digantikan oleh RRDgraph. Salah satu perubahan luar biasa dari yang lama ke yang baru adalah bahwa RRDgraph sebenarnya menghasilkan gambar hanya ketika ada permintaan tampilan. MRTG lama menghasilkan grafik baru untuk setiap titik data setiap lima menit. Masalah Anda adalah pengumpulan data, bukan grafik yang di-render.
ericx
@ ericx terima kasih atas komentar Anda. Saya menambahkan sumber untuk pembuatan data. Apakah Anda masih berpikir masalahnya adalah perintah vmstat dan bukannya IOnice / nice, entah bagaimana tidak berfungsi dengan benar? Jika demikian, mengapa Anda berpikiran seperti itu?
Dennis Nolte
Apakah Anda cronmenangkap STDERR di mana saja? Pada FreeBSD saya biasanya menjalankan ini di bawah periodic every5dan saya punya /var/log/periodic.every5yang umumnya menangkap kesalahan. Saya juga akan mengejutkan tiga skrip dan mungkin memutar urutan untuk melihat apakah salah satu hang tertentu. Sebagian besar pengalaman RRDTool saya adalah dengan cricketyang memiliki pencatatan sendiri. The cricketlog yang sangat baik untuk menemukan masalah. Apakah Anda benar-benar mengumpulkan setiap menit? (* * * * * bukan * / 5 * * * *) Apa rincian grafiknya? RRD default ke interval 5 menit.
ericx
ini adalah perintah yang awalnya digunakan untuk membuat mereka: create cpu.rrd --step 300 DS: sys: GAUGE: 70: U: U DS: pengguna: GAUGE: 70: U: U RRA: AVERAGE: 0,01: 1: 6351 jadi ini berarti Anda baru saja menemukan bug lain, terima kasih. saya menulis ulang STDOUT dan STDERR untuk skrip itu untuk pengujian, tidak ada yang dicatat yang membantu saya kembali ketika saya mencoba pertama kali. saya akan menambahkan hasilnya besok
Dennis Nolte
1
Dalam hal memahami "kegagalan", tampilan rrdtool didasarkan pada siklus polling 5 menit. Jika Anda tidak menyelesaikan pemrosesan satu siklus sebelum siklus berikutnya akan dimulai, dan jika pengumpulan data dan produksi grafik Anda adalah bagian dari operasi pemrosesan yang sama, maka Anda akan mendapatkan titik data yang hilang.
mc0e

Jawaban:

2

Saya kira itu bukan rrdtool yang tidak dapat memperbarui grafik, tetapi data tidak dapat diukur pada saat ini. Omong-omong, metode Anda mengukur statistik CPU dan memori salah, karena memberikan Anda hasil instan. CPU dan Beban memori dapat berubah secara drastis sepanjang interval 60 detik, tetapi Anda hanya akan mengambil satu nilai. Anda harus benar-benar mempertimbangkan untuk mengambil data SNMP, yang memberikan data rata-rata pada suatu interval. Plus, seluruh pipa tampaknya lebih mahal dan lambat dari panggilan snmpget. Bisa jadi ada celah utama alasannya.

drookie
sumber
hanya sebagai tindak lanjut, inilah ini. Setelah kami dapat memindahkan beberapa proses sumber daya yang lapar ke server lain, grafik dapat dihasilkan dengan baik.
Dennis Nolte