專案出現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...