CentOS
kernel

以前会社で使っていたsysctlとさらに改良

私が商用に作った環境で入れていた設定。
全部自分で調べて設定したため
参考にしたサイトも含め公開します。
CentOS6を想定。
それ以降は別途カーネル3.0以降の機能を見てください。

sysctl以外の設定は
CentOSユーザがUbuntu16.04にMySQL構築してドツボにはまる(徹底チューニング編)
を参考にしてください

サーバ関係なくいれる設定

IPv6無効

# How do I disable IPv6? - FAQ/CentOS6 - CentOS Wiki

net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

極力スワップさせない

# OOM relation to vm.swappiness=0 in new kernel; kills MySQL server process

vm.swappiness = 1

kernel4.6からは0で問題ないかもしれないが未調査

メモリの使用量制御をコントロールする

# About vm.overcommit_memory

vm.overcommit_memory=1

きちんと制御できるなら1がベスト
複数アプリが稼働しているなら2にせざるを得ない

TCP再送回数

# ウェブ広告のインフラについて(第5回) LinuxのTCP再送アルゴリズムとモバイルネットワークの相性の悪さ | 多脚.com

net.ipv4.tcp_orphan_retries = 3

keepalive先の通信状況確認

# High Performance Browser Networking - 愛と勇気と缶ビール

net.ipv4.tcp_slow_start_after_idle = 0

SYN Flood攻撃対策

# listen backlog 【3.6】 - Linuxカーネルメモ

net.ipv4.tcp_syncookies = 1

相手がいないのにESTABLISHEDになる

# 相手がいないのに ESTABLISHED になってる TCP ポート - @tmtms のメモ

net.ipv4.tcp_abort_on_overflow=1

TCPのオプションを無効

# net.ipv4.tcp_tw_recycle は廃止されました ― その危険性を理解する
net.ipv4.tcp_tw_recyclは4.12から廃止

net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0

Oracleの設定がいいんじゃないかとそのまま入れた部分

# Installing the Oracle Database Software

kernel.sem = 250 32000 100 128
net.core.rmem_default = 4194304
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
fs.aio-max-nr = 1048576
fs.file-max = 681574

NoSQLや1Gbps以上のトラフィックがあるならCassandraをベースに

# Recommended production settings for Apache Cassandra

net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.rmem_default = 16777216
net.core.wmem_default = 16777216
net.core.optmem_max = 40960
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
vm.max_map_count = 1048575

その他設定

# @IT:Linuxでは表示できないWebサイトがある

net.ipv4.tcp_ecn = 1

# あまり知られていない設定 - Linux Advanced Routing & Traffic Control HOWTO

net.ipv4.tcp_rfc1337 = 1

# Linux におけるソケット機能の向上

net.ipv4.tcp_sack = 1
net.ipv4.tcp_fack = 1

送信用TCPポート範囲

#NAT、リバースプロクシ用
#net.ipv4.ip_local_port_range = 1024 65000

サーバの種類で変えた方がいい設定

TCP再送回数の設定

フェイルオーバーのかかる時間で設計、
フェイルオーバーしなくていいなら2回までとする。
# LinuxのTCP SYNの再送間隔の初期値が3秒から1秒に変更されていた - 元RX-7乗りの適当な日々

net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_synack_retries = 2

KEEPALIVEの設定

# CLOSE_WAITのセッションを早く消す方法 – Hiro Fukami's Blog

#フロント用サーバ(PC)
#net.ipv4.tcp_keepalive_time = 5
#net.ipv4.tcp_keepalive_intvl = 2
#net.ipv4.tcp_keepalive_probes = 5

#フロント用サーバ(mobile)
#net.ipv4.tcp_keepalive_time = 10
#net.ipv4.tcp_keepalive_intvl = 2
#net.ipv4.tcp_keepalive_probes = 10

#それ以外のサーバ
#net.ipv4.tcp_keepalive_time = 60
#net.ipv4.tcp_keepalive_intvl = 2
#net.ipv4.tcp_keepalive_probes = 60

FINで強制的に接続を切る

# ぜんぶTIME_WAITのせいだ! - Qiita

net.ipv4.tcp_fin_timeout = 30

高負荷時の動作安定

# DSAS開発者の部屋:高負荷サイトのボトルネックを見つけるには
# LinuxのTCP/IPの実装について調べてみた - nyantの日記

net.core.netdev_max_backlog = 4096
net.core.somaxconn = 4096
net.ipv4.tcp_max_syn_backlog = 4096

スループット重視(未検証)

# Linux におけるソケット機能の向上

net.ipv4.tcp_low_latency = 0

ディスク性能で変わるミドルウェアの場合いじると効果がある(未検証)

# Better Linux Disk Caching & Performance with vm.dirty_ratio

#vm.dirty_background_ratio = 5
#vm.dirty_ratio = 80