カテゴリー別アーカイブ: nicovide

ヘンなエラーが出てsearch daemonが立ち上がらない

madison.l3tp.org%sudo /usr/local/etc/rc.d/searchdaemon restart
searchdaemon not running? (check /var/run/searchdaemon/searchdaemon.pid).
Starting searchdaemon.
#!/usr/local/bin/php
madison.l3tp.org

Fatal error: Call to a member function add_shortcode() on a non-object in /usr/home/nicovide/public_html/wordpress292/wp-content/plugins/contact-form-7/includes/shortcodes.php on line 164

 

確かに考えて見ればその通りなんだけど、最近はちゃんといけるようになってたはず。何か原因があると思われる。以前もコレと同じエラー出てたし・・・。

democracyが不調っぽかった

考えてみればアンケートの送付先はashuraになる。

ここらで整理して、送付先もpolkにしよう、と。

wordpress_fsをインクルードするように変更。変更点が出始めたのでsvn管理下に。

dbの整合性をとる。

reagan.l3tp.org%mysqldump -h ashura -u yousan -p wordpress_yousan wp_democracyIP –skip-extended-insert > ~/tmp/hoge.sql

CREATE TABLE  `wordpress_yousan`.`wp_democracyIPP` (
`ip` int(11) NOT NULL DEFAULT ‘0’,
`qid` int(10) unsigned NOT NULL DEFAULT ‘0’,
KEY `ip` (`ip`,`qid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

ALTER TABLE `wordpress_yousan`.`wp_democracyIPP` ADD UNIQUE INDEX `Index_2`(`ip`, `qid`);

select distinct *  from wordpress_yousan.wp_democracyIP;
SELECT * FROM wordpress_yousan.wp_democracyIP w;

ここら辺で異常に気づく。ipってどうやらlongにキャストして保管してるけど、たぶんこれ全部fordのipだ。面倒だから全部統括してやる。

mysqldumpの–no-create-infoをつけないと、droptableが入ってしまって元あるデータを壊す。今回はpolk由来のデータをなくしてしまって、clintonから復旧させようとしたもののレプリケーションが反映されてて、しょうがないからtylerから復旧した。

さらに異常。IPテーブルは単なるログで集計結果はAにあるらしい。ashuraのAテーブルを元にdumpしたやつをpolkのAAに復元してしたのupdate文を流す。

update wordpress_yousan.wp_democracyA a1
left outer join wordpress_yousan.wp_democracyAA a2 on a1.aid = a2.aid
set a1.votes=a1.votes+a2.votes;

SELECT sum(votes) FROM wordpress_yousan.wp_democracyA;

合計9200ぐらい。数値は目で確認しながら。

先のIPテーブルが5000強(ashura)、3000強(polk)だったからだいたい一致する。

\’が付いてるtermの修正方法

  1. \’が付いてるtermのnameを\’無しに全て置換する
  2. 1のtermと1のtermのnameが被るterm(\’が付いてなかったterm)を洗い出す
  3. 2のtermを参照しているtaxonomyを洗い出す
  4. 3のtaxonomyの中から、正しくないtermを参照しているtaxonomyを洗い出す
  5. 4のtaxonomyを参照しているrelationshipを洗い出し、正しいtermを参照しているtaxonomyを参照させる
  6. 正しいtermが無い場合は作成してそれを参照させる
  • 正しいtermとはnameをsanitize_titleした物とslugが一致している物とする
  • 正しくないterm及びそのtermを参照しているtaxonomyは削除する
  • catlist、suggestlistを再生成する
  • 全てのサイトで行う

修正版。

  1. \’が付いてるtermとtaxonomyを直す。
    \’が付いてるtermとそのtermの\’を取ったtermが重複しているものを探して
    それを参照しているtaxonomyが\’無しのtermを参照するように直す。
    \’無しのtermが存在しない場合は作成する。
  2. 重複するtermを参照するtaxonomyとrelationshipsを直す。
    重複するtermを参照するtaxonomy、つまり重複するtaxonomyを探して1つに減らす。
    減らす基準としてはrelationshipsが参照するtaxonomyが多い物を残すのが良いが
    検索する効率が悪いので、term_taxonomy_idでorder byをして1つめに出てきたもの
    にする。
    例えば4つの重複するtaxonomyが有った場合、1つ目のtaxonomyを選択して、残りの
    3つのtaxonomyを参照するrelationshipsに1つ目のtaxonomyを参照させる。
    3つのtaxonomyとtermは削除する。
  3. slugを修正する。
    wp_termsのnameとslugが一致するか確かめて、一致しない場合は正しいslugに直す。
    slugが重複する場合があるので、重複した物はエラーとして扱いterm_idを控える。
    エラーとして出てきたtermを見て対策を考える。
  4. taxonomyから参照されていないtermを削除する。
termから\’を取り除く。
重複するtermを洗い出し、それに関連するtaxonomyを洗い出す。
洗い出したtermを一つにし、洗い出したtaxonomyを一つにしてtermに関連づける。
洗い出したtaxonomyに影響するrelationshipsを修正する。

nicovideでエラーが発生

fordが外向きのアクセスでも

503 Proxy error とか

bad gateway

ってのを返してた。

fordのエラーログもとくに影響なかったけど、server-statusをみたらwwwwwwwwwwwwwってWがいっぱいになってた。

http://ford.l3tp.org/server-status

lincolnの状態もとくにおかしくなかった。server-statusは見ていない。

lincolnのapacheを再起動したら直った。以上。

[Thu Apr 22 02:05:45 2010] [error] server reached MaxClients setting, consider raising the MaxClients setting
[Thu Apr 22 02:05:25 2010] [notice] Apache/2.2.13 (FreeBSD) mod_ssl/2.2.13 OpenSSL/0.9.8e DAV/2 PHP/5.2.11 with Suhosin-Patch SVN/1.6.6 configured -- resuming normal operations
[Thu Apr 22 02:05:25 2010] [notice] Digest: done
[Thu Apr 22 02:05:25 2010] [notice] Digest: generating secret for digest authentication ...
[Thu Apr 22 02:05:24 2010] [warn] module dav_module is already loaded, skipping
[Thu Apr 22 02:05:24 2010] [warn] Init: Session Cache is not configured [hint: SSLSessionCache]
[Thu Apr 22 02:05:16 2010] [notice] caught SIGTERM, shutting down
[Thu Apr 22 01:05:05 2010] [notice] child pid 17492 exit signal Segmentation fault (11)
[Wed Apr 21 18:43:30 2010] [notice] child pid 6652 exit signal Segmentation fault (11)
[Wed Apr 21 16:24:37 2010] [error] [client ::] File does not exist: /usr/local/www/apache22/data/wp-content
[Wed Apr 21 11:56:53 2010] [notice] child pid 90919 exit signal Segmentation fault (11)

nicovidaemonの軽量化をした結果

post_title_translateクラスをsingleton化した。
singleton化する前と後のnicovidaemonの1プロセスあたりのDB接続数とメモリ使用量は以下の通り。

singleton化する前
DB接続数 99
メモリ使用量 234620KB

singleton化した後
DB接続数 51
メモリ使用量 52348KB

post_title_translateクラスは、1プロセスあたり17個のインスタンスが生成されていた。
purveyorBaseで2個(そのうち1個はtaxonomyControlが保持する)。
nicovidaemon本体で1個。
nicovidaemonはpurveyorBase8個作成するので、2*8+1=17となる。

このことから、インスタンス1個あたりのDB接続数は3個だということが分かった。
post_title_translateクラスの内部でnico_term,nico_correspond,nico_reserved_keywordテーブルのDB_Tableを生成するので、この3つのコネクションと思われる。
edbも生成しているがコネクションは増えてない様子。
調べてみたところ、edb_class.phpに書いてあった。

// 同じ DSN で接続した既存のインスタンスを取得します。
// 存在しない場合は MDB2::factory() で新しいインスタンスを作成します。
$this->mdb2 = MDB2::connect($dsn, $options);
if(PEAR::isError($this->mdb2)){
throw eexp::gi($this->mdb2->getDebugInfo());
}

nicoPlayerの広告アクセスロジックについて

ソースコードを見てようやく思い出したのでメモ。

各nicoサイト用の広告サイトを複数定義出来る。
各nicoサイトにレートを設定して、ランダムに1つのnicoサイトを選び出す。
選び出されたnicoサイトに定義してある広告サイトにアクセスする。
リファラは広告サイト毎に定義出来る。
プレイヤーが起動したときに広告にアクセスする。
前回広告にアクセスしてから24時間が経過しているか、もしくは6割の確率でアクセスする。

ソースコードはnicoLib\src\nicovide\adの中にある。
adAccessorがadBOTを作成する。adBOTがadAnalyzer_*を作成する。*はadAccessorのURLLISTのadsのtypeを用いる。
adsのurlにアクセスを行って、adAnalyzerがhtmlを解析してurlを返して再度アクセスを行う。これをadAnalyzerに定義してある正規表現の配列の数だけ行う。

nicovidaemonでshm_put_var Failedが連発していた問題について

php_error.logに以下のエラーが表示されていた。
[25-Mar-2010 20:40:02] PHP Warning:  shm_put_var(): not enough shared memory left in /usr/home/nicovide/nicovide/daemonListen_class.php on line 415

OS側の共有メモリのサイズ設定が小さい可能性を疑って調べてみた。
[email protected]<122>sysctl -a | grep shm
kern.ipc.shm_allow_removed: 0
kern.ipc.shm_use_phys: 0
kern.ipc.shmall: 8192
kern.ipc.shmseg: 128
kern.ipc.shmmni: 192
kern.ipc.shmmin: 1
kern.ipc.shmmax: 33554432

これらのパラメータはカーネルのオプションでも指定可能っぽい。/usr/local/sys/conf/NOTESに以下の記述があった。
# Maximum number of shared memory pages system wide.
options         SHMALL=1025

# Maximum size, in bytes, of a single System V shared memory region.
options         SHMMAX=(SHMMAXPGS*PAGE_SIZE+1)
options         SHMMAXPGS=1025

# Minimum size, in bytes, of a single System V shared memory region.
options         SHMMIN=2

# Maximum number of shared memory regions that can be used on the system
# at one time.
options         SHMMNI=33

# Maximum number of System V shared memory regions that can be attached to
# a single process at one time.
options         SHMSEG=9

/usr/src/sys/i386/conf/GENERICにはこれらは定義されていなかったので、sysctlの値がどう決定されたのかは不明。
変更する必要があるのであれば、kern.ipc.shmallとkern.ipc.shmmaxを設定すれば良さそう。

しかし問題になったmadisonには30M近く割り当てられていた。そんなに消費するはずは無いと思ったので、実際に使われているサイズを調べてみた。
http://www.jp.freebsd.org/cgi/mroff.cgi?sect=1&cmd=&lc=1&subdir=man&dir=jpman-5.4.0%2Fman&man=ipcs

Shared Memory:
T           ID          KEY MODE        OWNER    GROUP    CREATOR  CGROUP         NATTCH        SEGSZ         CPID         LPID ATIME    DTIME    CTIME
m        65536          488 –rw-rw-rw- root     wheel    root     wheel               0        10000          669          669 10:32:29 10:32:29 10:32:29
m      1310721          492 –rw-rw-rw- root     wheel    root     wheel               0        10000        22563        34774 21:39:40 21:39:40 18:35:38
m        65539          491 –rw-rw-rw- root     wheel    root     wheel               0        10000        41458        41458 16:11:00 16:11:00 16:11:00
m       983044          490 –rw-rw-rw- root     wheel    root     wheel               0        10000        28489        28486 21:39:37 21:39:37 20:42:31

SEGSZ(たぶんサイズ?)がすべて10000。これを見てピンと来た。

shm_attach — 共有メモリセグメントを作成またはオープンする

memsize
メモリのサイズ。省略した場合のデフォルトは php.inisysvshm.init_mem、あるいは 10000 バイトとなります。

nicovidaemonのコマンドが17+1(cmdcount)個。コマンド1個につき保存する項目が4つ(success,failed,timeout,time)。
18*4*PHP_INT_SIZE(環境によるらしいけどmadisonでは4)=288
到底10000バイトには及ばないけど、メモリの使い方にオーバーヘッドがあるのかもしれない。INT型以外も保存出来るようになってるし。

20000バイト確保するようにして様子を見ることにする。

Apacheからsyslogに送るログに関する決め事

syslog-ngでログを収集するときに、プログラム名に正規表現を用いて出力先のファイルを決めるようにした。
プログラム名を正規表現に一致するように設定する必要があるため、形式に一定のルールを決めてみた。

リバースプロキシサーバのログは、サイトへの全てのアクセスを記録するために、一つのファイルへ書き込むとする。
リバースプロキシサーバを複数用意したり、リバースプロキシサーバを担当するホストが変わったとしても、一つのファイルへ記録することで、サイトのアクセスログの見通しをよくするのが目的。
リバースプロキシサーバのプログラム名はhttpd-ドメイン名、httpd-ドメイン名-error(エラーログ)とする。

リバースプロキシからのアクセスを処理するバックエンドサーバ群(1台しかないけど)は、各サーバの処理状況を把握するためにホスト毎に記録する事とする。
バックエンドサーバのプログラム名はhttpd_backend-ドメイン名、httpd_backend-ドメイン名-error(エラーログ)とする。

リバースプロキシサーバのログのファイル名は、プログラム名-access.log、プログラム名-error.logとする。
バックエンドサーバ群のログのファイル名は、ホスト名-プログラム名-access.log、ホスト名-プログラム名-error.logとする。

例:
リバースプロキシサーバのプログラム名は
httpd-nicovide.jp
ログファイル名は
httpd-nicovide.jp-access.log

バックエンドサーバのプログラム名は
httpd_backend-nicovide.jp
ログファイル名は
lincoln-httpd_backend-nicovide.jp-access.log