zabbix-1.8.1について

昨日zabbix-1.8.1がリリースされたので
早速インストールして動作確認したところ
テンプレートのインポート・エクスポートは
上手く動作しました。

動作確認時に2点ほど気になる点が有ったので質問させて下さい。

1:ディスク容量の取得値がおかしい
2:zabbix_server.confのTimeout設定

1は、linux_templateの流用のvfs.fs.size[/,free]などで
ディスク容量を取得しているのですが、57GBしかないのに
35.56TBと表示されています。
試しに他のパーティションも取得したところ、そちらも
56GBのところが50TBと表示されていました。
1.6のテンプレートをそのままインポートしたので、設定間違い
という線は無いと思うのですが、思い当たる節等有れば
ご教授頂ければと思います。

2は、1.8からzabbix_server.confにTimeoutという項目が追加されていたのですが
フォーラムの「SimpleCheckのTimeout設定について」の記事でkodaiさんが
書いていた、ソースコードの中で3秒と指示されていた設定と同値でしょうか?
自分もポート監視のタイムアウトを伸ばしたいと思っていた物の、ソースコードを
書き換えるのは躊躇われたので現状維持していたのですが、設定ファイルで
変更できるのであれば幸いかなと。

以上、よろしくお願い致します。

コメント表示オプション

お好みのコメント表示方法を選び「設定の保存」をクリックすると変更が反映されます。
ユーザー KAZ の写真

MINTIAさん

1:ディスク容量の取得値がおかしい

確認してみます。
ちょっと時間がかかるかもしれません。
※:1.8系の環境が手元にないのですA(^^;

2:zabbix_server.confのTimeout設定

ソースを全部追い切れてはいませんが…

2は、1.8からzabbix_server.confにTimeoutという項目が追加されていたのですが

えっと、Timeoutはzabbix1.1の時代からあるのですが…A(^^;
意味合い的にはzabbixサーバが各種監視を実行した時のタイムアウト値になります。
現在詳しく調査中ですがもしかすると意味のない設定かと…A(^^;

フォーラムの「SimpleCheckのTimeout設定について」の記事でkodaiさんが
書いていた、ソースコードの中で3秒と指示されていた設定と同値でしょうか?

こちらは接続タイムアウト値でソース固定です。
ソースは下記の50行目になります。
<code>
zabbix-1.8.1\src\libs\zbxsysinfo\common\net.c
</code>

蛇足ですが、zabbix_agentd.confのTimeoutについて

1)ZABBIXエージェント(active)からZABBIXサーバへの接続タイムアウト値
log[]監視やeventlog[]監視をしているマシンが負荷が高く重たい時は大きくしてあげた方が良いかも知れません。1〜30(秒)

2) ZABBIXエージェント(active)からZABBIXサーバへの送信タイムアウト値。
現在詳しく調査中ですがもしかすると意味のない設定かと…A(^^;

ユーザー TNK の写真

1:のディスク容量の件を確認してみました。

1.8がインストールされていた環境で、1.8.1のリリースノートにあったSQLパッチを実行後、1.8.1のモジュールに入れ替えましたが、その方法であれば、vfs.fs.size[/,free]の値は正しく取得できているようです。
新規にアイテムを作成しても正しく取得できています。

今度は、1.6.5からアイテムをエクスポートして1.8.1にインポートしたところ、

 vfs.fs.size[/,free]

のアイテムは、

 タイプ   : Zabbixエージェント
 キー    : vfs.fs.size[/,free]
 データ型  : 数値(整数)
 データの形式: 10進数
 単位    : B
 乗数を使用 : 乗数
 乗数    : 1024

となっていました。

 タイプ   : Zabbixエージェント
 キー    : vfs.fs.size[/,free]
 データ型  : 数値(整数)
 データの形式: 10進数
 単位    : B
 乗数を使用 : 使用しない

になるべきだと思います。
しかし、1.6.5のWeb UIから再度該当するアイテムを見ると「乗数」の指定がありました。
1.6.5から1.8.1で取得する値の単位が変更されてしまっているようです。

対応策としては、

 ・インポートしたアイテムの乗数を外す
 ・インポートする前に乗数の部分を0に変更してからインポートする

が考えられます。

後者は、インポートするファイルの該当するアイテム(vfs.fs.sizeを利用し、単位がBのもの)毎に、
<code>
 <multiplier>0</multiplier>
 <formula>0</formula>
</code>
に変更すればよさそうです。

細かく確認していないので、きちんとバックアップを取得された上でお試し下さい。

ユーザー kodai の写真

こんにちは。

ソースまでは見れていないのですが、1.6系ではディスクの空き容量はKB単位で取得していたので、乗数で1024をかけてB単位に変換していたと思います。

1.8ではアイテムで取得したデータ自体がB単位に変わっているのかもしれません。

インポートする前に乗数の部分を0に変更してからインポートする

0をかけてしまうとすべてのデータが0になってしまうと思うので :-P ここは「1」を設定ですかね。

ユーザー kodai の写真

えっと、Timeoutはzabbix1.1の時代からあるのですが…A(^^;
意味合い的にはzabbixサーバが各種監視を実行した時のタイムアウト値になります。
現在詳しく調査中ですがもしかすると意味のない設定かと…A(^^;

ソースを見てみました。
zabbix_server.confのTimeout設定はZabbixサーバの監視(ポーリング)のタイムアウト値として有効でした。
src/zabbix_server/poller/poller.cなどで
<code>alerm(CONFIG_TIMEOUT)</code>
と利用されていました。

ユーザー KAZ の写真

kodaiさん

昨日相談しようとして力尽きていたのですが…A(^^;
実はその先まで追ってます。

まずは、main_poller_loop関数はSIGALRM発生時child_signal_handler関数を呼ぶ設定をしいます。

<code>
void main_poller_loop(zbx_process_t p, int type, int num)
{
struct sigaction phan;

…省略…

phan.sa_handler = child_signal_handler;
sigemptyset(&phan.sa_mask);
phan.sa_flags = 0;
sigaction(SIGALRM, &phan, NULL);

…省略…

for (;;) {

…省略…

items = get_values(now, &nextcheck);

…省略…

}
}
</code>

その後、get_values関数→get_value関数と呼ばれて…
下記の様な感じで処理が流れます。
(1)confのTimeout秒経過後にSIGALRMを発生させるよう設定
(2)各アイテムのtype毎の情報取得する関数のコール
(3)SIGALRMの発生をキャンセル

<code>
…省略…

alarm(CONFIG_TIMEOUT); (1)
ret = get_value_xxxxx(xxxxx, xxxxxx); (2)
alarm(0); (3)

…省略…
</code>

時間内に終われば問題ないのですが、時間内に終わらなかった場合下記のchild_signal_handler関数が呼ばれます。
ログ出しているだけですよね?

<code>
void child_signal_handler(int sig)
{
switch(sig)
{
case SIGALRM:
/* signal(SIGALRM , child_signal_handler);*/
zabbix_log( LOG_LEVEL_DEBUG, "Timeout while answering request");
break;
case SIGQUIT:
case SIGINT:
case SIGTERM:
zabbix_log( LOG_LEVEL_DEBUG, "Got signal. Exiting ...");
uninit();
exit( FAIL );
break;
case SIGPIPE:
zabbix_log( LOG_LEVEL_WARNING, "Got SIGPIPE. Where it came from???");
break;
default:
zabbix_log( LOG_LEVEL_WARNING, "Got signal [%d]. Ignoring ...", sig);
}
}
</code>

実行中のプロセスにSIGALRM割り込みがあり、child_signal_handler関数にアタッチし、child_signal_handler関数の処理が終わってデタッチするとget_value_xxxxx関数の処理は中断してしまうのでしょうか?

そんなはずないと思うのですが…

ユーザー kodai の写真

おっと、そんなところに落とし穴が...

すいません、もうちょっとソース読んでみます。

ユーザー MINTIA の写真

>KAZさん
>>Timeoutはzabbix1.1の時代からあるのですが…
手元の1.6のserver.confを見たら、確かに存在しますね(汗)
そういえば初期の頃にこれでタイムアウトを伸せばせるものと
思い込んで設定した覚えが有りました・・・
1.8.1でもソースコード書き換えるしか無いみたいですね。

>>log[]監視やeventlog[]監視をしているマシンが負荷が高く重たい時は
>>大きくしてあげた方が良いかも知れません。1〜30(秒)
なるほど。今の所zabbix-agentの負荷は高くないのですが、他のタイムアウトの設定も
チューニングした方がいいかもしれませんね。マニュアルを見ながら煮詰めてみます。

>TNKさん、kodaiさん
乗数を使用しない設定に変更したところ、無事正常な値を
取得する事ができました!
現在サービスサーバ用のzabbix-serverのディスク容量が
切羽詰まっているので、ディスク容量が正常に
監視できなかったら大問題でした。有難うございます。

動作確認を行っていると他にもグラフの文字化けや
1.6から変更されたと思わしき点(ホストにリンクしてるテンプレートを
編集しても、ホストの設定に反映されない?)が見受けられましたが
致命的な問題は今の所無いと思われるので、一応公式フォーラム等を
見てサービスサーバも1.8.1にアップデートしようと思います。

ユーザー TNK の写真

動作確認を行っていると他にもグラフの文字化けや

グラフの文字化けは、フォントを日本語対応フォントに指定することで対応できると思います。
手順を簡単に書くと以下のようになります。

 ・IPA UIゴシックフォントの準備とフォント指定の変更
 ・vtext.php内の一部引数の変更

詳細は、kodaiさんのブログなどを参考にしてみて下さい。
http://kodai74.blogspot.com/2009/12/zabbix-182.html
http://kodai74.blogspot.com/2009/12/zabbix-183.html

ユーザー TNK の写真

0をかけてしまうとすべてのデータが0になってしまうと思うので :-P ここは「1」を設定ですかね。

実際に1.6系でエクスポートして頂けば、私が書いた内容をご理解頂けると思いますが、出力されたxml内で「multiplier」が乗数を利用するかどうかのフラグ値で、

 「0」:乗数を利用しない
 「1」:乗数を利用する

となっているようです。
「formula」の部分には数式を記述するようですが、乗数を利用しないアイテムに関しては、「0」が指定されていました。

ですので、
<code>
<multiplier>0</multiplier>
<formula>0</formula>
</code>
と指定すると書いたわけです。
「multiplier」が「1」の状態で「formula」を「0」に指定すると、kodaiさんが書かれている通り計算結果が0となります。

ユーザー TNK の写真

ソースまでは見れていないのですが、1.6系ではディスクの空き容量はKB単位で取得していたので、乗数で1024をかけてB単位に変換していたと思います。

1.8ではアイテムで取得したデータ自体がB単位に変わっているのかもしれません。

zabbix-1.8.1/ChangeLogの中に以下のような記述がありました。

Changes for 1.7.4
- [DEV-440] fixed vfs.fs.size[] to return data in bytes for all OS (Sasha)

この時に変更されたのかもしれませんね。

ちなみにLinuxで該当すると思われるソースは以下の場所です。

・zabbix-1.6.8/src/libs/zbxsysinfo/linux/diskspace.c
<code>
(*free) = (zbx_uint64_t)(s.f_bavail * (s.f_bsize / 1024.0));
</code>

・zabbix-1.8.1/src/libs/zbxsysinfo/linux/diskspace.c
<code>
*free = (zbx_uint64_t)s.f_bavail * s.BSIZE;
</code>