Kodama's home / tips.

Linux サーバのチューニング

注意. 副作用あり. チューニングのトレードオフに注意.

一応動作するようになった後のチューニング. システムの負荷の状態や目的によってどのようにチューニングするかが変わる. トレードオフの考慮が必要な要因もあるので, 状態を調べながら調整する.

  1. システムの確認
  2. カーネルの応答性(カーネル プリエンプティブ)
  3. Linux カーネル と vmware ESX サーバ
  4. サーバの応答性(キャッシュの書き込み間隔,dirty_writeback_centisecs,dirty_expire_centisecs)
  5. ext3 のジャーナルの調整(data=journal)
  6. ディスクの負荷を軽減(noatime)
  7. ディレクトリ参照を高速化(dir_index)
  8. NFS スレッド数(/proc/fs/nfsd/threads)
  9. カーネル ファイルディスクリプタ数(file-max)
  10. カーネル スレッド数(threads-max)
  11. LDAP 同時接続数(slapd.conf, threads,concurrency)
  12. LDAP インデックスで高速化(slapd.conf, index)
  13. Courier pop/imap 同時接続数(MAXPERIP)
  14. smtp/postfix 同時接続数
  15. smtp/postfix SPAM 対策

システムの確認

カーネルの応答性(カーネル プリエンプティブ)

応答性を重視するサーバやデスクトップ環境では, カーネルのコンパイル時に カーネル プリエンプティブ を有効にすると, 応答性が良くなる.

数値計算等を目的とするサーバでは, ノンプリエンプティブ カーネルの方が CPUの利用効率が良い.

Linux カーネル と vmware ESX サーバ

(vmware ESX サーバ での 仮想 PC の時刻ずれの問題)

カーネル空間の処理が重いので, タイマー割り込み, プロセス切替えなどの能力で問題が出る可能性がある. 性能が出ないからと云って 仮想CPU を増やすと, 割り込み処理が増えて, かえって嵌まるかも. 要調整.

サーバの応答性(キャッシュの書き込み間隔,dirty_writeback_centisecs,dirty_expire_centisecs)

(Linux ディスクキャッシュの開放)

ファイルの書き込みが多いサーバでは, ファイル キャッシュの書き込み間隔が長いと, 一度に大量のディスク書き込みが行われるため応答性が間欠的に悪くなる. ファイル キャッシュの書き込み間隔を短くすることで, 負荷は多少高くなるが, 一貫した応答性を持たせることができる.

ext3 のジャーナルの調整(data=journal)

/etc/fstab の ext3 のマウントオプションで data=journal を用いると, メタデータだけでなく, すべてのデータをジャーナルにコミットする. データの内容の安全性が高くなる.

通常, このオプションが無いと, i-node の整合性を保証するためのメタデータのみのジャーナルとなる.

同時にバッファキャッシュの書き込み間隔を調整すると良い. data=journal とするとジャーナルとファイル本体へのデータの2重書き込みになるので負荷が重くなるが, キャッシュの書き込み間隔を短くすると(サーバの応答性(キャッシュの書き込み間隔)), 他のプロセスに割り込まれる前に同じデータを扱う確率が高くなるので, 負荷の増大の一部を抑制できる可能性がある.

ディスクの負荷を軽減(noatime)

ファイルアクセス時刻の記録を抑制するために, /etc/fstab内に noatime オプション付加する.

ディレクトリ参照を高速化(dir_index)

ext2/ext3 のディレクトリ エントリは, 線形リスト形式と, Bツリー形式がある. ディレクトリ内のファイルが多い場合, 線形リストよりも B ツリー形式を用いるとディレクトリの参照が高速化される.

現在の状態を見るには tune2fs -l する.

設定するには tune2fs で dir_index を有効にした後, e2fsck -D する. 解除するには tune2fs で ^dir_index で無効にした後, e2fsck -D する. 当然だが, 作業中は当該のデバイスのマウントを外す. 又は,書き込み禁止でマウント.

# tune2fs -l /dev/sda2
...略
Filesystem features: has_journal resize_inode filetype needs_recovery sparse_super large_file
...略
# umount /dev/sda2
# tune2fs -O dir_index /dev/sda2
# e2fsck -D /dev/sda2
# mount -a
# tune2fs -l /dev/sda2
...略
Filesystem features: has_journal resize_inode dir_index filetype needs_recovery sparse_super large_file

NFS スレッド数(/proc/fs/nfsd/threads)

同時接続数の必要数を見積もって, nfsd のスレッド数を増加させる. (デフォルトは 8) /proc/fs/nfsd/threads に与えるか, rpc.nfsd -- 150 のようにオプションで与えるが, 通常は RPCNFSDCOUNT=150 のように起動スクリプト(/etc/init.d/nfsd)で指定する.

数値を確認.

# cat /proc/fs/nfsd/threads

nfsd の起動後でも変更できる.

# echo 150 > /proc/fs/nfsd/threads

カーネル ファイルディスクリプタ数(file-max)

現在の値を確認.
# cat /proc/sys/fs/file-max
次のようにしてファイルデスクリプタの上限を設定する.
# echo "150000" > /proc/sys/fs/file-max
又は /etc/sysctl.conf に fs.file-max = 150000 を記述.

カーネル スレッド数(threads-max)

現在の値を確認.
# cat /proc/sys/kernel/threads-max
次のようにして上限を設定する.
# echo 50000 > /proc/sys/kernel/threads-max
又は /etc/sysctl.conf へ kernel.threads-max = 50000.

LDAP 同時接続数(slapd.conf, threads,concurrency)

同時接続数を必要な数に設定する. OpenLDAPの設定は、slapd.confで行う. threads (整数) で主スレッドプールの最大サイズを指定(デフォルトは 32). concurrency (整数) で並行処理の要求レベルを指定.

/etc/ldap/slapd.conf に以下の記述を追加.

threads    400
concurrency  350
netstat --tcp で接続の様子を見て調整する. netstat --tcp|wc で接続数を確認.

LDAP インデックスで高速化(slapd.conf, index)

良く使う属性は /etc/ldap/slapd.conf に index インデックスを指定し, DB に登録して検索性能を上げる. /etc/ldap/slapd.conf を編集する. デフォルトは, objectClass eq.
# slapd.conf (rootdn = o=example,c=JP)
index objectClass eq
検索キーとして頻繁に使用する属性(ユーザ情報の uid,uidNumber等)と, ほとんど使用しない属性(gecos等)がはっきりしている場合には, 検索キーにインデックスを作成しておくと検索速度が早くなる. indexは, pres:存在, eq:等価性, sub:部分文字列, から指定する. 例えば, mail属性にindexを設定する場合は, index mail pres,eq,sub と指定.

slapd.conf の設定を変更したら, indexの再構築(/usr/local/var/openldap-data/*.bdb)を行い, slapd を再起動する.

# /etc/init.d/slapd slapd stop
# /usr/local/sbin/slapindex -v
# /etc/init.d/slapd slapd start
デバッグ情報を標準エラーに出力するには, 次のようする.
/usr/sbin/slapd -f /etc/ldap/slapd.conf -d 255

Courier pop/imap 同時接続数(MAXPERIP)

Thunderbird で imap を使うとコネクションを多く張るため, 同時接続数の制限に抵触する場合がある. imap サーバの起動数も調整. /etc/courier-imap/imap を編集, courier-imap を再起動する.
#  Maximum number of IMAP servers started
MAXDAEMONS=200
#  Maximum number of connections to accept from the same IP address
MAXPERIP=50
netstat --tcp で接続の様子を確認する.

smtp/postfix 同時接続数

(postfix の負荷の調査とチューニング)

同時起動スレッド数を必要な数に設定する. (/etc/postfix/master.cf , /etc/postfix/main.cf, /proc/sys/kernel/threads-max )

smtp/postfix SPAM 対策

(postfix の SPAM 対策)

受信の遅延(/etc/postfix/main.cf) を適当に入れる. hop 数の遠いところからのアクセスだと, timeout の危険が増えるようだが...


Kodama's home / tips.