システムパフォーマンス入門

パフォーマンスに詳しいインフラに憧れて

ユーザ用ツール

サイト用ツール


· 最終更新: 2022/11/19 by kurihara


高負荷・大規模システムのLinuxカーネル・チューニング(/etc/sysctl.conf)

設定方法

確認

# sysctl -a

# sysctl -a |grep XXXXXX

変更

# vi /etc/sysctl.conf

vm.swappiness=0

# sysctl -p   <- 反映
  • RHEL7/CentOS7からは、/usr/lib/sysctl.d/00-system.confも使われる。


TCP(net)チューニング

TCPキープアライブ

  • ファイアウォールによる切断の防止
  • TCPハーフコネクション状態の解消(接続先が障害時に接続元だけESTABLISHEDで残る状態)
パラメータ 説明 設定値
net.ipv4.tcp_keepalive_time keepaliveのタイムアウト時間(秒)
キープアライブプローブが送信される時間
接続が使用されていない場合に、接続を生かしておくためにTCP keepaliveパケットを送信する頻度を指定します。
この値はkeepaliveが有効である場合にのみ使用します。
7200 (デフォルト )
7200秒 = 120分
60
net.ipv4.tcp_keepalive_intvl keepaliveのタイムアウト判定の再試行時間(秒)
相手からキープアライブ応答がなかった場合のキープアライブプローブの間隔
75(デフォルト )
3
net.ipv4.tcp_keepalive_probes keepaliveのタイムアウト判定のリトライ回数
キープアライブプローブの最大回数
9( デフォルト )
3
ディフォルト設定値では7200(秒)+75(秒)×9(回)の間はハーフコネクションの状態が続いてしまう。
2時間以上というのは長すぎるだろう。

FWで切断されてしまう場合は、tcp_keepalive_time関係やJavaの切断接続記述子にENABLED=BROKEN追加する

ポート枯渇対策

パラメータ 説明 設定値
net.ipv4.tcp_max_syn_backlog SYNに対するSYN/ACKの応答待ちに使うソケットの最大数
この数値を大きくすることによって、socketの枯渇を防ぐことができます。
128(デフォルト)
30720
net.ipv4.tcp_fin_timeout FINのタイムアウト時間(秒)
この数値を小さくすることによって、socketの枯渇を防ぐことができます。
60(デフォルト)
25
net.ipv4.ip_local_port_range クライアントとして使用できるローカルポートの範囲
デフォルトでは、32768 から 61000 までの 28232 個の中からランダムに選ばれたポート
この数値を変更することによって、サーバ発のポート枯渇を防ぐことができます。
32768 61000(デフォルト)
1024 65500

その他

パラメータ 説明 設定値
net.ipv6.conf.all.disable_ipv6
net.ipv6.conf.lo.disable_ipv6
net.ipv6.conf.default.disable_ipv6
IPv6周りの設定を有効にするかどうか
IPv6は使わない場合無効にしましょう。
例えば、snmpで取得できるTCPコネクション数はIPv6には対応していないので、おかしくなります。
0(デフォルト)
1 ※無効
net.netfilter.nf_conntrack_max ESTABLISHEDのリストの最大数(iptablesの管理数)
コネクションを保持できない事態を防ぐ
1048576
※1セッション350Bとし、メモリ1GB程度に抑える
net.nf_conntrack_max ESTABLISHEDのリストの最大数(OS側の管理数)
コネクションを保持できない事態を防ぐ
現在値の確認:wc -l /proc/net/nf_conntrack
1048576 ※1セッション350Bとし、メモリ1GB程度に抑える
net.core.somaxconn 接続(ソケット)キューの最大数
カーネルの処理能力以上のトラフィックが届いた場合にバッファをもたせる
30720
net.core.netdev_max_backlog パケット受信時にキューにつなぐことのできるパケットの最大数
カーネルの処理能力以上のトラフィックが届いた場合にバッファをもたせる
30720
net.netfilter.
nf_conntrack_tcp_timeout_established
ESTABLISHEDかつIDLE状態でRESETパケットを投げ、リストから消すまでの時間(秒)
無駄なコネクションは長い時間保持しない
2000


ファイル(fs)チューニング

パラメータ 説明 設定値
fs.file-max オープン可能なファイル数の上限 73494(default)
# cat /proc/sys/fs/file-nr
5594     2114     30000

1. 今までにオープンしたことのあるファイルの最大数
2. 現在オープンしているファイルの総数
3.  オープン可能なファイル数の上限(/proc/sys/fs/file-max)
パラメータ 説明 設定値
fs.aio-max-nr 非同期I/Oコンテキスト
Asynchronous I/O context
150000

超えると、io_setup システムコールの戻り値に EAGAIN が返される。

システム全体の予約可能な I/O 記述子の総数 (aio-max-nr) 
# cat /proc/sys/fs/aio-max-nr

すべてのプロセスで予約されている現在の記述子の数
# cat /proc/sys/fs/aio-nr


メモリ(vm)チューニング

パラメータ 説明 設定値
vm.swappiness 実メモリがある状態でスワップを使うかどうか
0にして、実メモリを使い切るまでスワップは使わせないようにしましょう。
30 (デフォルト)
0 ※無効
vm.max_map_count mmapやmalloc時にメモリを仮想空間にマッピングできる最大ページ数
マッピングできなくなる事態を防ぐ
65530 (デフォルト)
300000
vm.overcommit_memory 実メモリ以上にメモリをプロセスに割り当てるオーバーコミットを許すかどうか
OOM killerを発生させたくないので、2にしましょう。
0 (デフォルト)
2 ※無効
vm.overcommit_ratio 最大仮想メモリ領域 ※SWAP+(RSS*(この値/100)
物理メモリを超えない範囲で少し余裕を持たせる
95
vm.min_free_kbytes メモリのFREE領域の確保量
メモリ確保の容量を常にあけておく
524288
(524288/1024 = 512MB)


カーネル(kernel)チューニング

パラメータ 説明 設定値
kernel.threads-max システム全体での最大プロセス数 5782(default)
100000
kernel.pid_max pidの最大数
pidを枯渇させない
131072
kernel.panic_on_oops
kernel.panic
kernel.softlockup_panic
kernel.hung_task_panic
ハングアップ時にリブートさせるかどうか 1
ハングアップしたらリブートさせる


メモ

Dockerホストのパフォーマンスを引き出すTCPカーネルパラメータチューニング · tehepero note(・ω<) 2.0

https://blog.stormcat.io/post/entry/docker-tcp-kernel/

net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.core.netdev_max_backlog = 16384
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_tw_reuse = 1

OpenStackとLXCを導入した話 - mixi engineer blog

http://alpha.mixi.co.jp/entry/2014/12171/

LXCを使う上で気をつけること
多数のインスタンスを起動して、多数のプロセスやスレッドが生成されると、ホスト側のスレッド上限値に達したり、PIDが不足しやすいので注意が必要です。
kernel.threads-max
kernel.pid_max
vm.max_map_count
/etc/security/limits.d/90-nproc.conf
の制限値を unlimited にしておくと安心です


参考




関連ページ


· 最終更新: 2022/11/19 by kurihara

ページ用ツール