
鯖的なお話 Windows Serverの巻
はじめに
このページは管理者がチラシの裏的にサーバーのことをあれこれ書き綴る場所ですが、世に数多ある「サーバー構築指南」サイトとは まったく違います。なので掲載した内容に、管理者の勘違いや認識不足の内容をそのまま恥ずかしげも無く掲載している 場合が多々あります。掲載内容を鵜呑みにせず、気になった事柄はググッて調べてみましょう。
以下の内容はWindows Serverを対象にしています。
目次
◆ヨスコ鯖の構成
◆OSについて
◆Apacheについて
◇嵌るmpm_winnt
▼ThreadsPerChild
▼MaxRequestsPerChild
▽恐怖! 機動メモリーリーク
▼ヨスコ的MaxRequestsPerChild
◆IPnutsで高性能ブロードバンドルーターを作ろう
◆iSCSIを試してみる
◇外付けストレージの種類
◇iSCSIターゲットの構成
使えない・遅い・すぐ落ちる・要はダメロダという代名詞がすっかり定着した感のあるヨスコ鯖ですが、一応どのような 鯖構成なのかここで晒してみようと思います。 下記はルーターも含めた構成です。
■サーバー ・Dell PowerEdge 1600SC
■OS ・CentOS5 (10/13変更)
□CPU ・Intel Xeon 3.20GHz x 2 L3 1M(10/13変更)
□メモリー ・PC2100 DDR SDRAM Reg Ecc 1G x 4
□HDD ・Ultra320SCSI 15000rpm 73G x 3 36G x 3 (10/13変更)
■サーバー ・Dell PowerEdge 1600SC (過去ログ用 11/1公開終了 予備機に変更予定)
■OS ・Win+Xampp
□CPU ・Intel Xeon 3.06GHz x 2
□メモリー ・PC2100 DDR SDRAM Reg Ecc 1G x 4
□HDD ・Ultra320SCSI 15000rpm 73G x 2 36G x 4
■SAN(iSCSI) ・Dell PowerEdge 600SC (実験終了につき未接続)
■OS ・CentOS5
□CPU ・Intel Pentium 4 2.8GHz (9/2変更)
□メモリー ・PC2100 DDR SDRAM Reg Ecc 1G x 2
□HDD ・Seagate IDE 40Gx1 160G x 2 250G x 2
■ルーター ・DELL OptiPlex GX240 Small desktop (8/30再変更)
■OS ・IPnuts 4.0r3
□CPU ・Intel Pentium 4 1.8AGHz (9/2 Willamette→Northwood1.8AGに変更)
□メモリー ・PC100 SDRAM Ecc 512M x 2
□HDD ・SILICONPOWER CF 200x 2G
■回線 ・Bフレッツ ハイパーファミリータイプ
簡単に以上の様な構成になってます。一言で言うなら宝の持ち腐れです。
RAIDとかの無駄な事はしてません。←でしたが、7/15にアップされたデーターの保存用ドライブをストライプ(RAID 0)に変更しました。 壊れた時の冗長化よりも読み書きの高速化を優先したのでパリティー付きストライプ(RAID 5)にはしてません。壊れて困る物はDDS4にバックアップしてます。
*2008/10/13 Centos5に変更しました。
「アップローダーの鯖にそのOSかよ」と知識のある方は思うかもしれませんが、一応実験目的でやってますので大目に見てください。 たしかにあれこれと制約が多いのも事実ですが、リナ鯖にない利点も多いです。それは「安心して再起動できる」に尽きると 思います。実は別回線で1600SCとCPU以外はまったく同じ構成のDell PowerEdge 600SCをCentOS4で動かしていまして、約7ヶ月間 動きっぱなし状態です。スキルの乏しいヨスコ管理人には再起動して同じ環境に立ち上げる自信はありません。リナ鯖はなんでも できて、動き出したら何ヶ月でもほっとける反面、ある局面では非常に気難しい鯖だと思います。まぁどちらも一長一短 ということですね。最後に2chの某スレッドで見て「なるほどな」と思った発言を引用してOSのお話は終わりにしようと思います。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
俺は両方使ってるけど、どっちでもいいと思うよ
最終的には管理する人のスキル次第だと思うし
プログラムはクロスコンパイラでどっちでもバイナリ作れる
とにかく青筋立てて怒らないで仲良く汁と言いたい(´・ω・`)
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
これの話題に触れ始めると、書く事がいっぱいあって訳がわからなくなります。なので幾つかの項目に絞って進めようと思います。
ApacheはもともとUNIX系OS上で働くwebサーバーで、1.3系列と2.x系列の二種類があります。これをWindowsOSで動く様にした物 がWin32版です。ヨスコ鯖は2.x系列の最新版で動いています。
Apacheの大半の動作はhttpd.confという設定ファイルを参照して行われます。このhttpd.confはUNIX系・Win32版で記述の仕方が違うだけでほぼ同じ内容です。
★自鯖を構築してみたいと思った方は下記のサイトが参考になります。
・手軽にWin鯖派の方はMizushima Network Serviceさん
・本格的にLinux派の方はお便利サーバー.comさん
↑のサイトを参考にして諸々の設定をしてhttpd.confに必要事項を記述すれば、どちらのOSでもあっさり鯖が動きます。
現在ヨスコ鯖の頭痛の種、もっとも悩んでいる忌々しい設定が、このhttpd.confの中のたった一行の設定値なんです。
mpmはマルチプロセッシングモジュールといいまして、Webサーバーとしての機能を制御する重要な設定項目です。様々なOSに適したモジュールが それぞれ用意されてまして、どれかひとつをロードしないとApacheは起動しません。OSによって下記のモジュールがあります。
UNIX系
・prework 安定性重視や古いソフトウェアとの互換性を保ちたい場合に指定します。
・worker マルチスレッドとマルチプロセスのハイブリット型サーバーを 実装します。
・perchild VirtualHostを使用する際に効果的なモジュールです。
Win32用
・mpm_winnt Windows NT 向けに最適化されたマルチプロセッシングモジュールです。
他のOS用のもありますが割愛させてもらって、本題のmpm_winntの話を進めたいと思います。気になる方はここを見てください。
mpm_winntは基本的に↓の二行で設定します。
ThreadsPerChild 250
MaxRequestsPerChild 0
デフォルトの数値です
これはどの様な働きをするかというと、ThreadsPerChildの場合、このサーバーは同時に250のリクエストを処理できます。それ以上 のリクエストは空くまで待機してもらおうという設定です。サーバースペックに余裕があればこの数値は好きなだけ大きくしても問題あり ません。なんですが、例えばThreadsPerChild 1000とかにしても、そのサーバーのピーク時の同時リクエスト数が300程度だと、残り700分 のメモリー空間は無駄になってしまいますし、共有メモリー空間を圧迫するだけで良い事はないので、ピーク時のリクエスト数+100くらいが 良いんじゃないかと思います。ヨスコ鯖はピーク時で500を少し超える程度のリクエスト数なので、それなりの設定値にしてます。
ちょっち↓をご覧ください。
タスクマネージャの画面ですが、WindowsでApacheを起動するとこんな感じになります。これが何を意味するのか、順に説明したい と思います。
@は、Apacheを起動後にThreadsPerChildの数値を参照して生成された待機スレッドです。上の「702」がリクエスト処理用の待機スレッドの数で、 下の「4」がApacheの制御用スレッドです。実際の設定値は「700」なんですが、起動の度に2〜3個多くなったり少なくなったり します。メモリー使用量に注目してください。約672MBがThreadsPerChildで設定した待機スレッドに割り当てられています。ご存知の とおりWindowsは、起動しているだけであれこれとメモリーを消費していますので、この場合の全体のメモリー使用量の合計は約1GBに なります。ヨスコ鯖は4GBのメモリーを搭載してますので、残り約3GBが共有メモリーとして使える訳です。
Aは皆様がファイルをアップロードしている時に表示されます。詳しい説明は別の機会にします。Bも気にしなくてよいです。
MaxRequestsPerChildの説明なんですが、これが曲者でヨスコ鯖の頭痛の種です。これの働きは簡単にいうと、ThreadsPerChildで 設定したリクエスト処理用スレッドの使用回数を制限するための設定項目です。つまりMaxRequestsPerChild 10とした場合、待機スレッドが 10回使用された時点で、一度終了して新たにThreadsPerChildの設定値分だけ新しい待機スレッドが立ち上がる訳です。一種の再起動みたいなものですね。
なぜこんな面倒くさい事をしなければならないかというと、待機スレッドを長期間使い回しているとサーバーのレスポンスが低下してしまう事と メモリーリークが発生しやすくなってしまうからです。
メモリーリークという現象は、通常リクエスト処理の終わったスレッドは、その内容を消去して次のリクエストに備えて待機するのですが、なにか の拍子で内容の消去ができなくなる事です。一度このリークが発生すると、内容を消去できないスレッドが次々と増殖してメモリー空間を占領 していきます。メモリーに収まりきらなくなったスレッドは、やがてHDDのスワップ領域まで占領し始めて、最悪の場合サーバーをダウンさせます。 この最悪の結果は、デフォルトのMaxRequestsPerChild「0」(無制限)や、とんでもなく大きい設定値にした場合やサーバースペックに 見合わない設定にした場合に起こります。
まるで癌細胞の様なメモリーリークですが、CGIやPHPなどの動的コンテンツを扱うサーバーは、程度の差こそあれ間違いなくこの問題を抱えているはずです。 特にアップローダーを扱うサーバーは、予想外・想定外の動きをします。上のサーバー構築指南サイトで紹介しているデフォルトの設定では、まとも なサーバー運用は無理な訳です。実際、ヨスコ鯖を起動して2時間経たずにリークが発生した事もあります。実に忌々しいです。
その忌々しい現象のため、ヨスコ鯖は過去に3回、上げ主さんの努力と忍耐と貴重な時間の結晶であるログを消失しています。 最近起きたログ消失が一番最悪で、ハードディスクが3枚身罷られました。この事故の時はMaxRequestsPerChildを微調整中で、数値を 細かく変更しながら鯖の様子を見ていたのですが、間違ってゼロをひとつ多くして起動してしまいました。10万単位で設定されれば デフォルトの「0」である無制限と変わらないため、見事にサーバーがダウンしてハードディスクまで逝った訳です。十万円の高い授業料でした。
さきほど、同じスクリプトを使用しているエロ男さんをチラッと 見てたんですが、どうやら同じ症状でお悩みのようです。
前置きが長くなりましたが、実際にヨスコ鯖の設定は現在どの様になっているのか説明したいと思います。
静的コンテンツ(HTMLのみなど)の場合、MaxRequestsPerChildはデフォルトの「0」無制限でも問題ないんですが、ヨスコ鯖は常にCGIが 動いています。一般的なサーバーに比べてそこいらへんの負荷が半端でない訳です。なのでデフォルトは論外です。MovableTypeのCGI で同じような実験をしている小粋空間さん がMaxRequestsPerChild 5000に設定して色々実験しています。MovableTypeの場合、CGIが動くのはトラックバックがほとんどだと思う んですが、これでもスレッド再起動の周期が早いので調整が必要なんだそうです。対してヨスコ鯖の場合はどんな感じがというと、 ダウンロードプロセスでは空いている時間でも3秒に1回くらいの割合でPerl.exeが起動してログに書き込み、メモリーを解放して待機に入る感じです。 これに更に、1つのIPから接続時に平均5リクエストが要求されます。それはもう一時間単位のスレッド使用回数は凄い事になる訳です。 真夜中試しにMaxRequestsPerChild 5000に設定してみた事があるのですが、2時間経たずにスレッドが再起動してしまいました。 メモリーリークを未然に防ぐだけならそれで良いかも知れませんが、アップローダーではそうも行きません。
またちょっち↓をご覧ください。
これはスレッド再起動の瞬間を捉えた衝撃映像ですw Apacheの上の赤枠は再起動前に要求されて実行中のスレッドで、下の黒枠が 再起動で新たに生成されたスレッドです。赤枠のスレッドは、Timeout 300の設定に従って強制的に終了させられる運命にあります。 役目を終えたスレッドは生まれ変わって黒枠の新しいスレッドに追加される訳です。
下のperl.exeも再起動前に始まったアップロード中のスレッドです。このスレッドも悲しい運命を辿ります。
アップロード中スレッド再起動に運悪く遭遇すると、アップロードプロセス実行中であっても、Timeout 300の設定に従って強制的にスレッドを終了させられます。 この状態がいわゆる「蹴られた」な訳ですが、ただでさえ大きいファイルを何時間もかけてアップロードする事が多いサーバーで、2時間 置きにそんな状態になったら誰もアップロードできなくなります。かと言って無駄にMaxRequestsPerChildを大きくしても再起動の 前にメモリーリークを起こしてサーバーのパフォーマンスを低下させてしまう事になります。どちらを取るかじゃなく、どこで妥協するかの問題 な訳です。
では実際の設定値を決めるのですが、MaxRequestsPerChild 5000だと2時間持たずに再起動してしまいました。理想というか 狙いは一日に一回のスレッド再起動なので12時間程度はもってほしい。単純に計算すると30000回前後になりますね。仮にサーバーを 起動直後にメモリーリークが起こっても、1スレッド100kB程度のリークなら物理メモリーの範囲内でなんとか抑え込む事ができるはずです。ただし 30000回を消化するまでサーバーのパフォーマンスは極端に低下します。この状態が画像掲示板なんかでよくある「重い」状態です。 起動直後のリークなんてそう滅多にあるものではないですけどね。ある程度使用回数を消化してからリークが起こった場合、「重い」は 割と短時間で済みます。色々試した結果、現在は週末の混む日には若干多めに、それ以外の日は30000回以下の設定値にしています。
以上がヨスコ鯖の様な構成で運用する場合のヨスコ的設定値なんですが、実際には間違っているかも知れません。なんせこの様な 実例の資料が皆無なので、手探りで失敗しながらど〜にかこ〜にか導き出した設定値です。もし参考にするのであれば、無茶は しないでください。クラッシュしても責任もてませんのでw
◆IPnutsで高性能ブロードバンドルーターを作ろう
サ行中
自鯖を運営する、特にヨスコの様なアップローダーの場合は必ずこの問題に頭を悩ませます。それは
データ保存領域の容量です。
IDEやS-ATAを利用している場合こんな悩みとは無縁だと思います。現在は最高1TBの物がありますし、なによりお安い ので普通の3.5インチ・シャドウベイが四つくらいあるケースであれば容量など気にする事も無い訳です。ところがヨスコ鯖は何を血迷ったのか SCSIを選択してしまいました。SCSIはご存知のとおり今となっては古い規格ですが、24時間の運用を前提にした企業のサーバー などでは未だ現役で使われています。そしてお値段はビックリするほど高い訳です。ヨスコ鯖は現在6枚のHDDが接続されてますが、 容量はたったの327GBしかありません。今のサーバーに増設するにしてももう場所が無いですし、容量を増やすにしても趣味のサーバー でそこまで出資してど〜すんのよという思いもあります。かと言ってIDEやS-ATAに換えるのもせっかくここまで育ててきたのに もったいない。ではこんな場合どうするか?となると、残された答えはひとつです。
サーバーの外に保存領域を設置しちゃえばいいんです。
保存領域をサーバー外に設置する場合、大まかに三種類の方法があります。
DAS(Direct Attached Storage)
NAS(Network Attached Storage)
SAN(Storage Area Network)
DASはPC本体に直接接続する方法で、昔ながらのSCSI機器やUSBにFireWire、そして今もっともお手軽で高速なeSATAなどが あります。サーバー用途に限れば、最近のPCを利用している場合(PCI Express x1が付いているMB)、接続の簡単さやお値段の安さで eSATAがもっとも適していると思います。
NASとSANはネットワーク(LAN)に接続する方法でネットワークストレージと呼ばれています。接続方法は同じLAN接続ですが、その性格はまったく 異なります。
NASはファイル単位でデーターの転送を行います。要はWindowsのファイル共有です。外向けに公開するサーバーの保存領域には向いていません。
対してSANはブロック単位でデター転送を行います。ブロック単位とは、要はHDD一枚単位と言う事です。例えばこの方法で接続して サーバー側の(ヨスコ鯖はWindows鯖なので)管理ツール>コンピュータの管理>記憶域>ディスクの管理(ローカル)を開くと、SAN側で指定したドライブが 「未指定の領域」としてフォーマットされるのを待っている状態になっているはずです。これをフォーマットしてドライブレターを与えてあげると、 普通のボリュームとして扱う事ができます。そしてSAN側で複数のドライブを指定してサーバー側でRAIDを組む事や、逆にSAN側でRAID を組んでおいてサーバー側では単体のボリュームとして扱うなんて事もできます。
SANは大きく分けて二種類の接続方法があります。ひとつは↑で説明したLAN接続、もうひとつは光ファイバーを利用したFC-SAN (ファイバーチャンネル)と呼ばれる方法で、現在4GBの転送速度を実現しています。このFC接続は大規模なサーバーセンターなどで利用する方法 で一般では大金持ちでないと利用は無理ですので、今回の候補からは除外します。
LAN接続でブロック単位の転送を行う方法を「iSCSI(Internet Small Computer System Interface)」と言います。読んで字の 如く、SCSIのプロトコルをTCP/IPネットワーク上で遣り取りするための規格で、鯖とスイッチングハブさえあれば簡単に構築する事ができる訳です。 突然ですが、OSにWindows Vistaを使っている方はコントロールパネルを開いて見ましょう。一番上に「iSCSIイニシエータ」なる物があるはず ですね。Windowsでは標準で「iSCSI」をサポートしていますので、環境と物さえ整えばいつでも使うことができます。VistaとServer 2008 以外を使っている場合は「iSCSIイニシエータ」自体インストールされてませんので、Microsoft iSCSI Software Initiator をダウンロードして使います。言うまでもなくLinuxでもしっかりサポートしてますのでOSの種類を気にする事はありません。
サーバー側をコントロールするソフトウェアは「iSCSIイニシエータ」ですが、保存領域(ストレージ)を提供してくれる側をコントロールするソフトウェアは「iSCSIターゲット(Target)」 です。これもWindows、Linuxそれぞれサポートしてますので環境に合わせて使います。
ヨスコ鯖は古いサーバー機を使ってますのでPCI Express x1なんて上等なものは付いていません。なのでDASは候補から消えます。 NASは公開サーバーには不向きとなると、最後に残ったSANで外部ストレージを構築する事になります。ではさっそく市販品の物色を、 と色々調べると、とんでもない事実が色々わかってきます。まずお値段が超お高い!某有名メーカーの最小構成のSANでも確実に10万 円以上します。ある程度満足のいく構成になると30万コースです。そんなお金があったら最新の鯖機に入れ替えれって話です。 では作れないじゃん、と思うのは早計です。ちゃんとお安く構築する方法があるんです。
自宅に余ってるタワー型のPCや、1〜2万円で手に入る中古で小さめのタワー(HDDがSATAだとなお良し)、Gigabit LANが付いてなければ GigabitのNICを一枚とGigabit対応のスイッチングハブ、最後に希望の容量のHDDを数枚、これでできちゃいます。
OSはもしWindows XPなんかが入っていればそのまま使っても良いのですが、SANの場合OSの仕事はほんの僅かなのでWindows系 OSはパワーの無駄遣いになります。市販品のSANやNASのほとんどが最小構成のLinux系OSを使っています。それこそIPnutsルーター の様に、特定の機能だけ抽出した一枚のフロッピーで起動できるOSでよい訳です。なのでここは是非Linux系OSにしましょう。
では実際に「iSCSIターゲット(Target)」化する機体を用意しましょう。用意した機体はDell PowerEdge 600SCのrev.A00。 600SCの言わば初号機で、FSBが400MhzまでのCPUしか認識しない機体です。ちなみにrev.A01はFSB533、最高で3.06Ghzの Pen4を搭載できます。もし買う機会がある人は、しっかり確認しないと痛い目にあいます。この機体にした理由は、サーバー 専用機の強みでIDEチャンネルがオンボードで三つも付いているので、追加でホストカードやRAIDカードを買う必要がない事です。さらに NICにはオンボードでIntel PRO/1000MTサーバアダプターが搭載されています。詳しくは後述しますが、このNICはTCPオフロードエンジン(TOE)で CPUに任せていたネットワークの処理をNICで引き受ける事で、サーバー本体の負荷を軽減する効果があります。
これに乗せるHDDは、初代ヨスコ鯖で使用していたIDE160Gと250Gが各一枚。ですがRAIDを組む事が前提ですので、一枚ずつ追加 購入しました。一枚五千円でお釣りが貰えるほど安くなりましたので当然新品です。これにOSを入れるHDDに押入れに 眠っていたIDE40Gを一枚。実は当初、OSのゼロスピンドル化を計画してCFカードやらCF=IDE変換ボードなども用意していたので すが、今回は時間がないのでIDE40GにOSをぶっ込みます。メモリーはとりあえず1G。で↓の様な構成になります。
■Target ・Dell PowerEdge 600SC
■OS ・CentOS5
□CPU ・Intel Pentium 4 1.8GHz
□メモリー ・PC2100 DDR SDRAM Reg Ecc 1G
□HDD ・Seagate IDE 40Gx1 160G x 2 250G x 2
入れ物が揃ったところで早速インストールしてみましょう。
ケイゾク