2012-10-20
ということで、調べたついでなので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
2012-06-18
Linuxでは、自動的にメモリの空き容量をファイルシステムキャッシュ(以下単にキャッシュ)として使用するような仕組みが用意されている。MySQLでMyISAMを使う時のようにOSのキャッシュを使用するような仕組みを使っていたり、単にファイルをNFSで公開しているファイルサーバなどでは、このキャッシュがどの程度効くかによってかなりパフォーマンスが違ってくる。
多数のファイルが読みだされ、かつ読み出し対象ファイルの総容量が物理メモリ容量より多い場合(普通そうだと思うが)、どのくらいのキャッシュヒット率になっているかを知っておくのは、パフォーマンス改善の一助になる。しかし、あるファイルがキャッシュに載っているかどうかを調べたり、ファイルをキャッシュに載せたりするための単純なコマンドというのは実は存在していない(はず)。それで、
とつぶやいたら、
と教えてもらったので、リンク先のサイト にあるスクリプトでキャッシュヒット率を確認してみた。@ishikawa84g 先生ありがとうございます~。
systemtapは、カーネル内部の挙動をトレースするためのツールの一種で、特別なスクリプトを書いてそれに従ってトレースすることができるので、色々な情報を取得することができる。
試してみたのはCentOS 6.2のマシン。systemtapがインストールされてなければインストールする。kernel-develも入っていないようであれば一緒に入れてしまうべし。
$ sudo yum install systemtap kernel-devel
上記リンク先にあるスクリプトをファイルに保存し、そのまま実行するとエラーになってしまう。
$ sudo stap cache-hit-rate.stp
semantic error: libdwfl failure (missing x86\_64 kernel/module debuginfo under '/lib/modules/2.6.18-164.el5/build'): No such file or directory while resolving probe point kernel.function("vfs\_read")
semantic error: no match while resolving probe point vfs.read
semantic error: no match while resolving probe point kernel.function("generic\_make\_request")
semantic error: no match while resolving probe point ioblock.request
Pass 2: analysis failed. Try again with another '-vp 01' option.
カーネルのdebuginfoがないためのエラーのようだ。debuginfoは専用のリポジトリからダウンロードする必要があるため、CentOSのdebuginfoリポジトリを登録する。debuginfoはそれなりにサイズもあるので、既に運用しているサーバにこれから入れるのは少しためらわれることもありそうだ。
/etc/yum.repos.d/CentOS-debuginfo.repo に以下の内容を書き込んで保存する。
[debuginfo]
name=CentOS-$releasever - DebugInfo
baseurl=http://debuginfo.centos.org/$releasever/$basearch/
gpgcheck=0
enabled=0
kernel-debuginfoをインストールする。
$ uname -a
Linux centos62-64-01 2.6.32-220.el6.x86\_64 #1 SMP Tue Dec 6 19:48:22 GMT 2011 x86\_64 x86\_64 x86\_64 GNU/Linux
$ sudo yum install -enablerepo=debuginfo kernel-debuginfo-2.6.32-220.el6.x86_64
パッケージが大きいので時間がかかる。この時、unameでカーネルバージョンを調べて使用しているカーネルと同じバージョンのdebuginfoを指定すること。指定しないとリポジトリにある最新のカーネルのdebuginfoがインストールされてしまう。
この状態でstapコマンドを実行すると、キャッシュのヒット率が5秒おきに15回表示される。
$ sudo stap cache-hit-rate.stp
Starting…
Total Reads (KB) Cache Reads (KB) Disk Reads (KB) Miss Rate Hit Rate
0 0 0 0.00% 0.00%
0 0 0 0.00% 0.00%
0 0 0 0.00% 0.00%
58802 66 58736 99.88% 0.11%
0 0 0 0.00% 0.00%
0 0 0 0.00% 0.00%
58785 58345 440 0.74% 99.25%
0 0 0 0.00% 0.00%
0 0 0 0.00% 0.00%
^C
Average Hit Rate: 49.67
Average Miss Rate: 50.32
キャッシュに読み込まれていないファイルを
$ cat bigfile > /dev/null
とやって読みだしたのが8行目で、ここではファイルのほぼ全てをディスクから読みだしている。もう一度同じコマンドを実行すると、1度目に実行したcatで読みだされた際にファイルがキャッシュに読み込まれているので、ほとんどディスクからの読み出しがなく、11行目のようにほぼキャッシュヒット率100%となり一瞬でファイルの全てにアクセスできる。
スクリプトの作者も書いているが、LVMを使用している場合などにはヒット率が正しく出ない場合があるので、値は参考程度に考えておくべし。
参考
SystemTap
Linux のイントロスペクションと SystemTap
SystemTapでMySQLのDisk I/Oを分析する
2012-05-28
前回のエントリ ではMySQLのサーバを監視できるように、CactiをインストールしてPercona Monitoring Pluginsのテンプレートを読み込んだところまで書いた。今回は、監視対象となるMySQLサーバを設定して、リソース監視を行うまでを書いてみる。なお、プロンプトがtargetとなって いるものが監視対象への設定で、serverとなっているものが監視サーバへの設定を意味している。
SNMPの設定(Ubuntu serverの場合)
Ubuntuでは標準ではSNMPがインストールされていないので、まずはインストールする。
target$ sudo apt-get install snmp snmpd
/etc/snmp/snmpd.confにsnmpdのデフォルト設定ファイルが置かれるので、監視サーバから情報を取 得できるように編集する。
まず、監視サーバからの読み出し許可設定を追記。SNMPコミュニティ名は「public」がデフォルト設定としては一般的だが、適宜設定。
\# 監視対象で設定
rocommunity SNMPコミュニティ名 監視サーバのIP # 追記
view all all # 追記
全インタフェースからの接続を許可するよう設定。
\# 監視対象で設定
#agentAddress udp:127.0.0.1:161 # この行はコメントアウト
agentAddress udp:161 # 追記
snmpdを再起動した後、監視サーバから以下のコマンドを実行して応答があればSNMPの設定は完了。
target$ sudo /etc/init.d/snmpd restart
server$ snmpwalk -v1 -c public 監視対象IPアドレス .1.3.6.1.2.1.1.1.0
SNMPv2-MIB::sysDescr.0 = STRING: Linux ubuntu1110s-01 2.6.38-8-server #42-Ubuntu SMP Mon Apr 11 03:49:04 UTC 2011 x86_64
↑ 応答の例
SNMPの設定(CentOSの場合)
通常、SNMPはデフォルトでインストールされるので、設定ファイルを編集して監視サーバから接続できるようにする。基本的にはUbuntuと同じ設定にすればよい。
\# 監視対象で設定
rocommunity SNMPコミュニティ名 監視サーバのIP # 追記
view all all # 追記
snmpdが自動起動するように設定し(どうやら初期設定では自動起動しないようになっている模様)、snmpdを再起動して設定を反映させる。
target$ sudo chkconfig snmpd on
target$ sudo /etc/init.d/snmpd start
server$ snmpwalk -v1 -c public 監視対象IPアドレス .1.3.6.1.2.1.1.1.0
SNMPv2-MIB::sysDescr.0 = STRING: Linux centos62-64-01 2.6.32-220.el6.x86\_64 #1 SMP Tue Dec 6 19:48:22 GMT 2011 x86\_64
↑ 応答の例
Cacti監視のためのMySQL設定
Percona Monitoring Plugins for Cactiは、監視対象のMySQLにログインして、色々な種類のshowコ マンドを実行して得られた結果をグラフにするので、監視対象のMySQLにユーザを追加する必要があ る。ここで指定するユーザ名とパスワードは、前回のエントリ でss_get_mysql_stats.phpファイルに書いた、 $mysql_user と $mysql_pass と一致させること。
target$ mysql -uroot
mysql-target> grant process, super on \*.\* to ユーザ名@監視サーバ identified by 'パスワ ード';
mysql-target> flush privileges;
Cactiからの監視設定
監視サーバのCacti管理画面で、画像のように Create → New Graphs → Create New Host とたどり、監視対象デバイス作成画面を開く。
以下のように入力し、「Create」ボタンを押す。
Description
監視対象ホスト名など、一意に監視対象がわかる記述
Hostname
監視対象IPアドレスあるいは名前解決できる場合ホスト名
Host Template
Percona MySQL Server HT
SNMP Community, SNMP Port
SNMPコミュニティ名にpublic以外を指定した場合は適宜設定
Createボタンを押した後、画面下側に関連づけられたグラフが一覧表示される。Percona Monitoring Pluginsで取得できる情報は、あくまでMySQLのものだけで、実際にはLinuxの情報も取得しておく必要があるので、Host Templateに「Linux Server Default Set」を選んでもう一度Createボタンを押 して、最低限のOS関連情報も取れるようにしておこう。
ここまで時点では、画面下側に表示されたグラフテンプレートがホストにひもづけられただけで、実際にグラフの作成は開始されていない。右上の「Create New Graphs」をクリックし、画像のように 作成したいグラフを選択して、「Create」を押すと、対応するグラフの情報取得が始まる。
ツリーへのホスト追加
この状態では左上の「graphs」タブに移動しても左側のツリーには追加したサーバは表示されていないだろう。もう一度「console」タブに戻り、 Management → Devices から、監視対象デバイスの一覧を開き、今追加したサーバにチェックを付ける。右下の「Choose an action」から、「Add graph to tree」を選択してGoボタンを押し、ツリーに追加すると、めでたく graph タブのツリーにホストが現れ、グラフが表示される。
画像がリンク切れの場合、まだグラフを描画できる情報が集まっていないので、少し(5分おきの情報収集がデフォルトなので、2回分10分以上)待ってもう一度確認しよう。画像は表示されたのに、いくら待ってもグラフが表示されない場合は、監視対象から情報が取得できていない可能性があるので、SNMPの設定やMySQLの設定(特にユーザ関連)を見直すべし。
グラフをどう読み取っていくかについては、以下の記事が参考になる。記事中には「better-cacti-template」とあるが、これはPercona Monitoring Plugin for Cactiの前身となるものなので、ほぼ同じと考えてよい。
これだけ見 れば大丈夫!ーMySQLパフォーマンス監視のツボ(クエリ編)
今回はPercona Monitoring Plugin for CactiのMySQLに関する部分だけを紹介したが、ApacheやMemcached、nginx、redisなどの情報グラフ化もできるので、お試しあれ。