まだ重たいCMSをお使いですか?
毎秒1000リクエスト を捌く超高速CMS「adiary

2007/10/28(日)adiary 1.44リリース情報

ダウンロードはこちらから。テーマ修正とバグフィックがメインです。

今回がVer1.4系の最終リリースの予定です。

Ver1.43→Ver1.44の変更点

  • IEのCSS表示不具合等の対策をしました(完全ではありません)。
    • パスワード欄が大きくなる問題に対応しました。
    • mitsukiテーマで、管理画面のタイトル(H2)がずれる問題を修正しました。
    • 記事編集画面の本文入力エリアを、テーマに合わせ自動リサイズするようにしました(要JavaScript)。
  • テーマ修正
    • pre環境等でオーバーフロー時、横スクロールバーを表示するように変更しました(IE除く)。
    • 【新テーマ】すももテーマ両サイドバー)を収録しました(Designed by GLANSHE)。
  • 分類が存在しないとき、過去記事一覧にも分類欄を表示しないようにしました。
  • 【fix】検索語がタイトルに含まれるとき、正しく表示されない不具合を修正(Ver1.42~)。
  • 【fix】携帯ページでコメントした人の名前がでないバグを修正しました(Ver1.43のみ/Thanks to sunk)
  • 【fix】コンテンツキー重複回避がたまに挙動不審になる問題を修正しました。
  • 【fix】パーサによるHTMLの整形から改行が消え、HTMLソースが汚くなる(表示は変わらない)不具合を修正しました。
  • 【fix】一部携帯で表示できない不具合を改善しました。(Thanks to 海野
  • 【携帯】【fix】<$v.phone_sjis=1> 時に携帯から記事を投稿すると文字化けする問題を修正しました。(Thanks to ozawa)と投稿文字コードの問題。
  • 【携帯】【fix】PostgreSQL利用時、携帯から新規記事が投稿できない問題を修正しました(メール投稿含む)。
  • 【変更】一応1980年までの記事を扱えるようにしました(カレンダーとか狂いますが)。
  • 【電卓】電卓記法プラグインを同梱しました(デフォルトではロードしません)。

Version1.40β2以降(1.392以降)からの乗り換え

そのまま上書きしてください。

  • wikiモードで親子コンテンツを作成している方は「日記帳を再構築」してください。

Version1.32以前からの乗り換え

Version1.40への移行処理を先に行ってください。Version 1.32 以前からの詳細な移行方法はアナウンスされなくなります。

2007/10/12(金)adiary 1.43リリース情報

ダウンロードはこちらから。細々とした修正とバグフィックがメインです。

Ver1.41→Ver1.43の変更点

  • 日記帳のリストをユーザーや管理者以外に表示させない設定を選択できるようになりました。*1
  • 本文末の <div class="clear"> ←"clear: both;" の位置を埋め込みテキスト後に変更しました。
  • wikiコンテンツでの記事日付を標準で出力しないように変更しました。*2
  • 携帯表示でwikiコンテンツ機能部を追従させました(wikiコンテンツの作成はできません)。
  • 静的出力機能が付きました(adiary.conf.cgi を設定の上、日記のエクスポートから)。
  • 【fix】日記帳を複数人で共有時、ファイルアップロードが管理者と所有者しか実行できなかった問題を修正しました。
  • 【fix】検索語の2つめ以降に span などを指定すると表示が崩れる問題を修正しました。
  • 【fix】詳細デザイン利用時に、検索ができない問題を修正しました。
  • 【fix】adiary.conf.cgi.sample に <$v.multiuser_top_skelton> が2ヶ所記述されていたので、1つ削除しました。
  • 【fix】記事削除時に(子)記事リストが更新されなかった問題を修正しました。
  • 【fix】mp3ファイルアップロード時、自動でpodcastされない問題を修正しました。
  • 【fix】wiki-keyの重複回避が動作してなかったので修正しました。
  • 【fix】タイムゾーンの設定(海外サーバ時刻ずれの解消)が無効であった問題を修正しました。(Thanks to sunk)
  • 【fix】HTMLタグの大文字の属性値が消える不具合を修正しました。(Thanks to まなう”
  • 【fix】【携帯】かんたんアクセス時などにデバッグメッセージが表示される問題を修正しました。(Thanks to serika)
  • 【変更】子記事リストの出力形式が微妙に変更になりました。
  • 【廃止】日記モード(1日1記事モード)を廃止しました。*3
  • 【PostgreSQL】PostgreSQL利用時、pkey保存importが実行できない問題を修正しました。
  • 【テーマ】arisa:ありさテーマを収録しました。
  • 【テーマ】mono-black:mono blackテーマを収録しました。
  • その他雑多な修正。

なおVer1.42は一般配布が行われない欠番です。

*1 : adiary.conf.cgi.sample の<$v.daybook_list_disp>を参照してください

*2 : なお、日記帳の設定で変更できます。

*3 : wikiモードやメール投稿その他との矛盾、その他実装が雑多になること、利用がほとんどないことを考慮して廃止です

Version1.40β2以降(1.392以降)からの乗り換え

そのまま上書きしてください。

  • wikiモードで親子コンテンツを作成している方は「日記帳を再構築」してください。

Version1.32以前からの乗り換え

Version1.40への移行処理を先に行ってください。Version 1.32 以前からの詳細な移行方法はアナウンスされなくなります。

2007/09/26(水)PerlInterpMax の示すもの

daily dayflower などの情報をみて worker MPM な Apache を利用しても、同時に利用可能な Perlインタプリタ(mod_perlプロセス) は PerlInterpMax に制限されるように思っていました。デフォルトではこの値は 5 であり、一見少なく感じられます。

サーバDoS事件

ご存じのとおり本 blog.abk.nu サーバは、以前まで「データベースに接続できないエラー」を吐いてブログが表示されないことが多々発生していました*1。以前の設定値は次のとおりです。

mod_perl : PerlInterpMax 5
PostgreSQL : max_connections = 15

これでも、PostgreSQLへのコネクションが足りなくなりエラーとなっていました。PostgreSQLへのコネクションを保持するデーモンは adiary の他にありません。一体何が起こっていたのでしょうか。

*1 : それどころか、少し前にシステムリソースを食いつぶしサーバ機能を停止させる事件まで発生してました。

PerlInterpMax の示すもの

ここで実験です。worker MPM(スレッド動作)で動く Apache で"PerlInterpMax 3" に設定し、TCPデーモンとTCP接続をするだけのモジュールを用意して、PostgreSQL への接続と同様にコネクションを(切断することなく)プールさせてみました。この状態で

~$ ab -c 10 -n 100 http://blog.yyy.xx/

として、接続負荷をかけてみます。このときのTCPデーモンの表示は次のようになりました。

[05] Connection from 127.0.0.1
[06] Connection from 127.0.0.1
[07] Connection from 127.0.0.1
[08] Connection from 127.0.0.1
[09] Connection from 127.0.0.1
[10] Connection from 127.0.0.1
[11] Connection from 127.0.0.1
[12] Connection from 127.0.0.1

8本の同時接続です。PerlInterpMax 3 であるのにです。不思議です。ここでもう一度よく PerlInterpMax の説明を読んでみます。

PerlInterpreter を各 httpd スレッド毎に一対一対応させる代わりに,mod_perl では設定自在なインタプリタプールを管理しています。この方式により,必要最小限な数のインタプリタを用意することでメモリ使用量を押さえることができます。

daily dayflower より

どうやらスレッドに対する設定項目であることが読みとれます。そもそもよく考えてみれば、プロセス間でPerlインタプリタを共有することなんて不可能です。この仮説を検証するため、Apache のプロセス数を2つに制限してみました。

<IfModule mpm_worker_module>
    StartServers          2
    ServerLimit           2
</IfModule>

さてもう一度実験です。

[05] Connection from 127.0.0.1
[06] Connection from 127.0.0.1
[07] Connection from 127.0.0.1
[08] Connection from 127.0.0.1
[09] Connection from 127.0.0.1
[10] Connection from 127.0.0.1

今度はきちんと6本になりました。PerlInterpMax(3) * ServerLimit(2) = 6 ですから、計算に合っています。

PerlInterpMax の示すもの

mod_perl はスレッド動作時に 1プロセスごとに Perlインタプリタ をプールして保管します。1プロセスごとにその保管数まで mod_perl スクリプトを実行できます。プールされる実体は Perl 5.6 以降の ithreads そのものです。*2

この1プロセスごとのスレッドプール最大数を決めるのが PerlInterpMax です。worker MPM におけるプロセス数は ServerLimit で制限されます。つまり最大 PerlInterpMax × ServerLimit 個のmod_perl環境が同時に実行/保存されることになります。

それぞれデフォルト値では5、16ですから、80になります。この状況でデータベースへの接続をプールすると、あっと言う間にサーバ資源を食いつぶすことになるので注意が必要です。

注意

PerlInterpMax を小さくするときは、同時に PerlInterpStart も小さくします。PerlInterpStart より小さな値を PerlInterpMax に設定しても無効です

*2 : ですから、threads::shared によりスレッド間(同一プロセス)に限って変数を共有することもできます。