b.l0g.jp     About     Archive     Feed

Cactiで一定値以上になるとグラフが正常に描画されない時

Cactiを使っていると、下の画像のように、ある一定の値以上をグラフに描画できない時がある。この例の場合、青い線であらわされたout-boundのトラフィックが80Mbpsを超えるとグラフが描画されていない。

このような場合は、以下を確認する。

トラフィックの場合、値を32ビットカウンタで取得していないか。

64ビットカウンタで値を取得しないと、桁あふれが起きてグラフが正常に描画されない。ホストの編集画面(Console → Devices → ホストをクリック)のAssociated Data Queriesで「SNMP - Interface Statistics 64bit only」を選ぶ。

そのグラフの扱える最大値を超えていないか。

グラフの編集画面(Console → Data Source → ホスト名 - 分類 - 項目(たとえば hogehoge-db01 - Traffic - eth0 のような)) のMaximum Valueの値が、小さく設定されているようなら、これを大きくしてみる。

RRDファイルに設定されている最大値を超えていないか。

RRDファイルにも各値の最大値が設定されている。これを無限大に設定してやる。以下は、上の画像のようにトラフィックが途切れる場合の対策の例。

  
$ rrdtool info hogehoge-db01\_traffic\_in_200.rrd

filename = "mwap-r10\_traffic\_in_200.rrd"
  
rrd_version = "0003"
  
step = 300
  
last_update = 1352714073
  
ds[traffic_in].type = "COUNTER"
  
ds[traffic\_in].minimal\_heartbeat = 600
  
ds[traffic_in].min = 0.0000000000e+00
  
ds[traffic_in].max = 1.0000000000e+07 ← ここが最大値
  
ds[traffic\_in].last\_ds = "3293068416"
  
ds[traffic_in].value = 1.2345678909e+08
  
ds[traffic\_in].unknown\_sec = 0
  
ds[traffic_out].type = "COUNTER"
  
ds[traffic\_out].minimal\_heartbeat = 600
  
ds[traffic_out].min = 0.0000000000e+00
  
ds[traffic_out].max = 1.0000000000e+07 ← ここが最大値
  
ds[traffic\_out].last\_ds = "2054038296"
  
ds[traffic_out].value = 1.2345678909e+08
  
ds[traffic\_out].unknown\_sec = 0
  
(後略)
  

rrdtool tuneコマンドで変更

  
$ sudo rrdtool tune hogehoge-db01\_traffic\_in\_200.rrd -a traffic\_in:U
  
$ sudo rrdtool tune hogehoge-db01\_traffic\_in\_200.rrd -a traffic\_out:U
  
  
$ rrdtool info hogehoge-db01\_traffic\_in_200.rrd

filename = "mwap-r10\_traffic\_in_200.rrd"
  
rrd_version = "0003"
  
step = 300
  
last_update = 1352714073
  
ds[traffic_in].type = "COUNTER"
  
ds[traffic\_in].minimal\_heartbeat = 600
  
ds[traffic_in].min = 0.0000000000e+00
  
ds[traffic_in].max = NaN ← 無限大に変わってる
  
ds[traffic\_in].last\_ds = "3293068416"
  
ds[traffic_in].value = 1.2345678909e+08
  
ds[traffic\_in].unknown\_sec = 0
  
ds[traffic_out].type = "COUNTER"
  
ds[traffic\_out].minimal\_heartbeat = 600
  
ds[traffic_out].min = 0.0000000000e+00
  
ds[traffic_out].max = NaN ← 無限大に変わってる
  
ds[traffic\_out].last\_ds = "2054038296"
  
ds[traffic_out].value = 1.2345678909e+08
  
ds[traffic\_out].unknown\_sec = 0
  
(後略)
  

Linuxのバッファキャッシュとページキャッシュの違いは?

Linuxが管理するキャッシュ領域には、バッファキャッシュとページキャッシュ領域があって、topコマンドや/proc/meminfoの「bufferes」「cached」という項目を見れば、現在のそれぞれのキャッシュ領域がどの程度なのかを確認することができる。

どちらも、ディスクの読み書きをキャッシュしてデータへのアクセスを高速化するという点では同じだが、それぞれがどのような意味で、どういう違いがあるのかについて、Quoraに分かりやすい解説があったので、翻訳してみた。

ページキャッシュは、ファイルI/Oを最適化するために、ファイルのページをキャッシュする。バッファキャッシュは、ブロックI/Oを最適化するために、ディスクブロックをキャッシュする。

Linuxカーネル2.4よりも前では、2つのキャッシュは明白に違うものだった。ファイルはページキャッシュに、ディスクブロックはバッファキャッシュに載せられていた。ほとんどのファイルがディスク上のファイルシステムによって扱われているとすると、データは2回、すなわち両方のキャッシュそれぞれに取り扱われる。多くのUnixシステムはこれと同じようなパターンを採用している。

これはシンプルな実装だが、明らかに洗練されていないし、非効率である。Linuxカーネル2.4からは、2つのキャッシュのコンテンツは統合された。VM(Virtual Memory)サブシステムがI/Oを司るようになり、それはページキャッシュからデータを取り出す。キャッシュされたデータがファイルとブロックの両方のかたちをとる(ほとんどのデータがそうだが)場合、バッファキャッシュは単純にページキャッシュを指し示す。つまり、データは1つだけがメモリにキャッシュされていることになる。ページキャッシュは、ディスクキャッシュのことを考えた通りのものだ。それは、後続のI/Oを高速化するために、ディスクからデータをキャッシュする。

バッファキャッシュはいまだに残っているが、それは、カーネルは現在もページ単位ではなくブロック単位のブロックI/Oを行う必要があるからだ。ほとんどのブロックはファイルデータのかたちを取っているため、バッファキャッシュの多くはページキャッシュと同等である。しかし、少量のブロックデータ、例えばメタデータやrawブロックI/Oなどは、ファイルを前提にしたものではなく、もっぱらバッファキャッシュによって取り扱われる。

現在のかたちに至った経緯まで含めて説明できるのは、経験豊かな人ならではというべきか。

Linuxカーネル Hacks ―パフォーマンス改善、開発効率向上、省電力化のためのテクニック Linuxカーネル Hacks ―パフォーマンス改善、開発効率向上、省電力化のためのテクニック
池田 宗広 大岩 尚宏 島本 裕志 竹部 晶雄 平松 雅巳 高橋 浩和 </p>

オライリージャパン 2011-07-26
売り上げランキング : 95520

Amazonで詳しく見る</font> by G-Tools</td> </tr> </table>


readlineのショートカットまとめ

ということで、調べたついでなのでreadlineのキーボードショートカットをまとめてみた。知らなかったのもあって意外と勉強になる。なお、使っているターミナルによってはAltの代わりに”Esc→キー”を使う必要がある。

ちなみに、readlineを使っているのはbash, zsh, ksh, mysql, psql, ftp, bcなど色々あるがこれらのコマンドラインツールでは基本的に以下のショートカットキーが使える(ソフトウェアによっては全部が全部使えるわけではない)。

カーソル移動系

さすがにここは定番すぎる。

キー入力 動作
Ctrl-b カーソルを左に1文字移動
Ctrl-f カーソルを右に1文字移動
Alt-b カーソルを左に1単語移動
Alt-f カーソルを右に1単語移動
Ctrl-a カーソルを行頭に移動
Ctrl-e カーソルを行末に移動
Ctrl-x-x 入力を始めた位置と現時点のカーソル位置を交互に移動

削除系

この辺は、知っておくと素早くコマンドを修正できるがなかなか覚えられない。

キー入力 動作
Back space カーソルの左の文字を削除
Delete
Ctrl-d
カーソル位置の文字を削除
Ctrl-u 行頭からカーソル位置までの文字を削除
Ctrl-k カーソル位置から行末までの文字を削除
Alt-d カーソル位置から次のスペースまでの文字を削除
Ctrl-w 直前の空白からカーソル位置の1文字前までの文字を削除
Ctrl-y 直前に上の削除コマンドで削除した文字をカーソル位置にペースト
Alt-y n回前に削除した文字をカーソル位置にペースト(入力するたびに前に戻っていく)

ヒストリ系

最後の2つ、引数をペーストするのは知らなかった。そんなに使う感じしないけど。

キー入力 動作
Ctrl-p 1回前に実行されたコマンドを表示
Ctrl-n 1回後に実行されたコマンドを表示
Alt-> 元々入力されていたコマンドを表示
Ctrl-r 現在表示されているものより前に実行されたコマンドをインクリメンタルサーチ
Ctrl-s 現在表示されているものより後に実行されたコマンドをインクリメンタルサーチ
Ctrl-J インクリメンタルサーチを終了
Ctrl-G インクリメンタルサーチを中止して元に戻る
Alt-Ctrl-y 直前のコマンドの第1引数をカーソル位置にペースト
Alt-.
Alt-_
直前のコマンドの最後の引数をカーソル位置にペースト

Undo系

キー入力 動作
Ctrl-_
Ctrl-x Ctrl-u
入力しているコマンドを全部削除
Alt-r 入力している行を全部削除(複数行入力している時にその行だけを消す)
Ctrl-l 表示を全部消して現在入力している行を一番上に表示

オートコンプリート系

Alt-*とかどういう時に使う想定なんだろうか。

キー入力 動作
Tab 入力をオートコンプリート
Alt-?
Tab Tab
オートコンプリートの候補を表示
Alt-* オートコンプリートの候補を全部入力

入れ替え系

このコマンドどちらも知らなかったが、オプションの順序を間違えた時に簡単に入れ替えたりするのにとても重宝する!

キー入力 動作
Ctrl-t カーソルの直前の文字とカーソル位置の文字を入れ替える
Alt-t カーソル位置の前の単語とカーソル位置の単語を入れ替える

その他編集系

これも知らなかった。そんなに使用頻度多くない人もいるだろうが、SQLを入力する時に予約語を大文字で入力したい人とか便利なんじゃないか。

キー入力 動作
Alt-u カーソル位置の単語の、カーソル位置より後を大文字にし、カーソルは単語の最後に移動
Alt-l カーソル位置の単語の、カーソル位置より後を小文字にし、カーソルは単語の最後に移動
Alt-c カーソル位置の単語の先頭文字を大文字にし、カーソルは単語の最後に移動

参考1 : Readline shortcuts

参考2 : GNU Readline Library Documentation