munin 2.0.12 環境構築メモ(munin-node側)

自作の munin plugin 使って OracleDatabase のリソースグラフ化する時のメモ。ここでは Munin-Node 環境を作るまで。

oracle plugin はシェルベースで、sqlplus を使ってインスタンスへアクセスします。またリスナ依存を排除するため、ローカル接続を行います。アクセスのしやすさを優先して、munin-node は oracle ユーザで動かすことにしています。
同じ OS 構成ベースであればディレクトリ固めて展開できるように、perl とかも全部1ディレクトリに放り込みます。


Perl
5.16.3 使いました

./Configure -des -Dprefix=/home/oracle/local/munin
make -j 4
make test
make install

Perl-Module
cpanm で入れます。
Net::SSLeay のために openssl-devel が、DB_File のために db4-devel が必要です。
munin-node において、DB_File は asyncd を使わない場合は(多分)不要なはずです。今回は asyncd 使うので必須。

export PATH=/home/oracle/local/munin/bin:$PATH
curl -LOk http://xrl.us/cpanm
chmod 755 cpanm
mv cpanm /home/oracle/local/munin/bin/
sudo yum install openssl-devel
sudo yum install db4-devel
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Net::Server
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Net::SNMP
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Crypt::DES
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Digest::SHA1
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Digest::HMAC
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Net::SSLeay
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN DB_File

■Munin-Node
PATH 関係はここで全部設定します。perl 部分を絶対 PATH にしたり。内容は作る人のお好みで。

vi Makefile.config

munin-async を使うので async-prime も必要です。後 oracle でもう全部動かすことにするので、chown で がっつり oracle にオーナ・パーミッションを変えます。この辺の考え方は好み次第。

make
su
--
make install-common-prime install-node-prime install-plugins-prime install-async-prime
cp -pr contrib /home/oracle/local/munin/
ls -l /home/oracle/local/munin/
chown -R oracle:oinstall /home/oracle/local/munin/*
ls -l /home/oracle/local/munin/
exit
--

Makefile.config の設定の仕方が多分マズイために起きているんだと思いますが、一部のソースの perl PATH が変わってくれないので手で直します。

cd /home/oracle/local/munin/sbin
vi munin-node
vi munin-node-configure
vi munin-run
vi munin-sched
===
#!/home/oracle/local/munin/bin/perl
===

cd /home/oracle/local/munin/contrib
vi dump_storable
vi import_db
vi dump_db
vi epoch2localtime
===
#!/home/oracle/local/munin/bin/perl
===

SpoolReader にパッチあてときます。(前の記事の件です http://nsrzakki.hateblo.jp/entry/2013/04/24/015415

cd /home/oracle/local/munin/lib/perl5/site_perl/5.16.3/Munin/Node/
cp -p SpoolReader.pm /tmp/SpoolReader.pm
patch < /home/oracle/local/src/Munin/SpoolReader.pm.patch


■Munin-Node設定
asyncd を同じノードに立てるので、アクセス元を localhost だけにしておきます。
あとは必要な default_plugin 関係を追記。

cd /home/oracle/local/munin/etc/
vi munin-node.conf
- add default_plugin_user oracle
- add default_plugin_group oinstall
- mod user oracle
- mod group oinstall
- mod #host *
- mod host 127.0.0.1


■プラグイン設定
山ほどサンプルがあるので、お好きなように設定しましょう。
oracleプラグイン部分は別に書く。


■起動
こんな感じ。実運用時向けに起動スクリプトも作ってあるけど、こんなん別に誰でもかけるしな。。
プロセスダウン検知どうしよう・・・というのが実はあるんですが、本当にどうしよう。munin-limit側で考えるか。

/home/oracle/local/munin/sbin/munin-node
/home/oracle/local/munin/lib/munin-asyncd &

とりあえずここまで。

munin asyncd でプラグインの実行タイミング制御

覚書
 4/26 update SpoolReaderとUpdateWorkerのパッチをとりあえず追加

■munin-asyncd で plugin 毎に収集タイミングを制御するには
plugin_rates でプラグイン毎の実行タイミングを制御できる
 plugin 実行間隔(秒)
設定しないプラグインはデフォルトの5分おきで収集されるが、載せておくほうが無難か

■munin-async の実行
コマンド制限タイプssh鍵登録
実運用時はfromも最低付ける予定
 command="/~/lib/munin-async --spoolfetch" ssh-rsa AAAAB

■問題点1:実行間隔を5分以上にすると、munin-async 実行時に値の更新のなかったプラグインはグラフへのリンクが切れる
→RRD更新やHTML生成が、state-~.storable を基点にしていて、「値を返してきたもの」を前提として生成するような形になっているため
 →SpoolReader.pm をいじって、更新が無かった場合でも最後の値を返すように修正
 →munin-update時にrrdtool update部でエラーになる
  →UpdateWorker.pm で前回と同値の場合は~.storageとRRDファイルを更新スキップするよう修正

■問題点2:値の更新間隔が600秒以上のプラグインは、rrdファイルのvalueがNaNとなり、グラフに描画されない
→Muninのrrdファイル生成時のデフォルトが step = 300,minimal_heartbeat = 600 のため
 →rrdtool tune で minimal_heartbeat を plugin_rates で設定した値*2くらいに変更するとvalueが乗り微妙だけどグラフが描画される
 →コマンドイメージ rrdtool tune ~.rrd 42:7200
 →UpdateWorkerでminimal_heartbeatの変更も対応できるよう修正するのがよいのだけど、修正量が多くなるのでちょっと見送り。
 →rrdtool でとりあえず変更でしのぐ(・・・にしても変更するのが楽になるようにシェル作るか?)

■SpoolReader.pmのパッチ

--- SpoolReader.pm.org	2013-04-16 16:46:49.000000000 +0900
+++ SpoolReader.pm	2013-04-24 12:08:47.000000000 +0900
@@ -113,14 +113,21 @@
             or die "Unable to open spool file: $!";
 
         my $epoch;
+        my $position = 0;
 
         # wind through to the start of the first results after $timestamp
         while (<$fh>) {
             ($epoch) = m/^timestamp (\d+)/ or next;
+            $position = tell($fh) - length($_);
             logger("Timestamp: $epoch") if $config->{DEBUG};
             last if ($epoch > $timestamp);
         }
 
+        # for last timestamp return
+        if ( eof $fh && $position != 0 ) {
+           seek($fh , $position , 0);
+        }
+
         if (eof $fh) {
             logger("Epoch $timestamp not found in spool file for '$service'")
                 if $config->{DEBUG};

■UpdateWorker.pmのパッチ(コメントは超適当)

--- UpdateWorker.pm.org	2013-04-09 18:13:55.000000000 +0900
+++ UpdateWorker.pm	2013-04-24 12:06:21.000000000 +0900
@@ -898,34 +898,40 @@
 	$current_updated_value = $value;
     }
 
-    DEBUG "[DEBUG] Updating $rrd_file with @update_rrd_data";
-    if ($ENV{RRDCACHED_ADDRESS} && (scalar @update_rrd_data > 32) ) {
-        # RRDCACHED only takes about 4K worth of commands. If the commands is
-        # too large, we have to break it in smaller calls.
-        #
-        # Note that 32 is just an arbitrary choosed number. It might be tweaked.
-        #
-        # For simplicity we only call it with 1 update each time, as RRDCACHED
-        # will buffer for us as suggested on the rrd mailing-list.
-        # https://lists.oetiker.ch/pipermail/rrd-users/2011-October/018196.html
-        for my $update_rrd_data (@update_rrd_data) {
-            RRDs::update($rrd_file, $update_rrd_data);
-            # Break on error.
-            last if RRDs::error;
+    # 
+    # RRDs::update run "$current_updated_timestamp > $previous_updated_timestamp" only.
+    # If "$current_updated_timestamp <= $previous_updated_timestamp" case should retrun $previous_updated_timestamp ?
+    if ($current_updated_timestamp > $previous_updated_timestamp) {
+        DEBUG "[DEBUG] Updating $rrd_file with @update_rrd_data";
+        if ($ENV{RRDCACHED_ADDRESS} && (scalar @update_rrd_data > 32) ) {
+            # RRDCACHED only takes about 4K worth of commands. If the commands is
+            # too large, we have to break it in smaller calls.
+            #
+            # Note that 32 is just an arbitrary choosed number. It might be tweaked.
+            #
+            # For simplicity we only call it with 1 update each time, as RRDCACHED
+            # will buffer for us as suggested on the rrd mailing-list.
+            # https://lists.oetiker.ch/pipermail/rrd-users/2011-October/018196.html
+            for my $update_rrd_data (@update_rrd_data) {
+                RRDs::update($rrd_file, $update_rrd_data);
+                # Break on error.
+                last if RRDs::error;
+            }
+        } else {
+            RRDs::update($rrd_file, @update_rrd_data);
         }
-    } else {
-        RRDs::update($rrd_file, @update_rrd_data);
-    }
 
-    if (my $ERROR = RRDs::error) {
-        #confess Dumper @_;
-        ERROR "[ERROR] In RRD: Error updating $rrd_file: $ERROR";
+        if (my $ERROR = RRDs::error) {
+            #confess Dumper @_;
+            ERROR "[ERROR] In RRD: Error updating $rrd_file: $ERROR";
+         }
+
+        # Stores the previous and the current value in the state db to avoid having to do an RRD lookup if needed
+        $self->{state}{value}{"$rrd_file:42"}{current} = [ $current_updated_timestamp, $current_updated_value ]; 
+        $self->{state}{value}{"$rrd_file:42"}{previous} = [ $previous_updated_timestamp, $previous_updated_value ]; 
     }
 
-    # Stores the previous and the current value in the state db to avoid having to do an RRD lookup if needed
-    $self->{state}{value}{"$rrd_file:42"}{current} = [ $current_updated_timestamp, $current_updated_value ]; 
-    $self->{state}{value}{"$rrd_file:42"}{previous} = [ $previous_updated_timestamp, $previous_updated_value ]; 
-
+    DEBUG "[DEBUG] return timestamp is $current_updated_timestamp. previous timestamp is $previous_updated_timestamp.";
     return $current_updated_timestamp;
 }

ZFS on Linux 0.6.1 入れる

これ入れました。 http://zfsonlinux.org/
Cent6 系準備して http://zfsonlinux.org/epel.html のとおりに叩くだけ。
zpool status したらこんなエラー。

# zpool status
Failed to load ZFS module stack.
Load the module manually by running 'insmod <location>/zfs.ko' as root.
Failed to load ZFS module stack.
Load the module manually by running 'insmod <location>/zfs.ko' as root.

このへん https://github.com/zfsonlinux/zfs/issues/1155 みる。dkms status で様子を見る。

# dkms status
spl, 0.6.1: added
zfs, 0.6.1: added

installされてないっぽいので、installしてみる。

# dkms install -m spl -v 0.6.1
Error! echo
Your kernel headers for kernel 2.6.32-358.2.1.el6.x86_64 cannot be found at
/lib/modules/2.6.32-358.2.1.el6.x86_64/build or /lib/modules/2.6.32-358.2.1.el6.x86_64/source.

build,source 付近が必要そうなので、kernel-devel.x86_64 入れる。で、入れて再トライ。

# dkms install -m spl -v 0.6.1

Kernel preparation unnecessary for this kernel.  Skipping...

Running the pre_build script:
(中略)
depmod....

DKMS: install completed.

# dkms install -m zfs -v 0.6.1

Kernel preparation unnecessary for this kernel.  Skipping...

Running the pre_build script:
(中略)
WARNING: /lib/modules/2.6.32-220.el6.x86_64/weak-updates/zpios.ko needs unknown symbol kmem_free_debug ※古いところ見て警告かな?

Running the post_install script:

depmod....

DKMS: install completed.

dkmsはこうなった。

# dkms status
spl, 0.6.1, 2.6.32-358.2.1.el6.x86_64, x86_64: installed
zfs, 0.6.1, 2.6.32-358.2.1.el6.x86_64, x86_64: installed
zfs, 0.6.1, 2.6.32-220.23.1.el6.x86_64, x86_64: installed-weak from 2.6.32-358.2.1.el6.x86_64
zfs, 0.6.1, 2.6.32-220.el6.x86_64, x86_64: installed-weak from 2.6.32-358.2.1.el6.x86_64

lsmodはこんな感じ。

# lsmod | grep zfs
zfs                  1141518  2
zcommon                44698  1 zfs
znvpair                80033  2 zfs,zcommon
zavl                    6925  1 zfs
zunicode              323159  1 zfs
spl                   261216  5 zfs,zcommon,znvpair,zavl,zunicode

プロパティ。compressratio 使えるか?使えると助かる。VMマシンだとCPUのほうがきつくなってしまうかもだけど。

# zfs get all
NAME       PROPERTY              VALUE                  SOURCE
rpool      type                  filesystem             -
rpool      creation              Tue Apr  9 18:20 2013  -
rpool      used                  146K                   -
rpool      available             3.91G                  -
rpool      referenced            31K                    -
rpool      compressratio         1.00x                  -
rpool      mounted               yes                    -
rpool      quota                 none                   default
rpool      reservation           none                   default
rpool      recordsize            128K                   default
rpool      mountpoint            /rpool                 default
rpool      sharenfs              off                    default
rpool      checksum              on                     default
rpool      compression           off                    default
rpool      atime                 on                     default
rpool      devices               on                     default
rpool      exec                  on                     default
rpool      setuid                on                     default
rpool      readonly              off                    default
rpool      zoned                 off                    default
rpool      snapdir               hidden                 default
rpool      aclinherit            restricted             default
rpool      canmount              on                     default
rpool      xattr                 on                     default
rpool      copies                1                      default
rpool      version               5                      -
rpool      utf8only              off                    -
rpool      normalization         none                   -
rpool      casesensitivity       sensitive              -
rpool      vscan                 off                    default
rpool      nbmand                off                    default
rpool      sharesmb              off                    default
rpool      refquota              none                   default
rpool      refreservation        none                   default
rpool      primarycache          all                    default
rpool      secondarycache        all                    default
rpool      usedbysnapshots       0                      -
rpool      usedbydataset         31K                    -
rpool      usedbychildren        114K                   -
rpool      usedbyrefreservation  0                      -
rpool      logbias               latency                default
rpool      dedup                 off                    default
rpool      mlslabel              none                   default
rpool      sync                  standard               default
rpool      refcompressratio      1.00x                  -
rpool      written               31K                    -
rpool      snapdev               hidden                 default

パラメータはこんな感じ。

kernel.spl.version = SPL v0.6.1-1
kernel.spl.hostid = 0
kernel.spl.hw_serial = 0
kernel.spl.kallsyms_lookup_name = ffffffff810b9590
kernel.spl.debug.subsystem = undefined atomic kobj vnode time rwlock thread condvar mutex rng taskq kmem debug generic proc module cred kstat xdr tsd zlib user1 user2 user3 user4 user5 user6 user7 user8
kernel.spl.debug.mask = warning error emerg console dprintf
kernel.spl.debug.printk = warning error emerg console
kernel.spl.debug.mb = 11
kernel.spl.debug.binary = 1
kernel.spl.debug.catastrophe = 0
kernel.spl.debug.panic_on_bug = 0
kernel.spl.debug.path = /tmp/spl-log
kernel.spl.debug.console_ratelimit = 1
kernel.spl.debug.console_max_delay_centisecs = 60000
kernel.spl.debug.console_min_delay_centisecs = 50
kernel.spl.debug.console_backoff = 2
kernel.spl.debug.stack_max = 0
kernel.spl.vm.minfree = 11263
kernel.spl.vm.desfree = 14078
kernel.spl.vm.lotsfree = 16894
kernel.spl.vm.needfree = 0
kernel.spl.vm.swapfs_minfree = 65536
kernel.spl.vm.swapfs_reserve = 1024
kernel.spl.vm.availrmem = 136780
kernel.spl.vm.freemem = 126125
kernel.spl.vm.physmem = 524288
kernel.spl.kmem.kmem_used = 4350364
kernel.spl.kmem.kmem_max = 9690970
kernel.spl.kmem.vmem_used = 4457440
kernel.spl.kmem.vmem_max = 4473824
kernel.spl.kmem.slab_kmem_total = 14577664
kernel.spl.kmem.slab_kmem_alloc = 3274440
kernel.spl.kmem.slab_kmem_max = 12171464
kernel.spl.kmem.slab_vmem_total = 1176010752
kernel.spl.kmem.slab_vmem_alloc = 38461920
kernel.spl.kmem.slab_vmem_max = 1102897632

SELinuxがenforceだと zfs create したときに mount エラーになるので Permissive にしとく方が無難ぽい。
性能軽く測って、テスト用DBのデータ置き場とかパッチ適用テストに使うつもり。
zdbがあるのがすばらしい、、が、そういえば性能ってどーはかったものか。昔みた arcstat.pl ってkstatベースだからLinuxじゃ使えないじゃんか。
・・・と思ったら https://github.com/zfsonlinux/zfs/issues/179 に書いてあった。後、/proc/spl/kstat/zfs/arcstats に出ているので、こっちから値をとるように書き換えてしまってもいいかもしれない。というか、そうするか。。

※追加その1:arcサイズの調整はこの辺 https://github.com/zfsonlinux/zfs/issues/676 みて、設定できるらしいのがなんとなく分かった。1.5G設定。

options zfs zfs_arc_max=1572864000

※追加その2:arcstat.pl のやっつけ修正も一応できた。

# diff arcstat.pl arcstat.pl.org
1c1
< #!/usr/bin/perl -w
---
> #!/usr/perl5/bin/perl -w
46a47
> use Sun::Solaris::Kstat;
104a106
> my $kstat = Sun::Solaris::Kstat->new();
207,211c209,210
<       my %kstatdata = ();
<       open(IN, "/proc/spl/kstat/zfs/arcstats");
<       while ( my $line = <IN>) {
<               my @items = split /\s+/, $line;
<               $kstatdata{$items[0]} = $items[2];
---
>       if ($kstat->update()) {
>               printf("<State Changed>\n");
213,215c212
<       close(IN);
<
<       my $hashref_cur = \%kstatdata;
---
>       my $hashref_cur = $kstat->{"zfs"}{0}{"arcstats"};
218,219c215
<                 next if $key =~ /^[0-9]/;
<                 next if $key =~ /^name/;
---
>               next if $key =~ /class/;

Oracleのアラートログ類を1箇所に集めたかったお話

開発系なんかもあわせると10台以上のOracle動かしているサーバの面倒見ているわけで、アラートログ監視が面倒なわけです。
EnterpriseManager買えばいいじゃんとか、世の中ログ監視ツールは幾らでもあるのでそれを使うという手もあるんですがfluentを使ってみたかったのでやってみたというメモ。
「ログ監視を1箇所でやることで、アラート出すなりIRC出すとかアラート対象の選別や送信先メールなどのメンテを(個人的に)やりやすく」というのが目標。実はログ出力場所を全部NFSにすれば良いというお話があったりするけど、そこは目をつぶる。

fluentを使うのをベースとして、一番単純に構成するとこうなるかと思う。

 ログファイル
  ↑
 fluentd(ここでログげっつ)
  ↓
 fluentd(こっちで受け取る)
  ↓
 fluent-plugin-notifier や irc や ikachan で好きにやる


ただ、今回は↓のようなことを考えていました。fluentはログ収集に注力してもらって、残りは昔のツールを流用。

  • 以前作った snmptrap を irc に出すツールがあったのでそこはそのまま使いたかった。
  • ログファイルを監視するfluentについては、DBサーバで動かすことになるのでなるべく軽量でシンプルなものにしたかった。
  • DBサーバにはSolarisもあるのでそちらでも動かしやすそう…というのもちょっとだけ考慮

ということで大雑把にツール構成を書くとこうなる。

 ログファイル
  ↑
 fluent-agent-lite(ここでログげっつ)
  ↓
 fluentd(こっちで受け取る)
  ↓
 Kyoto Tycoon(memcahcedプラガブルサーバ キューモード) ← snmptrapd ← サーバとか
  ↓
 IRC や メールに通知


で、fluentd から kyototycoon に memcachedプロトコルで書き出すプラグインが…プラグインがパッと見る限り見つかりません。
ということで、尊敬する@tamtam180さんのarangoプラグインとredisプラグインを元に、その部分は自作。まだテスト書いてないので正式プラグインとしては出せないんですが、とりあえず動きます。これ。
使ってる設定はこんな感じ。syslogもついでに引っ張ってきてます。

## fluent-agent-lite 側
LOGS=$(cat <<"EOF"
oracle.dbaleert.hostname  /u01/app/oracle/diag/rdbms/sid/sid/trace/alert_sid.log
oracle.asmaleert.hostname  /u01/app/grid/diag/rdbms/+asm/+ASM/trace/alert_+ASM.log
system.hostname  /var/log/messages
EOF
)

## fluentd 側
<source>
  type forward
</source>

<match oracle.**>
  type copy
  <store>
    type file_alternative
    path /log/oracle/alert.%Y%m%d.log
    output_include_time false
    buffer_type file
    buffer_path /log/oracle/oracle_alert.*.buffer
    flush_interval 5s
  </store>
  <store>
    type ktmemqueue
    host localhost
    port 11211
    inputkey fluent
  </store>
</match>

<match system.**>
  type copy
  <store>
    type file_alternative
    path /log/system/system.%Y%m%d.log
    output_include_time false
    buffer_type file
    buffer_path /log/system/system.*.buffer
    flush_interval 5s
  </store>
  <store>
    type ktmemqueue
    host localhost
    port 11211
    inputkey fluent
  </store>
</match>

<match ping.**>
  type copy
  <store>
    type ping_message_checker
    tag error.ping
    notifications yes
    check_interval 60
    notification_times 2
  </store>
  <store>
    type file_alternative
    path /log/ping/agent_ping.%Y%m%d.log
    buffer_type file
    buffer_path /log/ping/agent_ping.*.buffer
    flush_interval 5s
    localtime
    output_include_time true
    output_include_tag false
    output_data_type attr:data
  </store>
</match>

<match error.ping>
    type ktmemqueue
    host localhost
    port 11211
    inputkey fluent
</match>


あと割り切っている点があります。

  • fluentdで受けるところでメッセージ到達性で全く問題ないか?という点
  • fluent-agent-liteにすることで、position覚えができないため fluent-agent-lite が長時間ダウンすると転送できないログが発生する点

メッセージ到達性が確実なら嬉しいですがログ監視なので、まあ本気で何か起きたらメッセージは沢山出るでしょうということで1メッセージもロスして欲しくない…みたいな完全性は求めていません。fluent-agent-liteがtail -Fベースで動いているので位置覚えないため、fluent-agent-liteが落ちると、ログ転送に抜けが起きやすい。ただ、そこはping-messageで監視することでなるべく早く気づこうねという方針です。そんな事態になったら、どうせサーバに入って確認することになると思うので。


まあこんな構成誰が使うんだ?という気がしますが、こんな構成を作れたのも fluentd や kyoto tycoon や tagomorisさんが作った膨大なプラグインのおかげで、感謝感謝!です。

※参考
Kyoto Tycoon(memcahcedプラガブルサーバ キューモード) は こちら http://fallabs.com/blog-ja/promenade.cgi?id=133

dstat で iostat の await 相当を取る

※まだいじってる最中なので間違いが多分に含まれている可能性あり。というか多分間違ってます。ほとんど自分の備忘録。

dstat で await 相当を取るプラグインはそのままだと正しく動かなそうというお話。
python真面目に見たの初めてだったので苦戦した。。

  • プラグイン

https://github.com/dagwieers/dstat/blob/master/plugins/dstat_disk_wait.py
(修正してみたもの) https://github.com/mhnsr/work/blob/master/dstat_disk_wait.py

  • 出力のおかしいところ

何故か IO しているのに 0.0 が出る。iostat結果と全然合わない。

  • 分かったこと

await を計算しているところが long 同士で計算しているので計算結果も多分long。結果、小数点以下がバッサリ削られている。
rwait,wwait を try ~ except ZeroDivisionError の1ブロックで全部処理しているので、rwait,wwaitどちらか一方でもIOPS 0だと結果が 0 に塗りつぶされてしまう。

  • 現状のパッチ状態
diff -w dstat_disk_wait.py dstat_disk_wait.py.org
69,81c69,77
<                 rd_ios = self.set2[name][0] - self.set1[name][0]
<                 if rd_ios:
<                     rd_await = float((self.set2[name][1] - self.set1[name][1])) / float(rd_ios)
<                 else:
<                     rd_await = 0.0
<
<                 wr_ios = self.set2[name][2] - self.set1[name][2]
<                 if wr_ios:
<                     wr_await = float((self.set2[name][3] - self.set1[name][3])) / float(wr_ios)
<                 else:
<                     wr_await = 0.0
<
<                 self.val[name] = ( rd_await, wr_await )
---
>                 self.val[name] = (
>                     ( (self.set2[name][1] - self.set1[name][1]) * 1.0 )
>                     /
>                     ( (self.set2[name][0] - self.set1[name][0]) * 1.0 )
>                     ,
>                     ( (self.set2[name][3] - self.set1[name][3]) * 1.0 )
>                     /
>                     ( (self.set2[name][2] - self.set1[name][2]) * 1.0 )
>                 )
  • 残りの課題

この状態でテストしていると Readのみ、Writeのみの時の await 結果は iostat と大体一致するが、Read/Write を同時発生させた場合の rwait+wwait の数字が iostat の await とどうも一致しない。sysstat側ソースも単純に足し合わせている感じなので差の発生原因が不明。もう少し計算結果の正確性についてテストが必要そう。
sysstat 10.x 系で r_await, w_wait を出してみたところ、こちらの結果は大体あってる状態。なので累積させるところの計算式を見直せばいいか、もうこのままでも良いかなと思う。

とりあえずここまで。

MyNA(日本MySQLユーザ会)会 2013年3月に参加してみた

sh2ndさんがお話するということでこれは聞きに行かねば!ってことで行ってきました。
最後にblogに書く宿題が出ていたのでメモとして書き残しておきますw

  • sh2ndさん

http://d.hatena.ne.jp/sh2/20130304 の続き。
5.6からのOptimizer traceを活用しつつ、結合SQLオプティマイザ判定に泣かされたお話でした。
MySQLで結合を使うSQLは辛い印象がありますが、5.6でも傾向としては残るの…かなという印象。
InnoDBオプティマイザ周りのソースまでいじってチューニングしてみたsh2ndさん流石です。

  • yoku0825さん

資料はこちらだそうで http://www.slideshare.net/yoku0825/mysql-clients
mysql_config_editorは初めてみました。OracleだとWalletでやる感じの事ができる、というかOracleがメンドイ。
mysqlbinlogでのリモートバイナリログ転送を使ってるところを初めてみました。mysqlbinlogのコネクションが残る?というお話が会場ではありましたが、その後「FLUSH LOGSで綺麗になる」というフォローがされています。

参考:http://d.hatena.ne.jp/hiroi10/20121113/1352834517


…とここでnippondanjiさんになるはずがPCの具合がイマイチで順番変更。LT系を先にやることに。

  • 木村さん

ps_helper(http://www.markleith.co.uk/ps_helper/)が紹介されてました。
こんなのもあるんですね~。会社のMySQLの面倒を見ることが多いチームの人たちに展開しよう。

  • Kajiyamaさん

MySQLConnectが今年もあるって話や、MySQL Cluster NoSQL API for Node.js がそろそろ見せれるようになるのでデバッグ募集中w的なお話が。

参考:http://dev.mysql.com/tech-resources/articles/cluster-7.3-dmr.html


nippondanjiさんの方がまだってことで、急遽来ていたきのしたさんが引っ張り出されてミニトーク。

  • トリでnippondanjiさん

5.6の機能~デモの流れのはずだったんですが、殆どmysqlsandboxのデモになってましたw
sandboxはいろんなバージョンや、debug版入れたりして切り替えてテストとかするのにはとても便利そうに感じました。
zfs なホストでnfs動かして、sandbox 環境の置き場所を NFS にすれば、zfs snapshot / rollback 構成&sandboxで、開発環境については好き放題できそうな環境があっという間に…みたいな。
http://mysqlsandbox.net/ とりあえず入れるのはcpanm MySQL::Sandbox一発で簡単なので、あとはmysqlのtar.gzをかき集めればとりあえず試すのはできそう。


  • 思ったこととか

fluentでスロークエリをout_execに投げ込んで、.mylogin.cnf を活用すれば optimezer trace をサクっと取れるようにできたりしないかな?と思ったりしましたが、スロークエリからoptimezer traceにSQL文を正しく渡すところが面倒かな?やればできそうな気はしますが。
Oracle Walletについてはこれ。
 http://docs.oracle.com/cd/E16338_01/license.112/b56284/editions.htm#CJAHFHBJ
 http://docs.oracle.com/cd/E16338_01/network.112/b56285/authentication.htm#CHDHGAIJ

色々勉強になるお話が聞けて楽しかったです。最近Oracleでもソースみせてくれ…と言いたくなるようなオプティマイザの不思議な問題にぶち当たることが多いので、sh2ndさんの言っていた、MySQLならソースを追って確認できるのは~の内容はすごく同意です。ただ、MySQLにはできればソースをいじらずにオプティマイザ周りのチューニングが出来るくらいには進化してほしいとは思いますw

munin-2.0.9 インストールメモ

Munin2.0.x系をソースから入れてみたというメモ。
これでいいのか不明?な点も満載。まあ手元のリソースモニタで使う分には動けばいいか。。というのはあるけれど。
Cent 5.8ベース。

※2013/2/11 追記
 munin-asyncd を使う場合 DB_File.pm が必要で、そのためには db4-devel が必要だったので追加。
 Net/Server.pm の問題は "Fixed in 2.007" とあるので、最新の Net::Server ではfixしているようです。(試してません)


■OSパッケージ
rrdtoolは Alien::RRDtool で入れちゃうので、そのために必要そうなものを適当に入れる。
gcc は入ってなかったので適当に入れた。

yum install gcc44
yum install gcc44-c++
yum install gcc
yum install gcc gcc-c++
yum -y install yum-priorities
vi /etc/yum.repos.d/CentOS-Base.repo
wget http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/5/x86_64/epel-release-5-4.noarch.rpm
rpm -ivh epel-release-5-4.noarch.rpm
vi /etc/yum.repos.d/epel.repo
yum install net-snmp-perl
yum install rrdtool-perl
yum install git
yum install -y pkg-config
yum install -y gettext
yum install -y glib
yum install -y xml2
yum install -y pango
yum install -y cairo
yum install -y cairo-devel
yum install -y pango-devel
yum install -y glib-devel
yum install -y libxml2-devel
yum install -y openssl-devel
yum install -y db4-devel

perl
本当は perlbrew にしたほうがいいんだろうけど。

./Configure -Dcc=gcc44 -des -Dprefix=[適当に]/munin-perl-5.16.2
make
make test
make install

■cpanm
パス通すのが面倒なので、インストールした [適当に]/munin-perl-5.16.2/bin に放り込む

■モジュール類
近場のミラー(http://ftp.nara.wide.ad.jp/pub/CPAN)を見るようにしてみた

・rrdtool
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Alien::RRDtool
・master
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Time::HiRes 不要
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Storable
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Digest::MD5
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN HTML::Template
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Text::Balanced  不要
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Params::Validate
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Date::Parse TimeDate (Date::Parse で)
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Net::SSLeay (要:openssl-devel)
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Getopt::Long 不要
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN File::Copy::Recursive
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN CGI::Fast 不要
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN IO::Socket::INET6 エラー→テスト→-f強制インストール
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Log::Log4perl
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN IPC::Shareable
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Log::Dispatch
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Log::Dispatch::FileRotate
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN MIME::Lite
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Mail::Sender
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Mail::Sendmail
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Mail::Cap MailTools (cpanm Mail::Cap) 不要
・node
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Net::Server
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Net::Server::Fork 不要
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Time::HiRes 不要
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Net::SNMP
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Crypt::DES
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Digest::SHA1
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Digest::HMAC
cpanm -L muninlibs Net::SSLeay 不要(前で入れてるので)
cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN DB_File asyncdで使う

■Munin本体
これで良いか全然分かってない点。
Makefile.config いじって make -> make install …が基本だけど、幾つかハマった。
・sbin 下の「munin-node munin-node-configure munin-run munin-sched」の perlパスが置換されない
 →とりあえず手で直した
・munin-node.conf に「default_plugin_user default_plugin_group」が無いとこんなエラーが出る。
 →munin-node.conf にとりあえず書いてみた。

2012/12/25-17:03:28 [10787] Error output from cpu:
2012/12/25-17:03:28 [10787]     Use of uninitialized value $service_user in concatenation (.) or string at /~/Munin/Node/Service.pm line 151.
2012/12/25-17:03:28 [10787]     User '' required for 'cpu' does not exist. at /~/Munin/Node/OS.pm line 182.
2012/12/25-17:03:28 [10787] Service 'cpu' exited with status 29/0.

・Net/Server.pmでエラー
 →バグ報告あるっぽい?とりあえず修正を手パッチしたら発生しなくなった。
  →http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=693320
  →https://rt.cpan.org/Ticket/Display.html?id=78828

2012/12/25-17:35:12 CONNECT TCP Peer: "[127.0.0.1]:55955" Local: "[127.0.0.1]:4949"
Use of uninitialized value in pattern match (m//) at /~/Net/Server.pm line 600.

確認して無さすぎだけど、とりあえずここまで。
munin-cronがエラーなしで通るようになりましたよ…っと。