關于ip_conntrack跟蹤連接滿導致網絡丟包問題的分析

http://ixdba.blog.51cto.com/2895551/1737642

我們的線上web服務器在訪問量很大時,就會出現網絡連接丟包的問題,通過dmesg命令查看日志,發現如下信息:

kernel: ip_conntrack: table full, dropping packet.kernel: printk: 1 messages suppressed.kernel: ip_conntrack: table full, dropping packet.kernel: printk: 2 messages suppressed.kernel: ip_conntrack: table full, dropping packet.

這里面關鍵的信息是"ip_conntrack: table full, dropping packet",從這里可以判斷出這跟iptables有關系了,因為iptables防火墻使用了ip_conntrack內核模塊實現連接跟蹤功能,所有的進出數據包都會記錄在連接跟蹤表中,包括tcp,udp,icmp等,一旦連接跟蹤表被填滿以后,就會發生丟包,導致網絡不穩定。

而我們的服務器確實打開了iptables防火墻,并且都是在網站流量非常高的時候經常會出現這個問題。這個問題的原因是由于web服務器收到了大量的連接,在啟用了iptables的情況下,iptables會把所有的連接都做鏈接跟蹤處理,這樣iptables就會有一個鏈接跟蹤表,當這個表滿的時候,就會出現上面的錯誤。

iptables的鏈接跟蹤表最大容量配置文件如下:

centos5 netfilter 參數配置文件:

/proc/sys/net/ipv4/netfilter/ip_conntrack_max或者/proc/sys/net/ipv4/ip_conntrack_max

centos6 netfilter 參數配置文件:

/proc/sys/net/netfilter/nf_conntrack_max

由于nf_conntrack 工作在3層,支持IPv4和IPv6,而ip_conntrack只支持IPv4,因此nf_conntrack模塊在Linux的2.6.15內核中被引入,而ip_conntrack在Linux的2.6.22內核被移除(centos6.x版本),因此不同版本的系統,配置文件也就不盡相同了。目前大多的ip_conntrack_*已被 nf_conntrack_* 取代,很多ip_conntrack_*僅僅是個軟鏈接,原先的ip_conntrack配置目錄/proc/sys/net/ipv4/netfilter/ 仍然存在,但是新的nf_conntrack在/proc/sys/net/netfilter/中,這樣做是為了能夠向下的兼容。

了解了配置文件的變化后,我們看看這個問題該如何解決,解?方法一般有兩個:

1、調整 /proc/ 下面的參數

可以增大適當conntrack 的條目,在CentOS5/RHEL 5下:

(1)運行

sysctl -w net.ipv4.netfilter.ip_conntrack_max=655360

(2).在 /etc/sysctl.conf 中加入:

net.ipv4.netfilter.ip_conntrack_max = 655360

(3).使其生效

sysctl -p

在CentOS 6 /RHEL6下:

(1)運行

sysctl -w net.nf_conntrack_max=100000

(2)在 /etc/sysctl.conf 中加入:

net.nf_conntrack_max = 100000

(3)使其生效

sysctl -p

2、不使用ip_conntrack模塊

在CentOS5/RHEL 5下:

不使用ip_conntrack,需要移除state模塊,因為使用該模塊需要加載ip_conntrack。確保iptables規則中沒有出現類似state模塊的規則,如果有的話將其移除:

然后注釋 /etc/sysconfig/iptables-config 中的:

IPTABLES_MODULES="ip_conntrack_netbios_ns"

最后移除ip_conntrack模塊:

[root@waiwei ipv4]#  modprobe -r ip_conntrack_netbios_ns xt_state

在CentOS6/RHEL6下:

[root@waiwei ipv4]#  modprobe -r nf_conntrack_ipv4 xt_state
[root@waiwei ipv4]#  modprobe -r nf_conntrack

現在 /proc/net/ 下面應該沒有nf_conntrack了。

兩種方法中,第一種簡單,但是治標不治本,第二種稍微麻煩,但是畢竟使用,大家可根據情況進行選擇。

原創文章,作者:Net 20-北京自由鳥,如若轉載,請注明出處:http://www.www58058.com/17451

(2)
Net 20-北京自由鳥Net 20-北京自由鳥
上一篇 2016-06-03 12:45
下一篇 2016-06-03 14:25

相關推薦

  • screen和ehco命令常用選項

    screen的用法 screen 是個外部命令,用之前需要安裝。      安裝方式之一:yum 源 安裝      yum install -y screen screen 是基于VT100/ANSI的仿真終端屏幕管理器    …

    Linux干貨 2016-07-26
  • 推薦-VSftpd使用MySQL存儲虛擬用戶進行認證

    VSftpd使用MySQL存儲虛擬用戶進行認證 VSftpd使用MySQL存儲虛擬用戶進行認證 前言 實驗拓撲 實驗環境 實驗步驟 安裝vsftpd并測試 安裝MySQL并創建對應用戶和表 配置vsftpd基于MySQL表的虛擬用戶 測試 測試tom用戶的權限 測試anyisalin用戶的權限 總結 前言 周一的時候做這個實驗失敗了,當時以為是pam_mys…

    Linux干貨 2016-04-04
  • 【推薦】Linux 簡單部署LAMP

    Linux 簡單部署LAMP: 實驗環境: 1、主機系統Centos6.7_X86_64 2、DNS&CA:192.168.3.10 3、LAMP安裝方式為rpm 4、主機IP:192.168.3.11提供web站點:     http://wp.neolinux.com     &nbsp…

    Linux干貨 2016-06-22
  • 緩存需知

    Edit Web緩存核心技術點需知 5.1 HTTP首部控制 5.2 基于新鮮度檢測機制: 2.1 特征1:時間局部性 2.2 特征2:空間局部性 2.3 緩存的優點 2.4 哪類數據應該被緩存 2.5 哪類數據可緩存但不應該被緩存 2.6 緩存命中率決定緩存有效性 2.7 緩存數據生命周期 2.8 緩存處理步驟 2.9 緩存和普通數據讀取的區別 1. 完整…

    Linux干貨 2017-06-01
  • OpenSSL 的使用

    OpenSSL 是一個開源項目,其組成主要包括一下三個組件:     openssl:多用途的命令行工具     libcrypto:加密算法庫     libssl:加密模塊應用庫,實現了ssl及tls openssl可以實現:秘鑰證書管…

    Linux干貨 2017-06-07
  • 進程查看及管理

        在Linux系統中,觸發任意一個事件時,系統都會將它定義為一個進程,并且給予這個進程一個ID,稱為PID,同時依據觸發這個進程與用戶相關的屬性關系,給予這個PID一組有效的權限設置。 進程(Process)是計算機中的程序關于某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操作系統結構的基礎。…

    Linux干貨 2016-11-27
欧美性久久久久