高IO負荷でrrdgraph生成が失敗する


8

私たちは4コアのCPUプロダクションシステムを使用しており、多くのcronジョブを実行します。一定のprocキューと通常の負荷は〜1.5です。

夜間は、postgresでIOを集中的に使用します。負荷/メモリ使用量を示すグラフを生成します(rrd-updates.sh)。これは、高IO負荷の状況で時々「失敗」します。ほぼ毎晩発生していますが、すべての高IO状況では発生しません。

私の "通常の"解決策は、postgresを適切にイオン化し、グラフ生成のプリオを増やすことです。しかし、これはまだ失敗します。グラフ生成は、flockを使用したセミスレッドプルーフです。私は実行時間をログに記録します。グラフ生成では、高IO負荷時に最大5分であり、結果として最大4分間グラフが失われるようです。
タイムフレームはpostgresアクティビティと正確に一致します(これは1日中に発生することもありますが、それほど頻繁ではありません)。 )は問題を解決しませんでした。

データが収集されないと仮定すると、追加の問題は、どういうわけかまだ機能していないiceice / niceです。
90%のIOwaitと100のロードがあっても、5秒以上の遅延なしで(少なくともテストでは)、データ生成コマンドを無料で使用できました。

悲しいことに、テストでこれを正確に再現できませんでした(仮想化された開発システムのみ)

バージョン:

カーネル2.6.32-5-686-bigmem
Debian Squeeze rrdtool 1.4.3 ハードウェア:ハードウェアRAID1
マウントオプションのLVMを備えたSAS 15K RPM HDD :ext3とrw、errors = remount-ro
スケジューラー:CFQ
crontab:

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

RetcacheのgithubにOetiker氏からのsomhowに関連している可能性のあるバグがあるようです:https :
//github.com/oetiker/rrdtool-1.x/issues/326

これは実際には私の問題(同時書き込み)である可能性がありますが、cronジョブが失敗しないことを説明していません。仮定では、実際に2つの同時書き込みflock -nがあると、終了コード1が返されます(テストで確認されたmanページごと)。出力も電子メールで届かず、cronjobが他の時間に実際に正常に実行されるという観察どういうわけか失われました。

出力例: 行が欠落しているCPU負荷グラフ

コメントに基づいて、更新スクリプトの重要なソースを追加しました。

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}')

何を見逃すか、どこでさらに確認できますか?

覚えておいてください:生産的なシステムなので、開発、スタックトレース、または同様のものが利用可能またはインストール可能ではありません。


1
MRTGがRRDgraphに置き換えられたときのことです。古いものから新しいものへの驚異的な変更の1つは、RRDgraphが実際に画像を生成するのは、表示要求があったときだけであるということです。古いMRTGは、5分ごとにすべてのデータポイントに対してまったく新しいグラフを生成しました。あなたの問題は、グラフのレンダリングではなく、データ収集にあります。
ericx 2014

@ericxコメントありがとうございます。データ生成のソースを追加しました。それでも問題は、IOnice / niceではなくvmstatコマンドが何らかの理由で正しく機能していないと思いますか?もしそうなら、なぜあなたはそのように考えますか?
Dennis Nolte 2014

あなたのcronキャプチャはどこかにSTDERRですか?FreeBSDの私には、通常、これらの下を実行periodic every5し、私が持っている/var/log/periodic.every5、一般的にすべてのエラーをキャプチャすることを。また、3つのスクリプトをずらし、場合によっては順番を入れ替えて、特にハングするかどうかを確認します。私のRRDToolの経験のほとんどは、cricketそれ自体のロギングがあったものでした。cricketログは、トラブルを見つけるための優れていました。本当に毎分収集していますか?(* * * * *の代わりに* / 5 * * * *)グラフの粒度はどれくらいですか?RRDのデフォルトは5分間隔です。
ericx 2014

これは、最初にそれらを作成するために使用されたコマンドです:create cpu.rrd --step 300 DS:sys:GAUGE:70:U:U DS:user:GAUGE:70:U:U RRA:AVERAGE:0.01:1: 6351なので、これは別のバグを見つけたことを意味します。ありがとうございます。テスト用にそのスクリプトのSTDOUTとSTDERRを書き直しましたが、何もログに記録されなかったので、最初に試したときは役に立ちませんでした。明日出力を追加します
Dennis Nolte 2014

1
「失敗」を理解するという点では、rrdtoolの表示は5分のポーリングサイクルに基づいています。次のサイクルが始まる前に処理を終了しない場合、およびデータ収集とグラフ生成が同じ処理操作の一部である場合、データポイントが失われます。
mc0e 2014年

回答:


2

グラフを更新できないのはrrdtoolではなく、この時点ではデータを測定できないためです。ちなみに、CPUとメモリの統計情報を測定する方法は、すぐに結果が得られるため、間違っています。CPUとメモリの負荷は60秒間隔で大幅に変化する可能性がありますが、1つの値しか取得しません。間隔での平均データを提供するSNMPデータを取得することを検討する必要があります。さらに、パイプ全体がsnmpget呼び出しよりも高価で遅くなるようです。ギャップの主な理由である可能性があります。


ちょうどフォローアップとして、それはこれでした。リソースを大量に消費するプロセスを別のサーバーに移動できたら、グラフは適切に生成されます。
Dennis Nolte 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.