Browse Month: January 2009

Seagate

サポートに連絡しても、次のようなそっけない返事が来るだけ。

Seagate のハードディスクを四本買ってしまったけれど、ファームウェアのアップデート待ちで早く本番に投入したい。

Dear Seagate Nearline Customer,

This email is in response to a request that you placed with Seagate
Support.   We are informing you that a firmware update is available for
affected Barracuda ES.2 SATA products.  Please click here
http://seagate.custkb.com/seagate/crm/selfservice/search.jsp?DocId=207963
(or paste this URL into your web browser) to go to Seagate’s Knowledge Base
site to determine if it is necessary to upgrade to the new firmware.

Thank You.
Seagate Customer Support

今のファームウェアは SN05 なので、SN06 が公開されるのを待っている。

President Barack Obama Inauguration

今月の大きなニュースといえばオバマ大統領の就任ですが、これは英語の勉強に最適と思って字幕つきの映像を探してみた。

まずは、就任演説の内容が分からないといけないので、日本語のものはニコニコにあった。

【ニコニコ動画】オバマ大統領就任演説

そして、英語字幕のはなかなかいいのがなったけれど、YouTube にあった。すこし単語の順序が違うところがあるけれど、素晴らしい字幕つき。YouTube にも字幕機能があったとは。。。

公式な字幕なしの映像と文書は、The White House Blog にある。世間的には、かなり新大統領の就任演説は評判がいいけれど、確かにそうだなと思った。HD でみると、さすがにきれいですね。

なんで、YouTube はこんなに早いのだろうか、さすがは Google という感じか。YouTube のインフラを見てみたいものだ。

Flickr Blog でも、こんな写真が紹介されていた。すごいなぁ。

Obama Inauguration

SSL の自己認証局証明書をさくっと作れるスクリプト

Apache の RPM から抜粋。1年だとよくきれるので、10年にしてみた。

#!/bin/sh

if [ ! -f /etc/httpd/conf/ssl.key/server.key ] ; then
openssl genrsa -rand /proc/apm:/proc/cpuinfo:/proc/dma:/proc/filesystems:/proc/interrupts:
/proc/ioports:/proc/pci:/proc/rtc:/proc/uptime 1024 > /etc/httpd/conf/ssl.key/server.key 2
> /dev/null
fi

FQDN=”s1.example.co.jp”
if [ “x${FQDN}” = “x” ]; then
FQDN=localhost.localdomain
fi

if [ ! -f /etc/httpd/conf/ssl.crt/server.crt ] ; then
cat << EOF | openssl req -new -key /etc/httpd/conf/ssl.key/server.key -x509 -days 3650 -ou
t /etc/httpd/conf/ssl.crt/server.crt 2>/dev/null

SomeState
SomeCity
SomeOrganization
SomeOrganizationalUnit
${FQDN}
root@${FQDN}
EOF
fi

Passenger で Apache のエラーログに余計な情報を出力しない方法

今日も、個人的に最近ホットな Passenger ネタ。

Passenger で Merb アプリケーションを動かしていると、Apache の ErrorLog に、次の初期化メッセージが表示される。

Loading init file from ./config/init.rb
Loading Rails plugins from plugins/
Loading ./config/environments/production.rb
Logging to file at ./log/production.log

この初期化メッセージは、Rails/Rack アプリケーション(今回は merb)が起動されるたびに表示されて、うざすぎるのでなんとかしたいので調査してみた。

調査したところ、stdout に出力しているメッセージは、そのまま ErrorLog へ出力されてしまうらしい。Passenger 側のソースコードを読んでみたけれど、なんとかできそうもなかったので merb の bootloader.rb を次のように変更した。

— /opt/ruby-enterprise-1.8.6-20090113/lib/ruby/gems/1.8/gems/merb-core-1.0.8.1/lib/merb-core/bootloader.rb-org 2009-01-26 16:58:43.000000000 +0900
+++ /opt/ruby-enterprise-1.8.6-20090113/lib/ruby/gems/1.8/gems/merb-core-1.0.8.1/lib/merb-core/bootloader.rb 2009-01-26 18:18:05.000000000 +0900
@@ -433,7 +433,7 @@
# If log file is given, use it and not log stream we have.
if Merb::Config[:log_file]
raise “log file should be a string, got: #{Merb::Config[:log_file].inspect}” unless Merb::Config[:log_file].is_a?(String)
– STDOUT.puts “Logging to file at #{Merb::Config[:log_file]}” unless Merb.testing?
+ #STDOUT.puts “Logging to file at #{Merb::Config[:log_file]}” unless Merb.testing?
Merb::Config[:log_stream] = File.open(Merb::Config[:log_file], “a”)
# but if it’s not given, fallback to log stream or stdout
else
@@ -487,7 +487,7 @@
# :api: private
def self.load_env_config
if env_config?
– STDOUT.puts “Loading #{env_config}” unless Merb.testing?
+ #STDOUT.puts “Loading #{env_config}” unless Merb.testing?
load(env_config)
end
nil
@@ -516,7 +516,7 @@
# :api: private
def self.load_initfile
if File.exists?(initfile)
– STDOUT.puts “Loading init file from #{initfile}” unless Merb.testing?
+ #STDOUT.puts “Loading init file from #{initfile}” unless Merb.testing?
load(initfile)
elsif !Merb.testing?
Merb.fatal! “You are not in a Merb application, or you are in ” \

それと、merb アプリケーションの init.rb も、次のように変更した。

— merb/config/init.rb-org (revision 1471)
+++ merb/config/init.rb (working copy)
@@ -54,7 +54,7 @@

# make sure we’re running inside Merb
if defined?(Merb::Plugins)
– puts “Loading Rails plugins from plugins/”
+ #puts “Loading Rails plugins from plugins/”
Dir[“#{Merb.root}/plugins/*”].each do |dir|
plugin_init = dir / ‘init.rb’
plugin_lib = dir / ‘lib

さらに merb アプリケーションのログも ErrorLog で出力されてしまうので、production.rb を次のように変更した。

info にするとアクセスログが表示されてしまうので、error レベルにした。

— merb/config/environments/production.rb (revision 1471)
+++ merb/config/environments/production.rb (working copy)
@@ -2,6 +2,8 @@
Merb::Config.use { |c|
c[:exception_details] = false
c[:reload_classes] = false
+ c[:log_file ] = “./log/#{ENV[‘RACK_ENV’]}.log”
+ c[:log_level] = :error
}

merb の bootloader.rb の方は、出力されないようなオプションを追加できないか提案してみようかな。うーむ、難しいところだ。。。

あと、merb アプリケーションを再起動するとき、httpd graceful するのではなくて tmp/restart.txt ファイルを作ると再起動する仕組みがあるとは知らなかった。

詳しくは、Developying with Passenger [Merb Wiki] を参照のこと。

Passenger のリソース最適化オプション

Passenger を使うとき、リソース最適化オプションによって大きくパフォーマンスが変わる。英文だと理解できるのが遅いので、勝手に翻訳してみる。

– PassengerMaxPoolSize <整数値>

同時に使用できる ROR あるいは Rack アプリケーションの最大数です。より大きな値を指定すると多くのメモリを消費しますが、HTTP クライアントが同時に処理できる能力を増やすことができます。

この最適な値は、あなたのシステムハードウェアやサーバの平均値ロードに依存します。異なる値を指定して実験する必要があるでしょう。しかし一般的にはこの値は少なくてもあなたのシステムの CPU 数に等しい値にするべきです。もしあなたのシステムが 2G のメモリ容量なら 30 を指定することをおすすめします。もしあなたのシステムが VPS 、256MB のメモリ容量で、MySQL のようなサービスが動作しているのなら 2 を指定することおすすめします。

もしあなたのシステムで Rails/Rack ウェブサイトのロードを処理できない(使用できるメモリ容量を上回っている)のならより小さい値を指定するべきです。(もしあなたのサイトが人気があるようなら、ハードウェアを増強したりサーバを増設することを考えるべきです。)

ポイント) Ruby Enterprise Edition を使用することを強くおすすめします。これはあなたの Ruby on Rails アプリケーションのメモリ使用容量を約 33% くらい減らすことができます。 

– PassengerMaxInstancesPerPapp <整数値>

一つのアプリケーションに同時に使用できるアプリケーションインスタンス数の最大数です。これは一つのアプリケーションがアプリケーションプールにあるすべての有効なスロットを占有させない助けとなるでしょう。

この値は PassengerMaxPoolSize 以下でなければなりません。値が 0 のときは一つのアプリケーションインタンス数を置き換えるのを無制限にします。この値は PassengerMaxPoolSize が設定されているときのみ効果があります。

– PassengerPoolIdleTime  <整数値>

アイドル状態のアプリケーションインスタンスが存在している最大秒数です。これはもしアプリケーションインスタンスが指定秒数にトラフィックを受け取らなければ、メモリを維持するために終了します。

この値を減らすとアプリケーションはスワップを多く繰り返すことになります。スワッピングしてからは相対的に操作が遅くなりますし、訪問者たちはあなたの Rails/Rack ウェブサイトを訪れたとき小さな遅延に気を遣うかもしれません。しかしながら、アプリケーションをより高速に使われるためにリソースを解放しましょう。

最適な値は、訪問者が単一の Rails/Rack ウェブページに費す平均値秒数です。我々は 2 * x の値をおすすめします、x は訪問者が単一の Rails/Rack ウェブページに費す平均秒数です。しかしあなたの効果は変わるかもしれません。

このオプションはグローバルサーバ設定の中で一つしか指定できません。デフォルト値は 300 です。

 

ということで、CentOS 5.2 x86_64、Xeon 4 Core、5GB RAM、Apache HTTPD Server 2.2.10 worker MPM、Passenger 2.0.6、Ruby Enterprise Edition 20090113、MySQL 同居の環境で、ab でベンチマークしながら試行錯誤した結果、次のような値で本番投入してみることにした。

PassengerMaxPoolSize         60

PassengerMaxInstancesPerApp  0

PassengerPoolIdleTime        1800

 

passenger に感謝の気持ちを込めて、Enterprise ライセンスを $30 で購入してみた。購入したら、NAOYA NAKAZAWA という名前がページに出ていてちょっと感動です。

August 19, 2008 Naoya Nakazawa USD 30

Enterprise Edition のキーを passenger-make-enterprisey コマンドで入力すると Passenger が Enterprise ライセンスになります。違いはというと、ヘッダが次のようになるだけです。

HTTP/1.1 200 OK
Date: Wed, 28 Jan 2009 15:00:15 GMT
Server: Apache
X-Powered-By: Phusion Passenger (mod_rails/mod_rack) 2.0.6, Enterprise Edition
Content-Length: 459
Connection: close
Content-Type: text/html; charset=utf-8

Designing Web Interfaces

洋書になるけれど、オライリーから「Designing Web Interfaces」という書籍が発売されました。同時に公式ホームページもあって、公式ホームページをみるとなかなか面白そうです。公式ホームページトップの紹介は、次のとおりとなっています。

This book is not directly about information architecture—although you will find information architecture principles alluded to throughout. This book is also not directly about visual design—although you will find that the backdrop of good visual design is assumed throughout. This book is about interaction design: specifically, interaction design on the Web. And even more specifically, about rich interaction design on the Web.

Six simple design principles underpin 70+ patterns and best practices for creating rich internet applications.

  1. Make it Direct
  2. Keep It Lightweight
  3. Stay on the Page
  4. Provide an Invitation
  5. Use Transitions
  6. React Immediately

思いきって翻訳してみると、次のとおりです。

この本は情報アーキテクチャーそのものの本ではなく、完全にそれとなくふれるように情報アーキテクチャーの指標を見つけることができる本です(意味がよく分からない。。。)。この本は、またビジュアルデザインそのものの本ではなく、よいビジュアルデザインの背景を完全に考察した結果が分かる本です。この本は、対話的なデザインについて本であり、特にウェブ上での対話デザインについての本である。そしてさらに特別にウェブ上のリッチな対話デザインについても書かれています。

リッチなインターネットアプリケーションを作るための70以上のパターンを根拠にした6つのデザイン原則があります。

1. より直感的に

2. よりページを軽く

3. ページに留める

4. 招待を提供する

5. 変化を使う

6. すぐに反応する

著者は、Netflix のエンジニア Bill Scot 氏とデザイナーの Theresa Neil 氏です。Bill Scot 氏といえば、CS193H で紹介した High Performacne Web Pages – Real World Examples: Netflix Case Study の講演者でした。Bill Scot 氏のブログは、Looks Good Workds Well です。Theresa Neil 氏のブログは、Theresaneil’s Weblog です。Theresa Neil 氏のブログには、iPhone のインターフェースのエントリもあって、とても興味深いです。

ブログには、検索結果などのよくあるデザインが詳しく解説されています。ページ数は、339 ページとなっています。

また、Flickr にも関連しているデザイン画が公開されています。

最近、洋書の技術書ばかりになっていて読むのが大変だけれど、ウェブインターフェースデザインというもっとも苦手な分野の本ですが、そのあたりのスキルも身につけたいので購入してみようと思います。おそらく、近いうちに日本語版に翻訳されそうな本ですが。

サーバ向けのハードディスクの選択肢

Seagete のサーバ向けのハードディスクであった「Barracuda ES.2 ST31000340NS」は、見事に地雷だったということで、他のメーカーのサーバ向けのハードディスクを調査してみた。

まず、Western Digital。Western Digital には、エンタープライズ向けとして WD RE2、WD RE3、というモデルがあります。それぞれの違いは、次のとおり。

  • WD RE2: SATA、設定容量は 750GB / 500GB / 400GB / 320GB / 160GB、120万時間 MTBF、32MB キャッシュ、7200 回転、価格は不明(扱っている店が少ない)
  • WD RE3: SATA、設定容量は 750GB / 1TB、120万時間 MTBF、16 MB キャッシュ、7200 回転、WD RE2 と比べて 20% 信頼性が高い、価格は 1TB で ¥20,000 ほど

次に、HGST。HGST には、エンタープライズ向けとして日立 Ultrastar シリーズがある。SATA モデルとしては、Ultrastar A7K1000 がある。

  • 設定容量は 1TB / 750GB / 500GB、7200 回転、価格は 1TB モデルの HUA721010KLA330 で ¥17,000 程度

今回は、Western Digital、HGST、どちらに迷ったけれど価格の面で HGST を選択した。 

あとは、id:hirose31 さんのブログにある BBU を搭載したハードウェア RAID カードを導入することも検討中。

 

ちなみに、Seagate に対象のドライブ情報をメールで送ったが2日たった今も何の返事もない。価格.com からも価格表が消えていますね。

Seagate のファームウェアはしばらく公開されない様子です。

ハードディスクの情報を調べる方法

例の Seagate 問題で見事に地雷を踏んでしまったのですが、ハードディスクの情報を調べる方法をメモしておきます。

まず、CentOS 5.2 から、ハードディスクのベンダーやファームウェアのバージョンを調べるには、次のコマンドを実行します。

$ cat /proc/scsi/scsi
Attached devices:
Host: scsi0 Channel: 00 Id: 00 Lun: 00
Vendor: ATA      Model: ST31000340NS     Rev: SN05
Type:   Direct-Access                    ANSI SCSI revision: 05
Host: scsi1 Channel: 00 Id: 00 Lun: 00
Vendor: ATA      Model: ST31000340NS     Rev: SN05
Type:   Direct-Access                    ANSI SCSI revision: 05

見事に ST31000340NS ということが分かりました。さらにシリアル番号を調べるには、次のコマンドを実行します。

$ sudo hdparm -i /dev/sda
/dev/sda:

Model=ST31000340NS                            , FwRev=SN05    , SerialNo=            <シリアル番号>
Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs RotSpdTol>.5% }
RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=4
BuffType=unknown, BuffSize=0kB, MaxMultSect=16, MultSect=?8?
CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=268435455
IORDY=on/off, tPIO={min:120,w/IORDY:120}, tDMA={min:120,rec:120}
PIO modes:  pio0 pio1 pio2 pio3 pio4
DMA modes:  mdma0 mdma1 mdma2
UDMA modes: udma0 udma1 udma2
AdvancedPM=no WriteCache=enabled
Drive conforms to: unknown:  ATA/ATAPI-4 ATA/ATAPI-5 ATA/ATAPI-6 ATA/ATAPI-7

* signifies the current active mode

という具合に分かります。

次に FreeBSD の場合は、まずハードディスクのデバイス名を調べます。

$ sudo atacontrol list
ATA channel 0:
Master: acd0 <PIONEER DVD-RW DVR-111/1.19> ATA/ATAPI revision 5
Slave:       no device present
ATA channel 1:
Master:      no device present
Slave:       no device present
ATA channel 2:
Master:  ad4 <ST3500320AS/SD15> Serial ATA v1.0
Slave:       no device present
ATA channel 3:
Master:  ad6 <ST3500320AS/SD15> Serial ATA v1.0
Slave:       no device present

このコマンドで ad4 と sd6 のハードディスクが接続されていることが分かります。さらに ad4 のシリアル番号など詳しい情報を取得するには、次のコマンドを実行します。

$ sudo atacontrol cap ad4
Protocol              Serial ATA v1.0
device model          ST3500320AS
serial number         シリアル番号
firmware revision     SD15
cylinders             16383
heads                 16
sectors/track         63
lba supported         268435455 sectors
lba48 supported       976773168 sectors
dma supported
overlap not supported

Feature                      Support  Enable    Value           Vendor
write cache                    yes      yes
read ahead                     yes      yes
Native Command Queuing (NCQ)   yes       –      31/0x1F
Tagged Command Queuing (TCQ)   no       no      31/0x1F
SMART                          yes      yes
microcode download             yes      yes
security                       yes      no
power management               yes      yes
advanced power management      no       no      65278/0xFEFE
automatic acoustic management  no       no      0/0x00  254/0xFE

ということで、これから Seagate に問い合わせてみたいと思います。Seagate 問題については、こちらに詳しくまとまっていますね。

Percona MySQL と OurDelta

データベースサーバを新規に増設するために、最新の MySQL を調査していたところ、現時点での公式な 5.0 系の最新版はなぜかバイナリが公開されていない 5.0.75 ということが分かりましたが、同時に Percona Inc. という会社が独自にパッチをあててビルドしている Percona MySQL というものがあることを知りましたので、実際に試しつつベンチマークをとってみました。

Percona は、MySQL Performance Blog を書いていることで有名です。

まず、Percona MySQL とは、Percona Lab によると次のような説明があります。

Percona builds binaries that contain recent versions of the MySQL database server, plus additional popular patches not included in the official binaries from MySQL/Sun. Some patches improve InnoDB performance under high loads. Others provide diagnostic tools useful to DBAs. The patches are authored by MySQL users like Google http://code.google.com/p/google-mysql-tools, Proven Scaling, Open Query, and Percona itself.

翻訳すると、次のとおりです。

Percona のビルドバイナリは、最近の MySQL データベースサーバにバージョンに加えて MySQL/Sun からの公式ビルドには含まれていない人気のあるパッチを追加したものです。いくつかのパッチは、高負荷の状況下で InnoDB のパフォーマンスを向上するものです。他社などから提供されている DBA のための計測ツールです。これからのパッチは Google、Proven Scaling、Open Query、と Percona 自身のような MySQL ユーザが作成したものです。

今回、新規に構築したいデータベースサーバはすべて InnoDB の構成なので、Percona MySQL を使う選択肢もありかなと考えました。さらに RHEL5 x86_64 用の RPM が公開されているので、すぐに試すことができたのも幸いしていました。

まず、Percona MySQL にはどんなパッチがあたっているかは、wiki にまとまっています。Percona MySQL には、通常版と highperf 版の二つのリリースがあり、詳しい情報はリリース情報にまとめっています。MySQL 5.0.75 をベースにした build 11 は、次のようなパッチが適応されています。

  • innodb_check_defrag.patch by Percona
  • userstatsv2.patch by Google
  • show_patches.patch by Jermey Cole
  • innodb_io_patches.patch by Percona
  • innodb_show_hashed_memory.patch by Percona
  • innodb_io_pattern.patch by Percona
  • microsec_process.patch by Percona
  • innodb_locks_helpd.patch by Percona
  • microslow_innodb.patch by Percona
  • mysqld_safe_syslog.patch by Percona
  • innodb_fsync_source.patch by Google
  • innodb_show_bp.patch by Percona
さらに HighPerf 版では、さらに次の二つのパッチが適応されています。
  • split_buf_pool_mutex_fixed_optimistic_safe.patch by Yasufumi Kinoshita
  • innodb_rw_lock.patch by Yasufumi Kinoshita
それぞれどんなパッチなのかについては、Percona MySQL Patches にまとまっています。
  • innodb_check_defrag(innodb_check_fragmentation):  このパッチは、MySQL サーバにいくつかのセッションスコープのステータス変数を追加します。自分のデータベース接続によって実行された最後のクエリーでスキャンされた InnoDB データのフラグメンテーションを計算できるための変数を使うことができます。これからの変数は、クエリーごとに初期化されるのでデータベース接続しつづけても増え続けることはありません。そのかわりもっとも最近のクエリーしか計測できません。一つのテーブルやインデックスに対する単純なクエリーに役に立ちます。これからはリーフページに対してのみ計測することができます。具体的な例は、wiki に掲載されています。
  • userstatsv2.patch: show user/table/index の状態に INFORMATION_SCHEMA.*_STATISTICS を追加する。
  • show_patches.patch: show patches コマンドを追加する
  • innodb_io_patches.patch: このパッチは、木下さんのパッチを含んでいて、次の設定パラメータを追加します
  • innodb_read_io_threads: 読み込みリクエスト用のバックエンドのスレッド数(デフォルトは1)
  • innodb_write_io_threads: バッファプールからの書き込み用のバックエンドのスレッド数(デフォルトは1)
  • innodb_read_ahread: InnoDB のネイティブ read-ahead を制御するかどうか
  • innodb_io_capacity: サーバが処理できる秒間あたりの i/o の数
  • innodb_adaptive_checkpoint: adaptive checkpointing 機能を追加するかどうか、adaptive checkpointing 機能については wiki に説明されています
  • innodb_show_hashed_memory.patch: このパッチは、show innodb status コマンドの出力の BUFFER POOL AND MEMORY セクションに InnoDB の内部的なハッシュテーブルサイズを表示します
  • innodb_io_pattern.patch: このパッチは、INFORMATION_SCHEMA に新しい innodb_io_pattern テーブルを追加します。このテーブルは、データページごとの入出力数を表示します。
  • microsec_process.patch: このパッチは、PROCESSLIST に新しい TIME_MS という新しいカラムを追加したテーブルを追加します。TIME_MS は TIME と同じで TIME をマイクロ秒単位で表示します。
  • innodb_locks_helpd.patch: このパッチは、InnoDB の状態出力にさらにコンパクトにしてデッドロックが起きても一杯にならずに見つけるのに困難な役に立つ情報となります。innodb_show_locks_held、innodb_show_verbose_locks という変数を追加します。
  • microslow_innodb.patch: 時間のかかったクエリーを記録する slow query log の出力にマイクロ秒単位の情報を追加します。
  • mysqld_safe_syslog.patch: error.log への出力を syslog-ng へのリダイレクトを許可するパッチ
  • innodb_fsync_source.patch: このパッチは、Google からのパッチです。このパッチは、fsync 読み出しによって初期化されたフォームについての情報を表示します。この情報は、SHOW INNODB STATUS の出力で利用可能です。これらは BACKGROUND THREAD セクションにあります。
  • innodb_show_bp.patch: InnoDB のバッファプールの内容を表示するパッチ
show patches コマンドの出力例
$ mysql -u root -e ‘show paches’
File    Name    Version Author  License Comment
innodb_io_patches.patch Cluster of past InnoDB IO patches       1.0     Percona
GPL     This patch contains fixed (control_flush_and_merge_and_read, control_io-threads, adaptive_flush)
innodb_show_bp.patch    show innodb buffer pool content 1.0     Percona <info@percona.com>      GPL
userstatsv2.patch       SHOW USER/TABLE/INDEX statistics        V2      Google
GPL     Added INFORMATION_SCHEMA.*_STATISTICS
mysqld_safe_syslog.patch        Patch allows redirect output of error.log to syslog-ng  1.0     Percona <info@percona.com>      GPL     Ported from Debian
microsec_process.patch  Adds INFOMATION_SCHEMA.PROCESSLIST with TIME_MS column  1.0     Percona <info@percona.com>      GPL
innodb_show_hashed_memory.patch Adds additional information of InnoDB internal hash table memories in SHOW INNODB STATUS        1.0     Percona <info@percona.com>      GPL

さらに HighPerf 版に適応されているパッチは、次のとおりです。

  • split_buf_pool_mutex_fixed_optimistic_safe.patch: InnoDB のバッファプールのスケーラビリティを修正するパッチ。
  • innodb_rw_lock.patch: InnoDB のスケーラビリティで分かっている項目を修正するパッチです。このパッチは、rw_locks の実装したものです。SMP のパフォーマンスを向上させるパッチに似ている。

この二つのパッチは、MySQL ユーザ会の木下さんという方が作成されたようで、Percona にジョインして MySQL Performance Blog にも投稿されています。

さっそく、mysqlbench でベンチマークをとってみました。
ハードウェア環境
  • CPU: Intel(R) Xeon(R) CPU X3210  @ 2.13GHz
  • メモリ 8GB
ソフトウェア環境
  • OS: CentOS 5.2 x86_64
  • 対象の MySQL
  • MySQL 5.0.51b 設定なし
  • MySQL 5.0.51b 設定済み
  • MySQL 5.0.75
  • Percona MySQL 5.0.75 b11
  • Percona MySQL 5.0.75 b11 HighPerf
設定済みとは、MySQL のソースコードに含まれている my-innodb-heavy-4G.cnf を元に InnoDB のパラメータを設定しました。
  • max_connections = 500
  • innodb_additional_mem_pool_size = 32M
  • innodb_buffer_pool_size = 4G
  • innodb_data_file_path = ibdata1:10M:autoextend
  • innodb_file_io_threads = 4
  • innodb_thread_concurrency = 16
  • innodb_flush_log_at_trx_commit = 1
  • innodb_log_buffer_size = 8M
  • innodb_log_file_size = 256M
  • innodb_log_files_in_group = 3
  • innodb_max_dirty_pages_pct = 90
  • innodb_lock_wait_timeout = 120

ベンチマークの方法

  • mysqlbench には、libmyclient_r という MySQL のスレッドセーフなクライアントライブラリが必要なので、念のため MySQL のバージョンを変えるごとにコンパイルする
  • それぞれの MySQL に対して、mysqlbench でテスト用のテーブルを作ってから、負荷のない状態(ロードアベレージ(0.00)でベンチマークを計測する
  • ./mysqlbench -i -U test -P test -E innodb -s 100 testdb
  • ./mysqlbench -U test -P test testdb -c 50 -t 500 testdb
ベンチマーク結果
<MySQL 5.0.51b 設定なし>
transaction type                    . . . : TPC-B (sort of)
scaling factor                      . . . : 100
number of clients                     . . : 50
number of transactions per client         : 500
number of transactions actually processed : 25000/25000
tps (include connections establishing)  . : 244.858755
tps (exclude connections establishing)  . : 244.890391
<MySQL 5.0.51b 設定済み>
transaction type                    . . . : TPC-B (sort of)
scaling factor                      . . . : 100
number of clients                     . . : 50
number of transactions per client         : 500
number of transactions actually processed : 25000/25000
tps (include connections establishing)  . : 5994.555505
tps (exclude connections establishing)  . : 6012.193691
<MySQL 5.0.75 設定済み>
transaction type                    . . . : TPC-B (sort of)
scaling factor                      . . . : 100
number of clients                     . . : 50
number of transactions per client         : 500
number of transactions actually processed : 25000/25000
tps (include connections establishing)  . : 5928.151749
tps (exclude connections establishing)  . : 5947.056920
transaction type                    . . . : TPC-B (sort of)
scaling factor                      . . . : 100
number of clients                     . . : 50
number of transactions per client         : 500
number of transactions actually processed : 25000/25000
tps (include connections establishing)  . : 5913.270301
tps (exclude connections establishing)  . : 5930.991256

<Percona MySQL 5.0.75 b11 設定済み>

transaction type                    . . . : TPC-B (sort of)
scaling factor                      . . . : 100
number of clients                     . . : 50
number of transactions per client         : 500
number of transactions actually processed : 25000/25000
tps (include connections establishing)  . : 6037.890419
tps (exclude connections establishing)  . : 6053.547258

<Percona MySQL 5.0.75 b11 HighPerf 設定済み>

transaction type                    . . . : TPC-B (sort of)
scaling factor                      . . . : 100
number of clients                     . . : 50
number of transactions per client         : 500
number of transactions actually processed : 25000/25000
tps (include connections establishing)  . : 6024.277840
tps (exclude connections establishing)  . : 6041.377637

ベンチマークをとってみた結果、このベンチマークではそれほど変わらないなという印象。いくつか InnoDB の Status が追加されていてモニタリングするには便利だとは思うけれど、長所と短所をまとめてみる。
長所:
  • 木下さんのエントリをみると、かなり InnoDB のパフォーマンス改善されている
  • status 系のコマンドが追加されていて、MySQL をモニタリングするときに便利
短所:
  • 公式ビルドではない
  • /etc/init.d/mysql スクリプトが若干使いにくい(具体的には、/var/lib/mysql を削除したあと start しても mysql_install_db をしてくれない)
  • mysql-server、mysql、mysql-devel といったパッケージとコンフリクトしてしない管理がすこし複雑になる
今回はパフォーマンスより、管理コストなどが大きいと判断して MySQL 5.0.75 公式のものを自分でビルドしたものを使うことにします。この他にも、max_connections や thread_cache のチューニングなどがあって、まず本番投入して MySQL の show status や show innodb status の値を Ganglia でグラフにしながらチューニングしていきたいと思います。
また、最近 OutDelta という Percona MySQL よりさらにいろいろなパッチがあたっている MySQL の派生バージョンも登場していたので、同じマシンでベンチマークをとってみた。OurDelta のパッチとプラグインの一覧を見ると、サードパーティ製のストレージエンジンも使えるようになっている。
<MySQL-OurDelta-server-5.0.67.d7-44>
transaction type                    . . . : TPC-B (sort of)
scaling factor                      . . . : 100
number of clients                     . . : 50
number of transactions per client         : 500
number of transactions actually processed : 25000/25000
tps (include connections establishing)  . : 5576.523283
tps (exclude connections establishing)  . : 5595.084204
OurDelta の方は、若干パフォーマンスが出ていない様子。
データベースサーバは、インフラの中でもかなり重要なコンポーネントなので、ただ MySQL をインストールするだけでなくてしっかりと設定してパフォーマンスを向上させてサーバのリソースを有効活用したいものです。

DELL ラックサーバの選び方

仕事では、おもに DELL 製の 1U ラックサーバを使っているけれど、この度サービスが成長してきてサーバの増設が必要になってきた。そこでいい機会なので、今まで検討したことがない機種を含めてさまざまなパターンの見積りをたくさんとって検討してみた。

具体的には、次の機種で検討した。

ちなみに今まではサーバの用途にまったく関係なく、次のような同じスペックのサーバを使っていた。

まず、それぞれのラックサーバの特徴をまとめてみる。かなり個人的な主観も含まれているので、実際の仕様は、DELL の公式ページでチェックしたほうがいいです。

最初にコストパフォーマンスにすぐれているというか単に一番安い R200。

  • 3 機種の中でももっとも安くかえる(Celeron だとオンライン価格 49,800 円)
  • Core 2 Duo を選択する場合は、R300 と比べて R200 の方が安い(ただし Core 2 Duo の型番は違う)
  • 最大 RAM 容量は 8GB まで、スロット数は 4 つ
  • トランセンドのバルク RAM が使えるので、8GB にするには 22,000 円程度のコストで増設可能
  • ネットワーク経由で遠隔から電源のオフオンを制御できる DRAC というカードがあるけれど、R200 は DRAC4 という古いバージョンのものしかサポートされていない(電源のオフオンはできるので充分だけれど)
  • R200 に DRAC4 をつけると、仕様によってオンボードの VGA から信号が出力されないのですこしはまる(これはかなりはまってテクニカルサポートに問い合わせて対応してもらった)
  • DRAC4 は、DRAC5 に比べてすこし高い(DRAC4 はだいだい 22,000 円くらいで、DRAC5 はだいだい 12,000 円くらいだった)
  • 筐体が小さいので、一人でもラックにマウントしやすい(奥行きは R300 の 2/3 程度)
  • レールキットを一番シンプルなのにするとコストは安いけれど、そのレールキットだとマシンをメンテするときにラックからはずさないとできない

次は、R300。

  • Xeon クアッドコア低電圧版である L5410 を選択することができる(R200 の Xeon クアッドコアと消費電力を比較したけれどそれほど大きくは違っていなかった)
  • 最大 RAM 容量は 24GB まで、スロット数は 6 つ
  • トランセンドのバルク RAM を使うことができない(実際に試したら、警告音がなって起動しなかった)
  • RAM は、DELL 純正品の選択肢しかないので若干高い
  • ホットスワップ対応のハードディスクを取り付ける選択肢がある
  • R200 と比べてでかく重いので、一人でマウントするのはちょっと危険
  • 電源スイッチまわりがかっこよく、LED も薄い青でかなり高級な感じがする(笑)フロントカバーもかっこいい(必要なく買っていないけれど)

そして、1950 III。

  • 2CPU 搭載可能
  • 最大 RAM 容量は 64GB まで、スロット数は 8 つ(ということは 8GB x 8 にしないと 64GB にはならないが、オンラインで見積りをしてみると素敵な価格になりますた!)
  • コスト的には、今はまだまだ手が出せないかなぁ

あとどのモデルのハードディスクもまだ SSD の選択肢がなく、SATA か SAS の選択になって SAS では 15,000 回転のハードディスクを選択することができるというのが特徴。

さて、今回新しいサーバを選択しようと思ったのは、実際に運用してみた結果、いろいろな問題点に気がついたから。具体的には、次のとおり。

  • ロードバランサー(LVS + keepalived) に、Xeon クアッドコアはもったいなさすぎるし、RAM も 5GB もいらないなぁ(ニコニコ大百科では、EeePC で動いていると言っているし)
  • ロードバランサーはもっと低スペックにして、ウェブサーバにまわしたいなぁ
  • マスターデータベースサーバは、バックアップサーバがないけれど念のため RAID にしておきたいなぁ
  • データベースサーバ(特にスレーブ)は、将来のことを考えて RAM をたくさん積みたいし、ディスクは早いほうがいいな

そんなことを考えつついろいろと見積りをとってみた結果、個人的に次のようなことが分かった。

  • CPU に Xeon クアッドコアを選ぶと約10万くらい上乗せされるので、Xeon クアッドコアを選ぶときは R300 とそれほどコストパフォーマンスが変わらないので、R200 に比べて R300 の方が低電圧版であることを考えるとお得
  • CPU を Core 2 Duo にするなら、R200 の方がコストパフォーマンスがいい
  • DELL 純正メモリがかなり高価だという思っていたけれど、それほど大きく値段が変わらない(時期や購入数にとって割引されたりするとほとんど変わらなくなるし、RAM を自分で増設するコストも考えるとバルク RAM はむしろ割高になる傾向になる)
  • ハードディスクで SAS 15000 回転を選択した場合は、R200 に比べて R300 の方が安い
  • ハードディスクで SATA 1TB 7200 回転 x 2 を純正品で購入するとかなり高いなぁ(個人的に計算したら 2 万円くらい違うが、バルクのハードディスクを買ってしまうとサーバにとりつけるためのネジを自分で用意しないといけないし保証も受けられないという問題があるので難しいけれど)
  • SATA も SAS もそれほどコストに差はないので容量などの兼ね合いで決めるのがよい

こんなことが分かってきた。そこで、現状すでに稼働しているサーバを最大限に使うこと、そしてすこし先のことを考えて、現段階の結論としてサーバの用途ごとにスペックを次のように分けていくことにした。

  • ロードバランサー
  • R200: CPU Core 2 Duo E7300, 82GB RAM (28GB x 4)、ディスクレス
  • ウェブサーバ
  • R200: Xeon X3330, 4GB RAM, SATA 160GB 7,200 RPM x 1
  • マスターデータベースサーバ
  • R200: Xeon X3330, 8GB RAM, SATA 1TB 7,200 RPM x 2
  • スレーブデータベースサーバ
  • R300: Xeon L5410, 8GB RAM, SAS 300GB 15,000 RPM x 1

とはいっても実は今はウェブサーバとスレーブサーバが同居しているという構成でこのままウェブサーバを増やしていくとレプリケーションの負荷も大きくなっていることは考えられるので上の基本構成をふまえつつ、サーバの負荷をちゃんとモニタリングしてサーバの台数をなるべく少なくおさえつつ、かつリソースを最大限に有効活用したインフラを構築していこう。

# 追記(2009/04/09)
– R200 で Xeon Quad Core を選択した場合、R300 で Xeon Quad Core と選択するのと比べてコストパフォーマンスがあまりよくないことが判明(具体的には1万円から2万円くらいしか変わらない)
– R200 で遠隔で BIOS 操作やリブートができる DRAC4 はとても扱いにくく(CentOS 上からアップデートできない、ビデオの出力に制限があるなど)、R300 の DRAC5 の方が圧倒的に扱いやすくて遠隔操作もしやすい
– SC1435 という AMD Opteron プロセッサのモデルのコストパフォーマンスがとてもよいが、DRAC を接続できないという短所がある(はてなでは、SC1435 を 80 台近く導入しているとのこと)
– これらのことから考えると、R200 の変わりに SC1435(CPU x 2) を選択することに方針を変更することにした
– SC1435 は、CPU x 2 なので、Xen で仮想化して投入する
– ロードバランサーのメモリを増やして memcached + repcached をのせる予定

  • 1
  • 2