Linux核心調優

2021-09-02 22:41:18 字數 4317 閱讀 5919

專案出現socket連線超時和管道斷開連線

檢查nginx, nginx報錯

recv() failed (104: connection reset by peer) while reading response header from upstrea
錯誤日誌表示:

(1)伺服器的併發連線數超過了其承載量,伺服器會將其中一些連線down掉; (2)客戶關掉了瀏覽器,而伺服器還在給客戶端傳送資料; (3)瀏覽器端按了stop

檢視linux最大連線數

ulimit -a
檢視web伺服器(nginx apache)的併發請求數及其tcp連線狀態: 

netstat -n | awk '/^tcp/  end '

#或者:

ps -ef|grep httpd|wc -l

檢視系統日誌

tail -f /var/log/messages
dec 10 11:31:36 localhost kernel: tcp: time wait bucket table overflow

dec 10 11:31:36 localhost kernel: tcp: time wait bucket table overflow

dec 10 11:31:36 localhost kernel: tcp: time wait bucket table overflow

dec 10 11:31:36 localhost kernel: tcp: time wait bucket table overflow

dec 10 11:31:36 localhost kernel: tcp: time wait bucket table overflow

dec 10 11:31:41 localhost kernel: __ratelimit: 2039 callbacks suppressed

dec 10 11:31:41 localhost kernel: tcp: time wait bucket table overflow

dec 10 11:31:41 localhost kernel: tcp: time wait bucket table overflow

dec 10 11:31:41 localhost kernel: tcp: time wait bucket table overflow

dec 10 11:31:41 localhost kernel: tcp: time wait bucket table overflow

dec 10 11:31:41 localhost kernel: tcp: time wait bucket table overflow

原理:

kernel 用 ip_conntrack 模組來記錄 iptables 網路包的狀態,並儲存到 table 裡(/proc/net/ip_conntrack|/proc/net/nf_conntrack),

如果網路狀況繁忙,比如高連線,高併發連線等會導致逐步占用這個 table 可用空間,

一般這個 table 很大不容易佔滿並且可以自己清理,table 的記錄會一直呆在 table 裡占用空間直到源 ip 發乙個 rst 包,

但是如果出現被攻擊、錯誤的網路配置、有問題的路由/路由器、有問題的網絡卡等情況的時候,就會導致源 ip 發的這個 rst 包收不到,

這樣就積累在 table 裡,越積累越多直到佔滿,滿了以後 iptables 就會丟包,出現外部無法連線伺服器的情況。 

知道問題就好辦了,要麼增加 table 容量以便能記錄更多的連線資訊(會消耗一點記憶體),要麼就解除安裝 ip_conntrack 模組。

1.檢視當前tcp time_wait連線數

netstat -an | grep time_wait | wc -l
6880

2.檢視time wait bucket設定

cat /proc/sys/net/ipv4/tcp_max_tw_buckets
5000

顯然time_wait數量已經超出了設定值(5000)。

解決辦法:增加table容量

優化linux核心引數

vim  /etc/sysctl.conf

# 關閉路由**

net.ipv4.ip_forward = 0

# 開啟反向路徑過濾

net.ipv4.conf.all.rp_filter= 1

net.ipv4.conf.default.rp_filter = 1

# 處理無源路由的包

net.ipv4.conf.all.accept_source_route = 0

net.ipv4.conf.default.accept_source_route = 0

kernel.sysrq = 0

kernel.core_uses_pid = 1

kernel.msgmnb = 65536

kernel.msgmax = 65536

kernel.shmmax = 68719476736

kernel.shmall = 4294967296

# ttl

net.ipv4.ip_default_ttl = 64

# 核心panic時,1s後自動重啟

kernel.panic = 1

# 允許更多的pids

kernel.pid_max = 32768

# 應對ddos攻擊,tcp連線建立設定

net.ipv4.tcp_syncookies = 1

net.ipv4.tcp_synack_retries = 1

net.ipv4.tcp_syn_retries = 1

net.ipv4.tcp_max_syn_backlog = 262144

# 應對timewait過高,tcp連線斷開設定

net.ipv4.tcp_max_tw_buckets = 6000

net.ipv4.tcp_tw_recycle = 1

net.ipv4.tcp_tw_reuse = 0

net.ipv4.tcp_timestamps = 0

net.ipv4.tcp_fin_timeout = 10

net.ipv4.ip_local_port_range = 10000 65000

# 記憶體資源使用相關設定

net.core.wmem_default = 8388608

net.core.rmem_default = 8388608

net.core.rmem_max = 16777216

net.core.wmem_max = 16777216

net.ipv4.tcp_rmem = 4096 87380 4194304

net.ipv4.tcp_wmem = 4096 16384 4194304

net.ipv4.tcp_mem = 94500000 915000000 927000000

# tcp keepalived連線設定

net.ipv4.tcp_keepalive_time = 30

net.ipv4.tcp_keepalive_intvl = 15

net.ipv4.tcp_keepalive_probes = 5

# 其他tcp相關引數調節

net.core.somaxconn = 262144

net.core.netdev_max_backlog = 262144

net.ipv4.tcp_max_orphans = 3276800

net.ipv4.tcp_sack = 1

net.ipv4.tcp_window_scaling = 1

# 生效

/sbin/sysctl -p

完成後專案沒再報連線超時或者管道斷開.. 

但是系統日誌裡還會有這個日誌,一分鐘一條.. 

dec 10 15:06:18 localhost kernel: possible syn flooding on port 7012. sending cookies.

dec 10 15:07:20 localhost kernel: possible syn flooding on port 7012. sending cookies.

感謝:

linux 核心調優

設定linux核心引數 配置 linux 核心引數 2種方法 修改後不用重啟動更新 sbin sysctl p 第一種 開啟 etc sysctl.conf 複製如下內容 kernel.shmall 2097152 kernel.shmmax 2147483648 kernel.shmmni 409...

Linux 核心調優

以nginx 10k併發連線為優化目標,附簡單介紹,不一一解釋。一 tcp容量規劃 net.ipv4.tcp mem 262144 524288 786432 net.core.wmem max 16777216 net.core.wmem default 131072 net.core.rmem ...

LINUX 核心調優

由於tcp協議缺陷被惡意利用syn flood攻擊,linux核心調整這些引數可緩解這類攻擊 net.ipv4.tcp syncookies 1 啟用syncookies net.ipv4.tcp max syn backlog 8192 syn佇列長度 net.ipv4.tcp synack re...