2007.08.11 sendmail をチューンしてみる #1 久々に sendmail 設定ネタ案件があったので調べていたら, 出るは 出るは, 知らないネタが出るは, で, チューンニングポイントをま とめてみる。 もっとも全体的に(?)有効であるかは不明なので, 環 境やら運用状況を見て判断するしかないかな。なんとなくディフォ ルトで無効なものわからんでもない…ということで。。 sendmail は遅い。と一般に言われている。実際に遅い。 なんで遅 いかというと, 設計の古さもあるのでしょうが, 至るところでしつ こいくらいチェックしてる&安全側に倒して処理してるせいで, あ る意味, 堅牢性は極めて高い。めっちゃ高い。もっとも今となって は…な堅牢性がなきにしもあらずなので, このあたりバランス感覚 は難しいところ:-)。 なんにせよ, MTA の比較において典型的にベンチマークテストが行 われるのは, 1 通のメールを複数宛先に送ると言う典型的なメーリ ングリスト配送である。だが今どきメーリングリスト配送は主流と 言えるだろうか。オプトインメール配送が当り前になりつつある現 在において, 複数宛先には複数のメールが生成されるのが当り前に なっている。この時の MTA の性能を比較した話はあまり聞かない。 まぁそれでも sendmail は遅そうな気がしないでもないけど:-)。 とはいえ, sendmail には他の MTA には無い特徴があるわけで, そ のあたりでチューンしていけば, それなりに速いんではないかと思 ってる。がんばれ sendmail。 なお, 本件で取り上げてる sendmail は 8.14.1 / FreeBSD 6.2 あ たりの話となる。一部古いバージョンでもサポートしてる機能があ ったりするかもしれないが, 詳細は追いかけない:-)。 大量のメールが配信されている時, 処理が追い付かなくなると大抵 の MTA ではキューに溜め込んで, 後で吐くアプローチを取る。 こ のキュー処理を如何に速くするところがチューニングポイントにな る。というわけで今回はキュー処理を高速化あるいは低負荷化する ためのポイントにしぼる(=チューンニングポイント)。 sendmail の並列処理はプロセス単位で行う。 今時流行りのスレッ ドアプリケーションではないため, このあたり鈍重に見えなくもな いが, メモリ使用量はともかく, 今時の OS では SMP スケーラブ ルであると言える:-)。もっとも 1 通メール処理するのに独立性が 高すぎてキューからのメールの取り出しのオーバーヘッドが高くつ きすぎるきらいがある。このあたりのプロセス間での調停を共有メ モリを使うことでオンメモリ処理させることができる。そうあの共 有メモリである(どれ?)。いわゆる SYSVSHM なので, その方面のチ ューニングを事前に行っておく必要がある。 ■共有メモリを使用してキューの調停を行わせる ●OS 側設定 sysctl kern.ipc.shm_use_phys=1 を実行しておく。/etc/sysctl.conf に kern.ipc.shm_use_phys=1 という行を入れておけば, 再起動後 も自動的に実行してくれる。SHM まわりの設定では他にも色々ある が, sendmail 自体はあんまりリソースを食わないのでディフォル ト運用で問題無い。実際, 高々 3096 バイトである。 キューディレクトリの数に依存するが, 3096 バイトのキューディ レクトリ数倍である(まぁ正確にはオーバーヘッド分減りますが:-)。 共用メモリ使用量: 3096 バイト×キューディレクトリ数 ●sendmail 側設定 define(`confSHARED_MEMORY_KEY', 25) を設定しておく。もちろん sendmail のリスタートが必要。confSHARED_MEMORY_KEY_FILE とい う設定があるが, 「-1」以外では使用しない。 引数(例では 25)は共有メモリセグメントの ID(32bit 値)で, 他の アプリケーションとはあたらないように調整する必要がある。もっ とも SYSVSHM 使ってるアプリなんて限られてるので(有名どころで PostgreSQL, mplayer, X) 何を指定してもかまわない。とは言えな んらかの方針が欲しいところ…でソースを見たところ以下の通りと なる。 0: 共有メモリを使用しない。 -1: 25またはファイルから読む/書く。 その他: 指定された数字をIDとして採用。 細かいことは色々あるが, まぁ 25 使っとけってことで。 ●確認方法 上記設定を有効にすると ipcs -ma で確認ができる。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Shared Memory: T ID KEY MODE OWNER GROUP CREATOR CGROUP NATTCH SEGSZ CPID LPID ATIME DTIME CTIME m 65547 25 --rw-rw---- root smmsp root smmsp 1 3096 8784 94376 3:06:13 13:52:25 2:22:22 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Written by 重村法克