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 -n
akan 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:
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.
cron
menangkap STDERR di mana saja? Pada FreeBSD saya biasanya menjalankan ini di bawah periodic every5
dan saya punya /var/log/periodic.every5
yang 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 cricket
yang memiliki pencatatan sendiri. The cricket
log yang sangat baik untuk menemukan masalah. Apakah Anda benar-benar mengumpulkan setiap menit? (* * * * * bukan * / 5 * * * *) Apa rincian grafiknya? RRD default ke interval 5 menit.