MySQLでテーブルの行数を数える
テーブル内の行数を数えるのに一番簡単なのは、
select count(*) from 'テーブル名';
と実行することだが、これだと最悪そのテーブルを総なめすることになる。
こういう時はinformation schemaから情報を引く。information_schema.tablesテーブルのtable_rowsカラムが行数。
mysql> select table_schema, table_name, table_rows from information_schema.tables
-> where table_schema = 'hoge';
+--------------------+---------------------------------------+------------+
| table_schema | table_name | table_rows |
+--------------------+---------------------------------------+------------+
| hoge | wp_FollowMe_Links | 2 |
| hoge | wp_commentmeta | 180 |
| hoge | wp_comments | 60 |
| hoge | wp_ktaisession | 0 |
| hoge | wp_links | 7 |
| hoge | wp_options | 236 |
| hoge | wp_postmeta | 509 |
| hoge | wp_posts | 323 |
| hoge | wp_term_relationships | 39 |
| hoge | wp_term_taxonomy | 9 |
| hoge | wp_terms | 9 |
| hoge | wp_usermeta | 31 |
| hoge | wp_users | 2 |
+--------------------+---------------------------------------+------------+
showを使っても行数を引くことができるが、showの性質上表示させるカラムなどを細かく指定できず使いづらいこともあるので、information_schemaを引く方が好き。
show table status;
なおこれらのコマンドで引ける行数は、MyISAMなどのストレージエンジンでは正確な値だが、InnoDBの場合は概算値となる。なので、InnoDBの場合はselect count(*)するしかない。
Ubuntu Server 11.04マシンでUSB無線LANアダプタを使う
少し前に自宅で色々と検証したりするために、HP ML110 G6を買い、Ubuntu Server 11.04をインストールした。自宅は通信費節約のため、固定回線を引かず、外出時もそのまま使えるようにUQ WiMAXの回線を契約し、Aterm WM3500Rという無線LANルータを使っている。このため、ML110を無線LAN接続する必要がある。
近くのビックカメラで、安くて小さいUSB無線LANアダプタとしてプラネックスのGW-USNano2-Mを買ってきて、無線LANルータ経由でインターネットに接続するまでのメモ。
Ubuntu DesktopならGUIツールであれこれできるが、Serverなので全部CLIで。
ドライバパッケージをダウンロード
GW-USNano2-?(MやG)は、RealtekのRTL8192CUという無線LANチップを使っているようなので、これに対応したドライバをダウンロード。Realtekのダウンロードページを開き、以下のようにリンクをたどる
- Communications Network ICs
- Wireless LAN ICs
- WLAN NIC
- IEEE 802.11b/g/n Single-Chip
- Software
- RTL8192CUにチェックし、goボタン
- 「Linux driver for Kernel 2.6.38(and earlier)」から、RTL8192CU_linux_v3.1.2590.20110922.zipをダウンロード
ドライバのインストール
パッケージを展開し、コンパイル、インストール
$ unzip RTL8192CU_linux_v3.1.2590.20110922.zip $ cd RTL8192CU_8188CUS_8188CE-VAU_linux_v3.1.2590.20110922/ $ sudo sh install.sh
※ Ubuntu Serverをインストールした直後は、makeやgccがインストールされないので、事前にsudo apt-get install make gccしておく。
インストールされたら、ドライバモジュールがロードされていることを確認
$ lsmod Module Size Used by nls_utf8 12557 0 isofs 40283 0 vesafb 13761 1 8192cu 508081 0 ← ロードされている lp 17789 0 parport 46458 1 lp usbhid 46956 0 hid 91020 1 usbhid tg3 141750 0
無線LAN設定
WPA認証情報をファイルに書き込む。SSIDとキーは使用している無線LANアクセスポイントのものに置き換える。
$ wpa_passphrase [SSID] [キー] > wpa_supplicant.conf $ sudo mv wpa_supplicant.conf /etc/wpa_supplicant/ $ sudo chown root:root /etc/wpa_supplicant/wpa_supplicant.conf
認証の設定を/etc/network/interfaceに設定を書き込む。DHCPを使用する場合の例。3行目のSSIDは上と同じく置き換えること。
auto wlan0 iface wlan0 inet dhcp wpa-essid [SSID] wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
マシンを再起動
$ sudo reboot
再起動後、wlan0というインタフェースができており、ネットワークに接続できればOK。iwconfigコマンドで無線インタフェースの状態を確認できる。
lo no wireless extensions.
eth0 no wireless extensions.
wlan0 IEEE 802.11bgn ESSID:"aterm-xxxxxx-g" Nickname:"<WIFI@REALTEK>"
Mode:Managed Frequency:2.412 GHz Access Point: xx:xx:xx:xx:xx:xx
Bit Rate:150 Mb/s Sensitivity:0/0
Retry:off RTS thr:off Fragment thr:off
Power Management:off
Link Quality=47/100 Signal level=47/100 Noise level=0/100
Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
Tx excessive retries:0 Invalid misc:0 Missed beacon:0
historyに時刻を記録する
bash 3.0以上(最近のLinuxは大抵3.0以上)を使用している場合は、「HISTTIMEFORMAT」というシェル変数に時刻のフォーマットを入れることで、historyコマンドの実行結果(ファイル)にコマンドだけではなく時刻も記録できる。以下はhistoryコマンドの実行結果の例。
100 2011-11-22 10:16:59 ls 101 2011-11-22 10:17:03 cd /var/log/ 102 2011-11-22 10:17:04 ls
ホームディレクトリ以下の.bashrcや/etc/profile(全ユーザに適用したい場合)に
HISTTIMEFORMAT='%Y-%m-%d %T '
と書いておけばよい。時刻のフォーマットはdateコマンドと同じものが使えるようだ(man dateを参照)。
なお、historyコマンドでは上記のようなフォーマットが有効だが、.bash_historyファイルには、
#1321924619 ls #1321924623 cd /var/log/ #1321924624 ls
のように、UNIX時刻が付加される形で記録される。
携帯キャリアの使用するIPアドレス帯一覧
携帯キャリアのIPアドレス帯を調べる機会があったので、メモとして載せておく。ソフトバンクは2011年9月30日からサイトのアドレスが変わっているので注意。
- auフィーチャーフォン
http://www.au.kddi.com/ezfactory/tec/spec/ezsava_ip.html - auフィーチャーフォンメール
http://www.au.kddi.com/service/email/support/chui/shiyo/iip_ichiran.html - docomoフィーチャーフォン
http://www.nttdocomo.co.jp/service/developer/make/content/ip/ - docomoスマートフォン(spモード)
http://www.nttdocomo.co.jp/service/developer/smart_phone/technical_info/etc/index.html - softbankフィーチャーフォン
http://creation.mb.softbank.jp/mc/tech/tech_web/web_ipaddress.html - softbankフィーチャーフォンメール
http://creation.mb.softbank.jp/mc/tech/tech_mail/mail_ipaddress.html - softbankスマートフォン
https://www.support.softbankmobile.co.jp/partner/home_tech1/index.cfm - softbankスマートフォンメール
https://www.support.softbankmobile.co.jp/partner/home_tech2/index.cfm - willcom
http://www.willcom-inc.com/ja/service/contents_service/create/center_info/ - emobile
http://developer.emnet.ne.jp/ipaddress.html
CentOSで各種ビープ音を鳴らさないようにする
<ログイン時>
Xを起動するようにしていると(ランレベル5)、ログイン画面表示時にビープ音が鳴る。
「システム(System)」→「管理(Administration)」→「ログイン画面(Login Screen)」から「アクセシビリティ(Accessibility)」タブを開き、「ログイン画面を表示した時」のチェックを外す。
ログアウトし、次にログイン画面が表示されるときには、ビープ音は鳴らないようになっているはず。
<ターミナル使用時>
ターミナルを使用している時にタブを使ったりすると、ビープ音が鳴ることがある。
/etc/inputrc に以下の行を追加する(コメントアウトされた状態で既に記述があるはず)
set bell-style none
ログインしなおすと、設定が有効になりビープ音は鳴らなくなる。
<vi>
vi(vim)を使用していると、コマンドを間違えた時などにビープ音が鳴る。
viの設定ファイル(ホームディレクトリの.vimrcや/etc/skel/.vimrcなど)に以下の行を追加する。
set visualbell
記述してからviを起動すると、ビープ音は鳴らなくなる。
<全部のビープ音を鳴らないようにする>
ビープ音は、pcspkrというモジュールを経由して、マザーボード上のスピーカを動かして鳴らしている。このモジュール自体をロードしないようにしてしまえば、ビープ音は鳴らない。
/etc/modprobe.d/blacklist ファイルに以下の行を追加する。
blacklist pcspkr
<VMware Playerを使用している場合>
VMware Playerを使用している時には、ゲストOSでビープ音が鳴るタイミングで、VMware Playerを通じて、ホストマシンのビープ音が鳴ってしまう。これを鳴らさないようにするには、VMware側の設定でビープを無効にしてしまう。
C:\Users\(ユーザ名)\AppData\Roaming\VMware\preferences.ini ファイルと、対象になる仮想マシンの設定ファイル(.vmx)に以下の行を追加する。
mks.noBeep = "TRUE"
<Windowsでビープ音を鳴らさないようにする>
ついでにWindowsの場合も。ビープ音を鳴らすドライバを無効にしてしまう。以下、Windows 7での例。
- コントロールパネルなどから「デバイスマネージャ」を起動
- 「表示」→「非表示のデバイスの表示」
- ツリーから「プラグアンドプレイではないドライバ」→「Beep」を右クリックし、プロパティ
- 「ドライバー」タブで「停止」を選択
以上
bshでのクォーテーションの入れ子
特殊文字(?など)をそのまま文字として扱いたい場合などに、シングルクォーテーション(‘)やダブルクォーテーション(“)で文字をくくる。
- 「”」でくくった文字列は、その中に特殊文字が含まれているならそれを展開する。
- 「’」でくくった文字列は、その中に特殊文字が含まれていてもそれを展開せず、そのまま表示する。
[hoge@symf test]$ abc=3 ↑ abcという変数に3を代入 [hoge@symf test]$ echo $abc 3 ↑ abcという変数の中身を表示 [hoge@symf test]$ echo "$abc" 3 ↑ 「"」は特殊文字を展開するので変数として扱われるので、上に同じ [hoge@symf test]$ echo '$abc' $abc ↑ 「'」は特殊文字をそのまま表示する
クォーテーションを入れ子にする際には、シングルとダブルで少しやり方が違う。「man bash」の「クォート」の項には以下のように書かれている。
シングルクォートで文字を囲むと、クォート内部のそれぞれの文字は文字としての値を 保持 します。シングルクォートの間にシングルクォートを置くことはできません。これはバックスラッシュを前に付けても同じです。
ダブルクォートで文字を囲むとクォート内部の全ての文字は文字としての値を保持しま すが、 $, ‘, \ は例外となります。 $ と ‘ はダブルクォートの内部でも特殊な意味を失いません。バックスラッシュの場合は、次の文字が $, ‘, “, \,のいずれかである 場合に限り特殊な意味を失いません。前にバックスラッシュを付ければ、ダブルクォート文字をダブルクォートによるクォートの内部でクォートできます。
つまりこういうこと。
[hoge@symf test]$ ssh server "psql -c \"create database test with ENCODING = 'UTF8' ;\" " ↑ 「"」の中に「\"」があるので、これは成功 [hoge@symf test]$ ssh server 'psql -c \"create database test with ENCODING = 'UTF8' ;\" ' ↑ 「'」の中では「\」をつけてもダメなので、これは失敗
create databaseじゃなくてcreatedbを使えば、クォートを入れ子にしなくてもいいって?あくまで例ですから (`・ω・´)キリッ
shのwhileループでファイルを読み、中でsshを実行すると1回しかループしない
シェル(sh)スクリプトネタ。
while 文で以下のように指定すると、行ごとにファイルを読み込むことができる。
#!/bin/sh # ファイルを1行ずつ読み込んで表示 TESTFILE=./hoge.txt while read line do echo $line done < $TESTFILE
しかし、 while ループの中で ssh や rsh を実行すると、読み込むファイルが複数行あっても、1行目しか処理されない。
#!/bin/sh # TESTFILEが複数行あっても1行目のみ処理されてループ終了 while read line do ssh 192.168.0.1 touch $line done < $TESTFILE
SSH を実行すると、標準入力がそちらに振り向けられるため、read で読んだ1行のみならず、ファイル全体が SSH に渡されてしまう。従って、SSH を実行した後はもう読める行がないので while ループは1回で終了してしまう。
これを防ぐには、ssh に -n オプションを付け、/dev/null をリダイレクトし、標準入力をリダイレクトしないようにする。
#!/bin/sh # TESTFILEが複数行あればその行数分処理が実行される while read line do ssh -n 192.168.0.1 touch $line done < $TESTFILE
なおこれは rsh コマンドでも同じ仕様になっているようだ。
なぜ1行目だけで終わってしまうのか分からずうんうんうなってたら、この本に書いてあった。
ディレクトリをディレクトリにマウント
Linuxで、ディスクデバイスではなく、ディレクトリをディレクトリにマウントしたい時は
mount --bind マウントしたいディレクトリ マウントポイント
fstabに書いてしまうときは以下のように書く。
マウントしたいディレクトリ マウントポイント none bind 0 0
例えば /home を /hoge/home としてマウントしたい時は
/home /hoge/home none bind 0 0
なお、マウントしたいディレクトリ(上の例では/hoge)よりも後にこの行を書かないと、マウントできないので注意。
sarコマンドでシステムのボトルネックを探る(2)
CPUの処理の状況を調べるためには、sar (sar -u)が有効であることを前のエントリで書いた。次はメモリの使用状況を調べてみる。まず見てみるのは、メモリとスワップの使用状況を示す sar -r の結果である。
[doublemarket@hoge ~]$ sar -r Linux 2.6.18-194.8.1.el5 (hoge) 2011年02月15日 00時00分01秒 kbmemfree kbmemused %memused kbbuffers kbcached kbswpfree kbswpused %swpused kbswpcad 00時10分01秒 12964 497568 97.46 30880 107440 1984336 63940 3.12 16392 00時20分01秒 13064 497468 97.44 30972 107376 1984336 63940 3.12 16392 00時30分01秒 12692 497840 97.51 31092 107236 1984336 63940 3.12 16392 : : 20時20分01秒 43756 466776 91.43 45624 139552 1984336 63940 3.12 16288 20時30分01秒 27008 483524 94.71 46420 147608 1984336 63940 3.12 16288 20時40分01秒 22664 487868 95.56 46840 148920 1984336 63940 3.12 16288 20時50分01秒 22300 488232 95.63 47192 148968 1984336 63940 3.12 16288 平均値: 84267 426265 83.49 32592 129944 1984336 63940 3.12 16300
それぞれの列の意味は以下の通り。
- kbmemfree
- 物理メモリの未使用KB。
- kbmemused
- 物理メモリの使用済みKB。
- %memused
- 物理メモリの使用率。Linuxでは、使用されていないメモリ領域をファイルシステムキャッシュ領域として使用するので、通常はほとんどfree部分はないものと考えてよい。従って、常に90数%といった高い使用率になる。実際にアプリケーションの動作に使われているメモリの量は、下の指標を確認する必要がある。
- kbbuffers
- カーネルがバッファ領域として使用しているメモリ量のKB。
- kbcached
- カーネルがキャッシュとして使用しているメモリ量のKB。kbmemusedからkbbufferesとkbcachedを引いた値が、実際にアプリケーションに割り当てられているメモリ量ということになる。逆に言えば、kbbufferesとkbcachedの容量が、kbmemusedの大部分を占めているようなら、アプリケーションにとってメモリ不足とは言えないということになる。
- kbswpfree
- スワップ領域の未使用量KB。
- kbswpused
- スワップ領域の使用済みKB。
- %swpused
- スワップ領域の使用量。通常ほとんど0だが、物理メモリが不足してくると使用率が上がってくる。数%であれば実質的にシステムの動作には影響がない場合が多いが、あまり多いようだと、スワップ領域へのアクセスが頻発している可能性もあり、システム全体のスループットを落とすことがある。%swpusedが大きく、かつsar -uのiowaitの値も大きい場合、ほぼ間違いなくスワップ領域へのアクセスでスローダウンしているので、物理メモリの増設などのメモリ不足解消策を取る必要がある。
- kbswpcad
- 何の指標かよく分からなかったが、manページによると、一旦スワップ領域へ飛ばされたものの(スワップアウト)、スワップ領域からメモリに戻され(スワップイン)、かつまだスワップ領域にデータが残っている、というデータの量とのこと。
各列の値の傾向を見ると、上記のようにメモリ不足なのかどうかの手がかりが得られる。その他に詳しい情報を見たいときは、以下のオプションも用意されている。
- sar -R
- メモリ上のページの使用状況。
- sar -W
- スワップの発生状況。ページイン(スワップ領域から物理メモリへのページの移動)とページアウト(物理メモリからスワップ領域へのページの移動)がどの程度発生したのかを確認できる。
- sar -B
- ページングの状況。ページイン・ページアウトされたデータ容量、ページフォルトの回数、メジャーなページフォルトの回数をそれぞれ確認できる。
sarコマンドでシステムのボトルネックを探る(1)
前回のエントリでは、システムのレスポンスが悪化している場合、まずとっかかりとしてtopコマンドを実行し、ロードアベレージを確認する方法を書いた。さらに踏み込んで、何が負荷の原因なのかを探るために、sarコマンドを使う方法について書く。
sarコマンドをオプションをつけずに実行すると、以下のような出力が得られる。ファイルを指定しないと、コマンドを実行した当日の0:00から直前までの10分おきの情報が表示される。過去の情報は/var/log/saディレクトリ以下に保存されており、「sar -f sa07」などと指定すると、そのファイルに保存された情報が閲覧できる。saの後の数字は日付を表している。
sarを実行してもコマンドが見つからない場合、sysstatパッケージがインストールされていないので、インストールすべし。
[doublemarket@hoge ~]$ sar Linux 2.6.18-194.8.1.el5 (hoge) 2011年02月15日 00時00分01秒 CPU %user %nice %system %iowait %steal %idle 00時10分01秒 all 0.05 0.00 0.08 0.02 0.00 99.85 00時20分01秒 all 0.03 0.00 0.08 0.02 0.00 99.88 00時30分01秒 all 0.07 0.00 0.11 0.02 0.00 99.79 : : 20時00分01秒 all 0.03 0.00 0.06 0.00 0.00 99.90 20時10分01秒 all 0.06 0.00 0.11 0.03 0.00 99.80 20時20分01秒 all 0.16 0.00 0.14 0.03 0.00 99.67 20時30分01秒 all 1.11 0.00 0.27 0.12 0.00 98.50 20時40分01秒 all 0.08 0.00 0.12 0.05 0.00 99.76 平均値: all 0.08 0.00 0.10 0.09 0.00 99.73
ここで得られる結果は、sar -uと同じものである。それぞれの列の意味は以下の通り。
- user
- ユーザプログラムの実行に使用されたCPUリソースの割合
- nice
- niceによる優先度を処理するために使用されたCPUリソースの割合
- system
- カーネルが使用したCPUリソースの割合
- iowait
- I/O待ちの割合
- idle
- I/O待ち以外でCPUが待ち状態だった割合(何もしていない時間)
なお、マルチCPUの環境の場合ここに表示されているのは、全CPUの合算使用率になっている。それぞれのCPUの使用率を確認したい場合、「sar -P ALL」を実行する。意外と処理が特定のCPUに偏っていたりするので、こちらも確認してみた方がよい。
→ sarコマンドの実行結果からシステムの負荷状況に関して、以下の傾向がつかめる。
- userの値だけが高い(他の値は低いまま)
- CPUリソースを必要とするアプリケーションが動作している。
topやps auwxなどのコマンドでプロセスごとのCPU使用率を調べ、無限ループなどの不具合によるCPU使用率の上昇でないかなど、異常を確認。単に処理が重くなっているだけなら、スケールアップ(CPUを高速化)、スケールアウト(マシンを増設)を検討する。 - iowaitの値が高い
- そのマシンに求められる処理に対して、ハードディスクの速度が追いついていない。アプリケーションやミドルウェア(特にデータベースなど)のキャッシュの仕組みを見直したり、読み書きに使う物理的なディスクを分散させるなどして、なるべくディスクの読み書きが発生しない方法を考える。それでも高いままなら、より高速なディスクを使うしかない。なおたいていの場合は
・アプリケーション自体がディスクにアクセスする速度が遅い
・メモリが不足していてスワップ領域(つまりディスク)へのアクセスが頻発していて遅い
の2つに問題を分けることができる。このうちのどちらかという判断は、sar -rの結果などを見る必要がある。 - systemの値が高い
- 仕組み的にいえば、コンテキストスイッチがたくさん発生していると値が上がるはずなので、必要以上にたくさんのプログラムを並列に処理しすぎていると、この値が異常に上がるということになるが、よく分からない。
sarコマンドには、メモリやディスク、ネットワークなどに関する情報が得られるよう、他にも色々なオプションがある。
Twitter
FourSquare