月曜日 6 23, 2008

以前ブログで公開するといってすっかり忘れていた、Ruby on Rails with DTrace デモ の構築方法をアップします。

RubyにDTrace Patchを当てる方法は、すでに高井さんがプレゼンにしていたり、Ruby DTraceのProbeの概要は、舞波さんがブログにしていたりいるのでそちらを参照してください。

私の方では、DTraceの結果をGUI化するツールChimeのインストール方法や設定方法を書きます。

chimeのインストールは非常に簡単です。

以下のURLからpackageをダウンロードして、pkgaddしてください。

http://opensolaris.org/os/project/dtrace-chime/install/

pkgaddすると、/opt/OSOL0chimeにchimeがインストールされますので

# /opt/OSOL0chim/bin/chime

で、chimeを起動できます。

以下のURLにRuby on Rails用の設定ファイルをアップロードしました。

/opt/OSOL0chime/displarysにコピーすると、chimeから使用できるようになります。

Chime上で 右クリックをすると、Source Fileごとなどに絞って監視ができるようになっています。

自分でカスタマイズしてみたい人は、以下のブログ記事が参考になりますので、是非挑戦してみてください!

http://blogs.sun.com/tomee/entry/chime_and_the_dtracetoolkit

http://blogs.sun.com/tomee/entry/chime_and_the_dtracetoolkit_part



土曜日 6 21, 2008

OpenSolaris 2008.05がリリースされていますが、みなさんお使いでしょうか?

OpenSolarisは、rpmのようなIPSを使ってPackage管理がされているのですが、システム全体のUpdateも一気に行えちゃいます。

OpenSolarisをHDDにインストールされた方は、ネットワークに繋がっている環境で以下のコマンドを入力してみてください。

(root権限で実行してくださいね。)

# pkg image-update

image-updateは、かなりの数のPackageをダウンロードしてくるので、時間がかかります。

軽く放置して終わるのを待ってください。

pkg image-updateが終わった後、以下のコマンドでActive on reboot imageを確認し、grubのConfigを更新してください。

# beadm list

BE            Active Active on Mountpoint     Space
Name                 reboot                   Used
----          ------ --------- ----------     -----
opensolaris-1 no     yes       -              17.06M
opensolaris   yes    no        -              33.92M
# pfexec mount -F zfs rpool/ROOT/opensolaris-1 /mn

# pfexec /mnt/boot/solaris/bin/update_grub -R /mnt

# reboot

これで、最新のOpenSolaris環境を試せますので、ぜひぜひトライしてみてください!

金曜日 12 28, 2007

Ruby 1.9.0がSolaris上でコンパイルできたとのことなので、カッとなってJRubyとの性能比較をしてみました。

ベンチマークに使用したサーバは、X2200M2です。

使用したJRuby, Rubyのバージョンは以下の通りです。


X2200M2# jruby -v
ruby 1.8.5 (2007-12-28 rev 4842) [x86-jruby1.1b1]
X2200M2# /usr/local/bin/ruby -v
ruby 1.9.0 (2007-12-25 revision 14709) [i386-solaris2.10]

まずはサンマイクロお得意のフィボナッチ数列の計算

 (3列目の数字が実行に掛かった秒数です。)

 
JRuby 1.1b1

X2200M2# jruby bench_fib_recursive.rb
  1.003000   0.000000   1.003000 (  0.988000)
  0.570000   0.000000   0.570000 (  0.570000)
  0.561000   0.000000   0.561000 (  0.561000)
  0.561000   0.000000   0.561000 (  0.561000)
  0.562000   0.000000   0.562000 (  0.562000)
  0.561000   0.000000   0.561000 (  0.561000)
  0.560000   0.000000   0.560000 (  0.561000)
  0.561000   0.000000   0.561000 (  0.561000)

 

Ruby 1.9.0

X2200M2# /usr/local/bin/ruby bench_fib_recursive.rb
  0.360000   0.000000   0.360000 (  0.360941)
  0.360000   0.000000   0.360000 (  0.362891)
  0.370000   0.000000   0.370000 (  0.368229)
  0.370000   0.000000   0.370000 (  0.370920)
  0.370000   0.000000   0.370000 (  0.367976)
  0.370000   0.000000   0.370000 (  0.368987)
  0.370000   0.000000   0.370000 (  0.368454)
  0.360000   0.000000   0.360000 (  0.368539)

負けたorz

次に文字列操作です。

 

JRuby 1.1b1

X2200M2# jruby bench_string_ops.rb
Measure string array sort time
  7.108000   0.000000   7.108000 (  7.095000)
  5.730000   0.000000   5.730000 (  5.730000)
  5.784000   0.000000   5.784000 (  5.784000)
  5.726000   0.000000   5.726000 (  5.726000)
  5.728000   0.000000   5.728000 (  5.728000)
Measure hash put time
  0.358000   0.000000   0.358000 (  0.358000)
  0.219000   0.000000   0.219000 (  0.219000)
  0.233000   0.000000   0.233000 (  0.233000)
  0.224000   0.000000   0.224000 (  0.224000)
  0.223000   0.000000   0.223000 (  0.223000)
Measure hash get time (note: not same scale as put test)
  0.804000   0.000000   0.804000 (  0.804000)
  0.768000   0.000000   0.768000 (  0.768000)
  0.770000   0.000000   0.770000 (  0.770000)
  0.764000   0.000000   0.764000 (  0.764000)
  0.761000   0.000000   0.761000 (  0.761000)
Measure string == comparison time
  0.748000   0.000000   0.748000 (  0.748000)
  0.676000   0.000000   0.676000 (  0.676000)
  0.668000   0.000000   0.668000 (  0.668000)
  0.688000   0.000000   0.688000 (  0.687000)
  0.681000   0.000000   0.681000 (  0.681000)
Measure string == comparison time, different last pos
  0.868000   0.000000   0.868000 (  0.868000)
  0.818000   0.000000   0.818000 (  0.818000)
  0.824000   0.000000   0.824000 (  0.824000)
  0.835000   0.000000   0.835000 (  0.835000)
  0.833000   0.000000   0.833000 (  0.833000)
Measure string <=> comparison time
  0.971000   0.000000   0.971000 (  0.971000)
  0.918000   0.000000   0.918000 (  0.918000)
  0.916000   0.000000   0.916000 (  0.916000)
  0.957000   0.000000   0.957000 (  0.957000)
  0.910000   0.000000   0.910000 (  0.910000)
Measure 'string'.index(fixnum) time
  1.153000   0.000000   1.153000 (  1.153000)
  1.059000   0.000000   1.059000 (  1.059000)
  1.055000   0.000000   1.055000 (  1.056000)
  1.055000   0.000000   1.055000 (  1.055000)
  1.056000   0.000000   1.056000 (  1.057000)
Measure 'string'.index(str) time
  1.435000   0.000000   1.435000 (  1.435000)
  1.351000   0.000000   1.351000 (  1.351000)
  1.355000   0.000000   1.355000 (  1.355000)
  1.352000   0.000000   1.352000 (  1.352000)
  1.353000   0.000000   1.353000 (  1.353000)
Measure 'string'.rindex(fixnum) time
  0.831000   0.000000   0.831000 (  0.830000)
  0.755000   0.000000   0.755000 (  0.756000)
  0.752000   0.000000   0.752000 (  0.752000)
  0.755000   0.000000   0.755000 (  0.755000)
  0.756000   0.000000   0.756000 (  0.755000)
Measure 'string'.rindex(str) time
  1.617000   0.000000   1.617000 (  1.617000)
  1.570000   0.000000   1.570000 (  1.570000)
  1.571000   0.000000   1.571000 (  1.571000)
  1.567000   0.000000   1.567000 (  1.568000)
  1.572000   0.000000   1.572000 (  1.572000)

 

Ruby 1.9.0

X2200M2# /usr/local/bin/ruby bench_string_ops.rb
Measure string array sort time
  6.700000   0.020000   6.720000 (  6.710143)
  6.710000   0.000000   6.710000 (  6.714079)
  6.710000   0.000000   6.710000 (  6.709830)
  6.700000   0.000000   6.700000 (  6.698251)
  6.710000   0.000000   6.710000 (  6.705201)
Measure hash put time
  0.470000   0.010000   0.480000 (  0.479858)
  0.460000   0.000000   0.460000 (  0.460684)
  0.520000   0.000000   0.520000 (  0.518897)
  0.480000   0.000000   0.480000 (  0.473332)
  0.520000   0.000000   0.520000 (  0.523691)
Measure hash get time (note: not same scale as put test)
  1.190000   0.000000   1.190000 (  1.189463)
  1.270000   0.000000   1.270000 (  1.270908)
  1.230000   0.000000   1.230000 (  1.224017)
  1.260000   0.000000   1.260000 (  1.261356)
  1.270000   0.000000   1.270000 (  1.269975)
Measure string == comparison time
  1.540000   0.000000   1.540000 (  1.545910)
  1.550000   0.000000   1.550000 (  1.545590)
  1.540000   0.000000   1.540000 (  1.545325)
  1.560000   0.000000   1.560000 (  1.558849)
  1.550000   0.000000   1.550000 (  1.543557)
Measure string == comparison time, different last pos
  1.540000   0.000000   1.540000 (  1.539490)
  1.520000   0.000000   1.520000 (  1.526482)
  1.530000   0.000000   1.530000 (  1.525341)
  1.520000   0.010000   1.530000 (  1.525925)
  1.540000   0.000000   1.540000 (  1.531647)
Measure string <=> comparison time
  1.580000   0.000000   1.580000 (  1.582389)
  1.570000   0.000000   1.570000 (  1.576323)
  1.580000   0.000000   1.580000 (  1.575421)
  1.580000   0.000000   1.580000 (  1.576632)
  1.570000   0.000000   1.570000 (  1.575474)
Measure 'string'.index(fixnum) time
bench_string_ops.rb:219:in `index': type mismatch: Fixnum given (TypeError)
        from bench_string_ops.rb:219:in `block (4 levels) in bench_string_index_char'
        from bench_string_ops.rb:217:in `upto'
        from bench_string_ops.rb:217:in `block (3 levels) in bench_string_index_char'
        from bench_string_ops.rb:216:in `times'
        from bench_string_ops.rb:216:in `block (2 levels) in bench_string_index_char'
        from /usr/local/lib/ruby/1.9.0/benchmark.rb:293:in `measure'
        from bench_string_ops.rb:214:in `block in bench_string_index_char'
        from bench_string_ops.rb:213:in `times'
        from bench_string_ops.rb:213:in `bench_string_index_char'
        from bench_string_ops.rb:336:in `run'
        from bench_string_ops.rb:344:in `<main>'


あらら、途中でRuby 1.9.0は止まっちゃいました。

非互換に引っかかったのかもしれません。

実行できてる部分を見ると、JRubyの方がちょっと早いみたいですねw

ちなみに、JRubyはYARV互換もあるので、スクリプトが1.8系でも1.9系でも動きますよん。

火曜日 9 18, 2007

先日、MySQL Users Conference Japan 2007 で行ったデモを公開します。
 

このデモでは、Ruby on Railsの動作をDTraceを使って追跡し、RubyのFunctionの呼び出し回数や実行時間、平均実行時間、CPU利用時間、CPU平均利用時間をリアルタイムでグラフィカルに確認することができます。

例えば、Ruby on Railsで作成されたWebアプリにアクセスがあったときに、どのソースコードのFunctionが何回呼び出され、実行に何秒掛かったなど、今までのデバックでは解析が難しかった情報を、簡単にリアルタイムで解析できます。

しかも、既存のソースコードに全く変更を加えず、オーバーヘッドもほとんど無くです!

 

 

[もっと読む]

木曜日 9 13, 2007

先日、MySQL Users Conference Japan 2007で、[MySQL 超高速化 Know How」というセッションを行いました。

その際使用した資料です。

Solarisを使ってMySQLなどをチューニングする際の参考になれば幸いです。

MySQL 超高速化 Know How(OpenOffice)

MySQL 超高速化 Know How(PDF) 

後日、セッションの際にご紹介したDtraceのデモも公開したいと思います。

こちらに興味のある方、もうしばらくお時間ください。<(_ _)>

月曜日 8 13, 2007

Web2.0では、大量に安価なサーバを使用して、水平分散しているシステムが多く見られます。

これは、かの有名なGoogleが採用しているアーキテクチャで、便宜上Googleモデルと呼ぶことにします。

 

このGoogleモデルは、システム立ち上げ時には、安価なサーバ数台で構成し、サービスが伸びてきたら拡張するというインフラの構築シナリオになっています。

そのため、サービス立ち上げ時には投資を最小化でき、経営的にはリスクの非常に低いモデルになっています。

特にベンチャー企業では、少ない資金でスタートでき、非常にメリットがあるように思えます。

 
しかしながら、サービスが順調に軌道に乗っていくとどうなるでしょう?

 

ユーザー数の増加にともない、サービスのレスポンスを維持するために、どんどんサーバを増設しなければなりません。

サービス立ち上げ時には数台だったサーバも、あっという間に100台近くに増えてしまいます。

こうなると、サーバを増やしても性能は上がりにくくなり、サーバの故障台数も増え、管理の手間ばかり増えてきます。

しかも、データセンターのラックはどんどん増え、ラック費用、電気代などのサービス維持費用が問題になってきます。

いまさらシステムの効率を改善するために、アプリの大きな変更などはできません。

 

それでもサービスのレスポンスを維持するために、サーバを増設しなければなりません。。。


実はこのモデル、サービスが伸びていくと体力(人、物、金)勝負になるという厳しいモデルなのです。

 

私が担当しているWeb2.0系のお客様達は、みなさんサーバの台数が増えすぎて困っています。

サーバの購入費用は十分安いけど、運用管理費用が逆に大きな負担になっています。

みなさんGoogleモデルのシステムをお持ちです。

 

ここで、Googleモデルのシステムに対して、私からの提案です。

「これからは、サーバの台数を減らすことに注力しませんか?」

そのためには、どんなことを考え、なにをすべきなのか。


まあ、サーバベンダーの言う事じゃ無いかもしれませんがw

金曜日 8 10, 2007

 

2年ぐらい更新してなかったようですね。。。

 

前年度はT1プロセッサ搭載サーバの担当をしていて、Web2.0系企業にT1プロセッサやSolarisのプロモーションを行っていました。

本年度は、前年度の実績(?)を買われ、Web2.0系企業の担当になりました。

 

せっかくWeb2.0系企業の担当になったので、このBlogではWeb2.0系システムをSolarisに移行してバンバン言わせるノウハウを公開しちゃおうと思います。

Web2.0システムのボトルネック解析、チューニング、インフラによる性能向上のノウハウなどを中心に解説していこうと思います。
 

火曜日 8 02, 2005

先日、Solaris Security Toolkit Version 4.2がリリースされました。

大きな変更点は、Version 4.2からSolaris 10をサポートするようになり、いくつかのスクリプトが追加になったという点です。


Solaris Security ToolkitのSolaris 10サポートによって、いままで手動で設定しなければならなかった、Solaris 10のセキュリティー強化部分も、より簡単に設定できるようになりました。

みなさんも是非この機会に、Solaris Security Toolkitを導入して、SolarisをSecureな環境にしてみてください。


参考リンク Solaris Security Toolkit Version 4.2 Solaris Security Toolkit Document

月曜日 8 01, 2005

OpenSolarisのDTrace Communityでは、DTraceスクリプトをまとめたものを、DTrace Toolkitとして公開しています。

(先日、DTrace Toolkitのバージョンがあがり、スクリプトが増えました。)

今回は、DTrace Toolkitの紹介をしてみたいと思います。
DTrace Toolkit DTrace Toolkitは、サン・マイクロシステムズが作成した、DTraceのスクリプトを、機能別に分類してまとめたものです。

(なかにはまだ分類されていないスクリプトもいくつかあります。)

 

配布形態はフリーウェアとなっており、最新のバージョン0.82では、82個のスクリプトが入っています。

また、スクリプト以外にも、ドキュメントやスクリプトを作成する際のテンプレート等も入っています。

DTraceToolkit

* dappprof : profile user and lib function usage

* dapptrace : trace user and lib function usage

* dexplorer : run a series of scripts and archive output

* dtruss : process syscall info. DTrace truss

* dvmstat : vmstat by PID/name/command

* errinfo : report syscall failures with details

* execsnoop : snoop process execution as it occurs

* iosnoop : snoop I/O events as they occur

* iotop : display top disk I/O events by process

* opensnoop : snoop file opens as they occur

* procsystime : analyse process system call times

* rwsnoop : snoop read/write events

* rwtop : display top read/write bytes by process

 

Cpu/

* cputypes.d : list CPU types

* dispqlen.d : dispatcher queue length by CPU

* intbycpu.d : interrupts by CPU

* intoncpu.d : interrput on-cpu usage

* inttimes.d : interrput on-cpu time total

* loads.d : print load averages

 

Disk/

* bitesize.d : print disk event size report

* diskhits : disk access by file offset

* hotspot.d : print disk event by location

* iofile.d : I/O wait time by filename and process

* iopattern : print disk I/O pattern

* pathopens.d : pathnames successfully opened count

* seeksize.d : print disk seek size report

 

Docs/

* oneliners.txt : DTrace oneliners

 

Extra/

* guess.d : guessing game

 

Kernel/

* cputimes : print time by Kernel/Idle/Process

* cpudists : time distribution by Kernel/Idle/Process

* cswstat.d : context switch time statistics

* dnlcps.d : DNLC stats by process

* dnlcsnoop.d : snoop DNLC activity

* dnlcstat : DNLC statistics * pridist.d : process priority distribution

 

Locks/

* lockbyproc.d : lock time by process name

* lockbydist.d : lock time distribution by process name

 

Mem/

* anonpgpid.d : anonymous memory paging info by PID on CPU

* minfbypid.d : minor faults by PID

* minfbyproc.d : minor faults by process name

* pgpginbypid.d : pages paged in by PID

* pgpginbyproc.d : pages paged in by process name

* swapinfo.d : print virtual memory info

* vmbypid.d : virtual memory stats by PID

* vmstat.d : vmstat demo using DTrace

* vmstat-p.d : vmstat -p demo using DTrace

* xvmstat : extended vmstat demo using DTrace

 

Net/

* connections : print inbound TCP connections by process

* icmpstat.d : print ICMP statistics

* tcpsnoop : snoop TCP network packets by process

* tcpsnoop.d : snoop TCP network packets by process

* tcpstat.d : print TCP statistics

* tcptop : display top TCP network packets by process

* tcpwdist.d : simple TCP write distribution by process

* udpstat.d : print UDP statistics

 

Proc/

* crap.d : crashed application report

* creatbyproc.d : snoop file creat() by process name

* fddist : file descriptor usage distribution

* fileproc.d : snoop files opened by process

* kill.d : snoop process signals

* lastwords : print syscalls before exit

* newproc.d : snoop new processes

* pidpersec.d : print new PIDs per sec

* readbytes.d : read bytes by process name

* readdist.d : read distribution by process name

* rwbbypid.d : read/write bytes by PID

* rwbypid.d : read/write calls by PID

* sampleproc : sample processes on the CPUs

* shortlived.d : check short lived process time

* sigdist.d : signal distribution by process name

* sysbypid.d : system stats by PID

* syscallbyproc.d : system calls by process name

* syscallbypid.d : system calls by process ID

* threaded.d : sample multi-threaded CPU usage

* topsysproc : display top syscalls by process name

* writebytes.d : write bytes by process name

* writedist.d : write distribution by process name

 

System/

* sar-c.d : sar -c demo using DTrace

* syscallbysysc.d : system calls by system call

* topsyscall : display top system call type

* uname-a.d : uname -a demo using DTrace

 

User/

* setuids.d : snoop setuid calls

 

Zones/

* zvmstat : vmstat info by zone

 

興味があるスクリプトがありましたら、是非試してみてください。

また、ご自分でスクリプトを作成する際には、DTrace Toolkitに入っているテンプレートを使ってみてください。

 

参考リンク OpenSolaris DTrace Community

水曜日 7 27, 2005

opensolaris.orgでは、いろいろなCommunityがあり、盛んに情報交換が行われています。

dtrace-communityではdtraceの技術情報や便利なスクリプト、ツール等が紹介されています。

今回は、その中からいくつかのスクリプトを紹介してみたいと思います。

 

iosnoop iosnoopは、diskのI/Oを動的に監視するスクリプトです。

Solarisに標準で提供されているiostatとは違い、どのプロセスからI/Oが発生しているのかをリアルタイムで追跡する事ができます。

スクリプトの起動時にオプションを与えることによって、タイムスタンプやI/Oの発生しているディスクを表示することができます。 このスクリプトを使って、1日のDisk I/Oの推移や、I/Oを頻繁に発生させてシステムに負荷をかけているプロセスの発見などに使用できそうです。

iosnoopの実行例:http://users.tpg.com.au/adsln4yb/DTrace/iosnoop_example.html

 

shellsnoop.d shellsnoop.dは、システム上で動作しているshellでどのようなコマンドが実行されて、どのような出力がでているのかをリアルタイムで監視するスクリプトです。

オプションをつけることによって、タイムスタンプや特定のユーザが使用しているshellの状態を表示することができます。

このスクリプトを使って、特定ユーザーの操作履歴を取得したりできそうです。
 

shellsnoop.dの実行例:http://users.tpg.com.au/adsln4yb/DTrace/shellsnoop_example.txt

 

connections connectionsは、生成されたTCPコネクションをリアルタイムに表示するスクリプトです。

Solarisに標準で提供されているsnoopとは違い、システム上でどのようなTCPコネクションが生成されているのかをリアルタイムで表示することができます。

(snoopだと情報が詳細すぎて、追いきれない場合があります)

このスクリプトを使って、不正なTCPコネクションを監視したり、アクセス履歴を作成したりできそうです。
 

connectionsの実行例:http://users.tpg.com.au/adsln4yb/DTrace/connections_example.txt

 

このように、DTraceを使うと、システムのいろいろな情報をリアルタイムに収集することができます。

みなさんもこれらのスクリプトを参考にして、いろいろ試してみてください。

また、有用なツールが作成できたら、ぜひこのCommunityに公開して全世界の人に自慢してください!


参考リンク OpenSolaris DTrace community Solaris 動的トレース(DTrace)ガイド

月曜日 7 25, 2005


みなさん、こんにちは。 サン・マイクロシステムズの河原です。 データセンタ・ソリューション本部で、Solaris 10のサービスを担当しています。 仕事では、SolarisコンテナやDTraceのサービスやソリューション開発、提案支援等をしています。 このBlogでは、仕事で得られた情報を元に、Solaris 10の使い方や活用例、Tips等の紹介をしていきたいと思います。

This blog copyright 2008 by kawaiti