Sep - 29th
/proc/PID/statusのVmHWM(とVmPeak)
Posted at 9:23 pm | Filed Under Books, Linux
この有名なエントリで読んだ、プロセスが使用しているメモリサイズを調べる方法の話が「サーバ/インフラを支える技術」にも載っていた。
しかし、注意しなければいけない。VmHWMはたとえばCentOS 4.5でカーネルを更新していなかったりする場合は表示されない。
では、いつそんなものが表示されるようになったのか。さすがにそんなマニアックなことはちょっとわからなかったので調べてみた。Googleではなかなかヒットしてくれない。仕方がないのでkernel.orgから2.6.xxのChangelogだけwgetしてgrepで探してみたら、2.6.15に
And there has been no collector of these hiwater statistics in the tree. The
new convention needs an example, so match Frank’s usage by adding a VmPeak
line above VmSize to /proc//status, and also a VmHWM line above VmRSS
(High-Water-Mark or High-Water-Memory).
という記述を発見。こいつだ。
Sep - 1st
fshの代わりにsshを使う
Posted at 5:23 am | Filed Under Linux
fshがpython-2.4以降にちゃんと対応していないので、fshを使ったシステム構成は後で困ることになるなあ、となんとなく悩んでいたのだが、ふと調べてみると「Speeding up SSH: fsh vs. OpenSSH v4 」という記事を見つけた。そのエントリにリンクされている「Quick-Tip: Reusing OpenSSH connections to the same host 」という記事によれば、OpenSSHのバージョン4以降であればfshのようなコネクションプーリング用のプログラムなしでもコネクションの再利用が出来るらしい。やり方はいたって簡単。$HOME/.ssh/configを編集して下のような行を追加する。
Host * ControlMaster auto ControlPath /tmp/%r@%h:%p
意味は、全てのホストでControlMasterを利用するように指定して、接続情報は/tmpに保存する、というものになる。いきなり/tmpだとマルチユーザのシステムではいかがなものかと思われるので、$HOME以下に適当な場所を指定する方がいいとのこと。まあ、その通りだ。autoのかわりにautoaskにすると、毎回接続を試みるたびにセッションを使い回すかどうか質問される。
実際に接続すると、ControlPathで指定した箇所に「リモートユーザ名@ホスト:ポート番号=」という名前のファイルが出来上がる。手元の環境でfsh、ssh共に適当な回数で実行してみたが、こんな結果になった。
まずはfsh:
localhost:~ yagi$ time fsh 192.168.x.xx ls > /dev/null
real 0m0.607s
user 0m0.039s
sys 0m0.021s
localhost:~ yagi$ time fsh 192.168.x.xx ls > /dev/null
real 0m0.121s
user 0m0.038s
sys 0m0.020s
localhost:~ yagi$ time fsh 192.168.x.xx ls > /dev/null
real 0m0.117s
user 0m0.035s
sys 0m0.019s
localhost:~ yagi$ time fsh 192.168.x.xx ls > /dev/null
real 0m0.130s
user 0m0.036s
sys 0m0.021s
初回の接続だけ0.6秒かかったが、あとはおおむね0.12秒くらい。
続いてssh:
何もしないとおよそ0.3秒くらいかかる。ところが、ControlPathで指定したディレクトリにファイルが出来ると一気に
real 0m0.054s
user 0m0.004s
sys 0m0.005s
こんなスコアになってしまった。fshより早いってのはどういうことだ?
Jul - 1st
crontabの責任者ちょっと来い
Posted at 4:34 pm | Filed Under Linux
crontabのオプションに「-r」というのがあるのをご存知だろうか。ご存知でしたか。そうですか。
manによれば、crontabについてこんな風に説明されている。
crontab コマンドは、IEEE Std1003.2-1992 (“POSIX”) に準拠している。この新しいコマンドのシンタックスは、 Vixie Cron の前のバージョンと異なっている (古典的な SVR3 シンタックスとも異なる)。
なるほど。作者のPaul Vixieという人の独断で作られたわけではないようだ。
しかし、このコマンド、とんでもなく人倫にもとる設計になっている。
みなさんがcrontabコマンドを利用するのは、たいてい編集(「crontab -e」)か閲覧(「crontab -l」)で、あとはせいぜいユーザを指定する(「crontab -u user -l」)くらいだろう。
だが、crontabのオプションにはもうひとつ「-r」というものがある。これは、
-r オプションは、現在の crontab を削除する。
という、実に問答無用なオプションで、編集の「e」のすぐ脇の「r」を押下してしまったが最後、あなたのcronは/var/log/cronにわずかな痕跡を残しただけできれいさっぱり消えてしまうのである。あなおそろしや。しかもご丁寧に何ら確認のメッセージを出すこともなく動いてしまう。rmやmvのように「-i」オプションをaliasに追加しておくようなせめてもの予防策さえない。
今日もどこかでcronの内容が意図せざる方法で消えているのだろうか。
Jun - 25th
シェルスクリプトに無知なもので
Posted at 2:42 am | Filed Under Linux
bashで文字列を変数に展開するのにsedを何回も呼ぶのはいかがなものかと思ったので、なんとからなんかといじっていたら、文字列を分解して変数に展開するのは配列を使ってこういう感じでやるのかと気づいた。
$ cat test.sh
#!/bin/bash
TESTDATA="1 2"
DATA=(`sed <<< $TESTDATA -e s/[^0-9]/\ /g`)
echo ${DATA[0]}
echo ${DATA[1]}
$ ./test.sh
1
2
そこで他にもないか調べていたら、sedの呼び方は
$ echo $AAA | sed -e s/3/aho/g
より
$ sed <<< $AAA -e s/3/aho/g
の方が早いらしい。
ちょっと計ってみた。
#!/bin/sh
MAX=1000
COUNT=1
while [ $COUNT -le $MAX ];
do
echo $COUNT | sed -e s/[0-9]/hoge/g
COUNT=`expr $COUNT + 1`
done
これと
#!/bin/sh
MAX=1000
COUNT=1
while [ $COUNT -le $MAX ];
do
sed <<< $COUNT -e s/[0-9]/hoge/g
COUNT=`expr $COUNT + 1`
done
これで計測した結果。
MAXを1000にしたら
echo :real 0m4.470s
ヒアドキュメント:real 0m3.679s
MAXを10000にしたら
echo :real 0m43.403s
ヒアドキュメント:real 0m36.990s
とっても素直な結果だ。
Jun - 24th
CiscoのVPNクライアント(Linux版)でがっくり
Posted at 7:24 pm | Filed Under Linux
CiscoのVPNクライアントを使わなければいけない環境でWindows用クライアントしかもらえず、それでもLinuxマシンをクライアントにしたい人用のメモ。
事前にこれだけは知っておかないといけない。
・SMP対応カーネルだとビルドできない
・パッチは出てるけど2.6.19以降のみ対応
上の条件に当てはまってしまった場合はカーネルの再構築やらなにやらいろいろ作業が発生するので大変に面倒くさい。VPNクライアントが動いたのに他に問題が起きたら嫌だから回避、という選択も間違っていない。というか、自分ではやらない。みなさんにもお勧めできない。
May - 27th
Microsoftからの刺客、その名もWIMP
Posted at 3:09 pm | Filed Under Apache, Linux, PHP, Windows
LAMPに対抗して、MicrosoftがIIS上でPHPを動かす環境を宣伝している。MSSQLではなくMySQLやPostgreSQLを宣伝するというのも愉快ではあるが。
それより何より、やはり気になるのは
Linux + Apache + MySQL + Perl(PHP, Python…) = LAMP
に対抗したキャンペーンの略称が、
Windows + IIS + MySQL + PHP = WIMP
になってしまっていることだろうか。
wimp
【名】弱虫、作話症{さくわしょう}、意気地なし、怖がり、勇気のないやつ、すぐあきらめるやつ
・You’re such a wimp. : 気が小さいね。
・That tequilla shot has been sitting there an hour, are you too much of a wimp to drink it?
さすが世界のMicrosoftはユーモアを忘れていない。
Apr - 16th
へたれな疑問
Posted at 10:03 pm | Filed Under Linux, PHP
Gnome端末でもPuttyでも、表示をEUC-JPに設定していてもメールをprocmailから標準入力で受け取ってMIMEデコードしただけのJIS(ISO-2022-JP)の文字列をきちんと表示する。あれ?と思ってただのJISを表示させたら、やっぱり文字化けしない。
$ cat test.php <?php $str = 'ダライラマ'; print(mb_convert_encoding($str, 'JIS', 'EUC-JP') . "\n"); ?> $ php -q test.php ダライラマ
この原理がわからない。JISのエスケープを見つけたらせこせこ処理してくれているんだろうか。viだとちゃんと文字化けする。
日本語環境の設定で苦労したのももう今は昔の話なので、この手の問題についてはぜんぜんわからなくなってしまった。
Apr - 14th
telnet.exeのリトライ回数を制御できないか?
Posted at 7:51 pm | Filed Under Linux, Windows
knockdを使ってクライアントマシンが接続するポートの順番を決めて、そのとおりにアクセスしてきたクライアントにだけssh経由の接続を許可しようとすると、Mac OS XやLinuxマシンをクライアントにした接続では問題ないのに、WindowsXPからのログインだけが成功するときと失敗するときがあって、あるときはWindowsファイアーウォールをオフにしたら繋がったり、またあるときはぜんぜん失敗ばかりだったり、とにかく安定しない。仕方がないので、ソケット通信をサポートするスクリプト言語ならなんでもいいので、そっちで接続すると、問題なくすべてのステージをクリアできる。
問題はtelnet.exeにあったようで、会社の同僚が調べたところ、telnet.exeは何回か接続をリトライするらしく、そのため例えば5回リトライするなら、最初のポートへの5回目の接続と次のポートの1回目の接続はたまたまうまくいくため、最初のステージ(knockdでは一回ごとの「ノック」をステージと呼ぶ)だけはクリアして、後は失敗していたのが判明した。つまりtelnetのリトライ回数を制御できないとどうやっても駄目らしい。じゃあなぜうまくいったときがあったのかが謎だ。
Mar - 3rd
lshwのSegmentation fault
Posted at 4:43 pm | Filed Under Linux
CentOS 4.6でlshwを叩くとSegmentation faultが発生するようになった。原因不明。
安直な解決として、最新版にアップグレードしたら出なくなった。今のところ正常動作している。
Jan - 9th
CentOS 5にはfshが入っていなかった
Posted at 10:43 pm | Filed Under Linux, Security, Tuit
CentOS 4に入っていたfshがCentOS 5のyumでは見付からないのでどうしたのかと調べていたら、fshはPython2.4ではちゃんと動かないという問題があるのがわかった。いちおう、探すとパッチは見付かった。いまのところ問題なく動作している。
でも、製品レベルのものに使うのは無理だなあ。fshの更新はそもそも2001年から止まっている状態だし。
誰かPythonの人がいたら、ちょっくらメンテナンスしてほしいなあ。
keep looking »