FreeBSD kern.maxdsiz

全文検索エンジン msearch で,うちのメールアーカイブをインデックス対象として 20000 通を越える大量データを処理したところ,Out of memory during request for xxxxxx bytes, total sbrk() is ... 云々のメッセージを出力して,インデックス作成が abend してしまった(abend は「夕べ」という意味のドイツ語ではなく,Abnormal End = 異常終了というコンピュータ用語である。為念。昔,夕方になると一日の業務のゴミが原因で abend するシステムバグの対策をさせられたことがあり,Abend abend と呼んでいた。関係ありませんけど)。

これは FreeBSD の管理するプロセスのデータセグメントのサイズの制限を超過したときに出るメッセージで,プログラムが自分の仮想メモリに大量データを抱え込んでいると,この事態に陥る可能性が出て来る。ま,制限値を増やせばいいのだけれど,20000 文書程度で出てしまうのもちょっとなんとかならないかなぁと思う。文書数が増えるといずれまた再発するのは確実だからである。Google は 20 億文書インデックスを達成したとき誇らしげにその広告を出していたが,確かに誇るべき数字である。とはいえ,情報検索の世界では数千万件のデータベースは最近では常識的な規模である。高々 20000 文書で OS のメモリ制限に引っ掛かるのは改善できないものか。

とにもかくにも対策。sysctl -a | grep maxdsiz で現状値を確認すると,536870912 だと知れ,約 500MB。だいたいその 2 倍くらいにチューンしてみる。/boot/loader.conf に次の 1 行を書き足してリブートする。

kern.maxdsiz="1024M"

sysctl で再確認すると,1073741824 に値が拡張されていた。これで msearch genindex.pl がうまく通るようになった。