Home » ブログ
検索・リンク
ブログ  ブログ以外
最近の記事
Amazon

2009 年 2 月 のアーカイブ

2009 年 2 月 26 日

fedora10でキーボーレイアウトがいつのまにか日本jp106でなくなった。

fedora10(x86_64)で2/26にパッケージのupdateをして、再起動したらキーボーレイアウトがUSAに変わってしまっていた。
よくGNOMEのログオンメニューのキーボードや言語を間違えてしまい、しまったと思うことがあるのだが、自然にレイアウトが変更されてしまった。
UPDATEされたパッケージのせいか、OPミスか不明。
現象は以下。
レイアウト変更された設定

変更後

2009 年 2 月 17 日

MODxでドキュメントが5,000を越えたらキャッシュでエラー

MODx(0.961p2)でドキュメントの数に制限があるのが分からなかった。
ドキュメントを6,000個作成したら、管理画面が真っ白になった。
apacheのerror_logを見る。

[client 127.0.0.1] PHP Fatal error:  Allowed memory size of 33554432 bytes exhausted (tried to allocate 31457280 bytes) in /modxshop/assets/cache/siteCache.idx.php on line 21363
 

どうやら、Cacheのサイズに制限があるようだ。
MODxのフォーラムをみるとドキュメント数は5,000ぐらいが限界で、バージョン0.97でこの問題を解決するようなことが記載されていた。
しかし、諦めきれないので、単純にメモリを増やすことを試みる。
php.iniのメモリを増加

memory_limit = 32M      ; Maximum amount of memory a script may consume (16MB)
                                ↓
memory_limit = 64M      ; Maximum amount of memory a script may consume (16MB)

これでhttpdをrestartしたらOKだった。
しかしパフォーマンスが悪い。この際だから不要なものは整理。
siteCacheの内容をみる。ドキュメントとしての情報は以下。

$a = &$this->aliasListing;
$d = &$this->documentListing;
$m = &$this->documentMap;
$d['home'] = 1;
$a[1] = array('id' => 1, 'alias' => 'home', 'path' => '');
$m[] = array('0' => '1');
$d['feed.rss.xml'] = 51;
$a[51] = array('id' => 51, 'alias' => 'feed.rss.xml', 'path' => '');
$m[] = array('0' => '51');
$d['doc-not-found'] = 27;
$c = &$this->contentTypes;
$c[1] = 'text/html';
$c[27] = 'text/html';

これらの配列がドキュメントの数だけある。
当処理で不要な以下を削除することにした。cache_sync.class.processor.phpを改造。

  1. 配列cの’text/html’(5958個)
  2. 配列mの最下層クラス(5900個)

1.は当処理で問題なし。
2.はサイドメニュー(Wayfinder)の処理がおかしい。しかしメチャメチャ速くなる。
WayfinderはgetParentIdsで親子関係の処理ができなくなるようだ。
汎用のロジックを諦め、当処理用に独自改造してOK。
MODx0.96系ではドキュメント数が少ないコンテンツには適しているが、多くなるとパフォーマンスのためにロジックの見直しがかなり必要だと分かった。

ドキュメントが多くなると注意すべきこと

  1. SEO Strict URLs(全ドキュメントに対するrewrite処理)
  2. Wayfinder(親子関係のlevelの検索,sql)
  3. Ditto(同上)
  4. 大量のタグ(1バッファーにある大量のタグの変換)
2009 年 2 月 14 日

MODxでタグつきチャンクを大量に1ページに作成(sitemap等)したらレスポンス悪化

MODx(0.961p2)で2,000ページぐらいのドキュメントを作成した。
sitemap.xmlをDiitoで作成したけど、処理が終わらない。
DiitoでSQLを発行するまでの時間がかかっているようだ。
Diitoを使用しないで、独自の処理を行う。
これでCeleron D 320(2.40GHz)(メモリ1G)で
1分30秒かかっていた処理が20秒くらいになった。

ページが4,000ページぐらいに増えた。
処理が20秒から30秒かかるようになった。
sitemap.xmlの容量は1Mバイトにも達していない。
これはおかしいと思いソースを調べた。
sitemap.xmlを作成はチャンクを使用している。
このチャンクにタグを使用していたのが悪さをしている。(下記はチェンクの一部)

<loc>[(site_url)]xxxxx</loc>

チャンクは4,000ページ分を作成してoutputに纏められる。
纏められた後に、4,000ある[(site_url)]を文字列に変換している。(多分ひとつひとつ)
さすがにメモリを使用しているとはいえ、バッフォーを取り直しているのだから数あれば遅くなる。
結局、チェンクにはタグを使わないようにプレイスホルダを設定した。
処理は30秒から8秒と高速に終了するようになった。
(現在のMODx(0.963)がこのへんの改善がされているのかわからない。)

又、telnet(port80)でGETしてsitemapのテストをしていた時に思ったこと。
sitemapのドキュメントのキャッシュ無効にしていたのにも関わらず、site_urlがキャッシュされるようだ。
テストした時の手順は以下
1.ドキュメントのキャッシュをクリアする。
2.telnetでGETする。HOSTをaaa.jpと指定する。site_urlにはhttp://aaa.jpが入る。
3.HOSTを指定しないでGET。site_urlがhttp://aaa.jpと出力。(キャッシュされっぱなし。)
内側からのテストだったので、外からはこのようにならないかもしれない。
用心のため、config.inc.phpにsite_urlを固定で設定してしまった。

2009 年 2 月 9 日

トラックバックスパムに泣く

最近、海外からのトラックバックスパムが多い。
同じ、IPで何回も訪問する。
最初に.htaccesで拒否設定

deny from xxx.y.zz.               #xxx.y.zzを拒否

これをやってもルートをGETしにくるので
httpd.confで全体拒否

deny from xxx.y.zz.               #xxx.y.zzを拒否

これでも訪問してくる。
httpdサーバのログに残るので最後の手段はiptables。

iptables -I INPUT -s xxx.y.zz.0/24 -j DROP

レスポンスも返さないはず...
※うちのルータで設定できれば...。そのうちなんとかしたい。
無駄だとわかってどうして行うのかな?。

2009 年 2 月 2 日

MODxで大量ドキュメントを作成。Wayfinder、Dittoのパフォーマンスに泣く。

MODx(0.961p2)で2000件ぐらいのドキュメントを作成した。
親フォルダの下の2000件ぐらいのドキュメントがぶら下がっているイメージ。
Wayfinder(2.0)でメニューを表示させる。
しかし、2000件を表示させるのは無理なので親フォルダ1件だけ表示させる。
Webの画面を開く。ぜんぜん帰ってこない。httpdでcpu率の100%nearが永遠と続く。
Wayfinderのソースをみる。なんだこりゃ!
SQLを以下のように吐き出している。

SELECT DISTINCT sc.id,
sc.menutitle,
sc.pagetitle,
sc.introtext,
sc.menuindex,
sc.published,
sc.hidemenu,
sc.parent,
sc.isfolder,
sc.description,
sc.alias,
sc.longtitle,
sc.type,if(sc.type='reference',sc.content,'') as content,
sc.template,
sc.link_attributes FROM `modxshopdb`.`modx_site_content` sc LEFT JOIN
`modxshopdb`.`modx_document_groups` dg ON dg.document = sc.id
WHERE sc.published=1 AND sc.deleted=0 AND (sc.privateweb=0) AND
sc.hidemenu=0 AND
sc.id IN (95,
2065,〜   → 2000件

このINの要素(小ドキュメント)を作成するのに時間をかけ、さらにここでも時間がかかるSQLを発行している。
結局、Wayfinderは使わず、自分でスニペットを作成してメニューを表示。(汎用にはしていなので当然速い)
ここを解決したら、次はDitto(2.02)。sitemapを作成する処理を作っていたが、これもWayfinderと同じような処理。
超遅い。podがアクセスしたらタイムアウトしてしまう。ここもDittoを諦め、自前で作成。
MODxって詳細解説書がないので困ったものだ。スニペットのソースまでは見ていられない。

△ページトップ

Google
ページ
最近のブログ
アーカイブ
カテゴリー
最近のコメント
最近のトラックバック
    No Responses.