メモリをひたすら消費したいというシチュエーションで メモリをがんがん消費する Perl ワンライナー を発見。ただ ESXi がメモリを重複排除しちゃう可能性があるので、そういう可能性が低そうな形にアレンジしました。
perl -e '$hn=`hostname`; while(1){$i++;$h{$i}=$i . " $hn" . 'x'x4000 }'
2013年12月12日木曜日
2008年7月11日金曜日
SmartArray E200 の障害検知
HP ProLiant ML110 G5 に搭載した SmartArray E200 コントローラのステータスを監視するために HP Array Configuration Utility CLI (hpacucli) を入れてみました。
本当な HP 社製サーバの場合は System Management Homepage 等をインストールし設定すれば終わりなのですが、廉価なサーバである HP ProLiant ML110 G5 では SMH が利用できません。このため、 SMH を利用せずに、 CLI ベースでアレイの状態を確認できるツールを利用して定期的にアレイのステータスを確認する方針とします。
HP ProLiant ML110 G5 + CentOS 5.1 (x86版) + SmartArray E200 の構成で作業しました。
今回ダウンロードしたのは hpacucli-8.10-2.noarch.rpm (2.96 MB)です。
使い方1: システム上のコントローラ情報を取得する
使い方2: コントローラ上の論理ボリューム情報を取得する
使い方3: コントローラ上の物理ドライブ情報を取得する
ただ、毎日ステータスを確認するわけにもいかないので、スクリプトで自動的に障害を検出できるようにしてみます。状態の判断は以下の2ポイントで行うことにしました。
ふたつめの条件は、ドライブに障害が発生した場合に ??? GB, failed) などと出力されるようなので(ドキュメントを参照のこと)、障害を示す failed の文字列で引っかけています。ただし今回のサーバは実際にサービスを提供するため、万が一 failed で引っかからない場合のことを考え OK の表示が 4 行あることも併せて確認する方針としました。論理式では以下のとおりです。
上記判断を行い、異常が認められた場合にメールを送信するスクリプトを以下に示します。
本当な HP 社製サーバの場合は System Management Homepage 等をインストールし設定すれば終わりなのですが、廉価なサーバである HP ProLiant ML110 G5 では SMH が利用できません。このため、 SMH を利用せずに、 CLI ベースでアレイの状態を確認できるツールを利用して定期的にアレイのステータスを確認する方針とします。
HP ProLiant ML110 G5 + CentOS 5.1 (x86版) + SmartArray E200 の構成で作業しました。
今回ダウンロードしたのは hpacucli-8.10-2.noarch.rpm (2.96 MB)です。
# wget ftp://ftp.hp.com/pub/softlib2/software1/pubsw-linux/p414707558/v47111/ hpacucli-8.10-2.noarch.rpm # rpm -i hpacucli-8.10-2.noarch.rpm
使い方1: システム上のコントローラ情報を取得する
# hpacucli ctrl all show Smart Array E200 in Slot 4 (sn: xxxxxxxxxxxxx)
使い方2: コントローラ上の論理ボリューム情報を取得する
# hpacucli ctrl slot=4 array all show Smart Array E200 in Slot 4 array A (SAS, Unused Space: 0 MB)
使い方3: コントローラ上の物理ドライブ情報を取得する
# hpacucli ctrl slot=4 pd all show Smart Array E200 in Slot 4 array A physicaldrive 1I:0:1 (port 1I:box 0:bay 1, SAS, 300 GB, OK) physicaldrive 1I:0:2 (port 1I:box 0:bay 2, SAS, 300 GB, OK) physicaldrive 1I:0:3 (port 1I:box 0:bay 3, SAS, 300 GB, OK) physicaldrive 1I:0:4 (port 1I:box 0:bay 4, SAS, 300 GB, OK)
ただ、毎日ステータスを確認するわけにもいかないので、スクリプトで自動的に障害を検出できるようにしてみます。状態の判断は以下の2ポイントで行うことにしました。
- OK の表示が正常なドライブの数が期待値と一致すること
- failed の表示が存在しないこと
ふたつめの条件は、ドライブに障害が発生した場合に ??? GB, failed) などと出力されるようなので(ドキュメントを参照のこと)、障害を示す failed の文字列で引っかけています。ただし今回のサーバは実際にサービスを提供するため、万が一 failed で引っかからない場合のことを考え OK の表示が 4 行あることも併せて確認する方針としました。論理式では以下のとおりです。
障害 = OKの数がドライブ数と不一致 || failedの数がゼロ以上
上記判断を行い、異常が認められた場合にメールを送信するスクリプトを以下に示します。
#!/bin/sh SUBJECT="XXX.example.jp RAID Array Status Alert" MAILTO=hasegaw@exmaple.jp PATH=/sbin:/bin:/usr/sbin:/usr/bin OK_DRIVES=`( hpacucli ctrl slot=4 pd all show 2>&1 ) \ | grep 'OK' | wc -l` FAILED_DRIVES=`( hpacucli ctrl slot=4 pd all show 2>&1 ) \ | grep 'failed' | wc -l` FAILED=0 # 正常状態の物理ドライブ数をカウントする if [ $OK_DRIVES -ne 4 ]; then FAILED=1 fi # failed と表記された物理ドライブ数をカウントする if [ $FAILED_DRIVES -ne 0 ]; then FAILED=1 fi # ドライブの異常が確認できない場合 if [ $FAILED -eq 0 ]; then exit fi # メールを生成する ACULOG=`( hpacucli ctrl slot=4 pd all show 2>&1 ) ` cat <<EOF | mail -s "$SUBJECT" $MAILTO OK=$OK_DRIVES, FAILED=$FAILED_DRIVES $ACULOG EOF
2008年4月1日火曜日
LWP::get()を使うコードにキャッシュ機能を付ける
RSSリーダーなブログパーツが欲しい、けど、既存のサービスを使うのは嫌なのでなんとなくフルスクラッチで書いてみることにした。
とりあえず動くようにはなったんだけど、せめてRSSのキャッシュぐらいは実装しておかないとRSSの取得先サーバにとって迷惑だ。なんかないかなぁとCPANをガサゴソしてみたらHTTP::Cache::Transparentモジュールが使えそうなので、早速試してみる。
使い方は、
らしい。…簡単だー。とりあえず追加してみたコード。
一発スクリプトを走らせた後にキャッシュディレクトリを見てみると
とりあえず動くようにはなったんだけど、せめてRSSのキャッシュぐらいは実装しておかないとRSSの取得先サーバにとって迷惑だ。なんかないかなぁとCPANをガサゴソしてみたらHTTP::Cache::Transparentモジュールが使えそうなので、早速試してみる。
使い方は、
- use LWP::Simple の後にuse HTTP::Cache::Transparent する
- HTTP::Cache::Transparent::init() に設定を渡してモジュールを初期化
- いつも通り LWP で get() する
らしい。…簡単だー。とりあえず追加してみたコード。
$DIR_HTTPCACHE = '/home/doggie/data/rss_cache';
HTTP::Cache::Transparent::init( {
BasePath => $DIR_HTTPCACHE,
Verbose => 0,
MaxAge => 12,
NoUpdate => 30 * 60,
} );
HTTP::Cache::Transparent::init() に渡せるオプションはこれだけ。- BasePath
キャッシュ領域として使用するディレクトリ - Verbose
冗長出力するかしないか(1 or 0) - MaxAge
キャッシュが生き続ける最大時間(単位:hour) - NoUpdate
最後にキャッシュが更新されてから、実際のHTTP問い合わせを抑制する時間(単位:second)
一発スクリプトを走らせた後にキャッシュディレクトリを見てみると
doggie@elena:~$ ls -l /home/doggie/data/rss_cache/ 合計 28 -rw-r--r-- 1 doggie users 26387 2008-03-31 20:27 6b2b2adb261025db95ada29a0f5dd44dおー、うまく機能している模様。
2008年3月23日日曜日
UTF-8フラグにハマる
前回の続き。UTF-8の文字列をUTF-16LE with BOMに変換する際に、入力文字列によってはEncode::from_toが死ぬ。どうやら原因は入力文字列にUTF8フラグが立っているか否かのようだ(立っているとダメ)。
sub utf16bom {
my $s = shift;
$s = encode("utf8", "$s") if (utf8::is_utf8($s));
Encode::from_to($s, 'utf-8', 'UTF-16LE');
if($@)
{
die 'encoding error'; }
$s= "\xff\xfe" . $s . "\x0\x0";
return $s;
}
2008年3月21日金曜日
iTunes対応のUTF-16LE ID3v2タグを付加する
PerlスクリプトからMP3ファイルにID3タグを付けようとしてハマる。
MP3::Tag を使い iTunes で読めるようなID3タグを付けたかったのだが、何パターンか試したもののうまくいかなかった。原因がわからないので iTunes が生成した ID3 タグを MP3::Tag の出力結果と比べ、同じような結果が得られるようなコードを書いたのだがそれでもなお、うまくいかない。
寝たり他ごとしたりしつつ 12 時間ぐらいたってしまったが、解決しないので、 ID3v2 フォーマットの仕様書を見てみた。
ID3 tag version 2.4.0 - Main Frames の 4. ID3v2 frame overview には、以下の通り記述がある。
つまり iTunes 互換の UTF-16 Little Endian でエンコードする場合は
上記 2 点を満たす必要があるようだ。これを MP3::Tag で素直に書くと
という感じになるのだが、手元のマシンにインストールされていた sarge の MP3::Tag 0.40 だと ID3v2.pm に以下の Encoding=0 を強制するコードがあって encoding=1 を受け入れてくれない。まったく余計なことしてくれる。
仕方ないので 453 行目をコメントアウトしてしまい、とりあえず目的は達成できるようになった。だるー。さっさとソースや仕様にあたれってことですかね...
MP3::Tag を使い iTunes で読めるようなID3タグを付けたかったのだが、何パターンか試したもののうまくいかなかった。原因がわからないので iTunes が生成した ID3 タグを MP3::Tag の出力結果と比べ、同じような結果が得られるようなコードを書いたのだがそれでもなお、うまくいかない。
寝たり他ごとしたりしつつ 12 時間ぐらいたってしまったが、解決しないので、 ID3v2 フォーマットの仕様書を見てみた。
ID3 tag version 2.4.0 - Main Frames の 4. ID3v2 frame overview には、以下の通り記述がある。
Frames that allow different types of text encoding contains a text encoding description byte. Possible encodings: $00 ISO-8859-1 [ISO-8859-1]. Terminated with $00. $01 UTF-16 [UTF-16] encoded Unicode [UNICODE] with BOM. All strings in the same frame SHALL have the same byteorder. Terminated with $00 00. $02 UTF-16BE [UTF-16] encoded Unicode [UNICODE] without BOM. Terminated with $00 00. $03 UTF-8 [UTF-8] encoded Unicode [UNICODE]. Terminated with $00. Strings dependent on encoding are represented in frame descriptions as, or if newlines are allowed. Any empty strings of type $01 which are NULL-terminated may have the Unicode BOM followed by a Unicode NULL ($FF FE 00 00 or $FE FF 00 00).
つまり iTunes 互換の UTF-16 Little Endian でエンコードする場合は
- BOM (リトルエンディアンの場合は 0xFF 0xFE) ではじまり、 0x00 0x00 で終わること
- encoding description byte が 1 であること
上記 2 点を満たす必要があるようだ。これを MP3::Tag で素直に書くと
use MP3::Tag;
use Encode qw/encode/;
(省略)
$id3v2->add_frame("TPE1",
1, #encoding description byte
sprintf("\xFF\xFE%s\x00\x00", encode('UTF-16LE', '初音ミク'));
という感じになるのだが、手元のマシンにインストールされていた sarge の MP3::Tag 0.40 だと ID3v2.pm に以下の Encoding=0 を強制するコードがあって encoding=1 を受け入れてくれない。まったく余計なことしてくれる。
MP3/Tag/ID3v2.pm
450 if ($fs->{name} eq "_encoding") {
451 $encoding = shift @data unless $defenc;
452 warn "Encoding of text not supported yet\n" if $encoding;
453 $encoding = 0; # other values are not used yet, so let's not
write them in a tag
454 $datastring .= chr($encoding);
455 next;
456 }
仕方ないので 453 行目をコメントアウトしてしまい、とりあえず目的は達成できるようになった。だるー。さっさとソースや仕様にあたれってことですかね...
登録:
投稿 (Atom)