centos7優化內核參數詳解

1、Sysctl命令用來配置與顯示在/proc/sys目錄中的內核參數.若是想使參數長期保存,能夠經過編輯/etc/sysctl.conf文件來實現。linux

 

 命令格式:緩存

 sysctl [-n] [-e] -w variable=value服務器

 sysctl [-n] [-e] -p (default /etc/sysctl.conf)cookie

 sysctl [-n] [-e] –a網絡

 

經常使用參數的意義:socket

 -w  臨時改變某個指定參數的值,如tcp

        # sysctl -w net.ipv4.ip_forward=1編輯器

 -a  顯示全部的系統參數工具

 -p從指定的文件加載系統參數,默認從/etc/sysctl.conf 文件中加載,如:性能

# echo 1 > /proc/sys/net/ipv4/ip_forward

# sysctl -w net.ipv4.ip_forward=1

 以上兩種方法均可能當即開啓路由功能,但若是系統重啓,或執行了

     # service network restart

命令,所設置的值即會丟失,若是想永久保留配置,能夠修改/etc/sysctl.conf文件,將 net.ipv4.ip_forward=0改成net.ipv4.ip_forward=1

 

 

2、linux內核參數調整:linux 內核參數調整有兩種方式

 

方法一:修改/proc下內核參數文件內容,不能使用編輯器來修改內核參數文件,理由是因爲內核隨時可能更改這些文件中的任意一個,另外,這些內核參數文件都是虛擬文件,實際中不存在,所以不能使用編輯器進行編輯,而是使用echo命令,而後從命令行將輸出重定向至 /proc 下所選定的文件中。如:將 timeout_timewait 參數設置爲30秒:

# echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout

參數修改後當即生效,可是重啓系統後,該參數又恢復成默認值。所以,想永久更改內核參數,須要修改/etc/sysctl.conf文件

 

   方法二.修改/etc/sysctl.conf文件。檢查sysctl.conf文件,若是已經包含須要修改的參數,則修改該參數的值,若是沒有須要修改的參數,在sysctl.conf文件中添加參數。如:

   net.ipv4.tcp_fin_timeout=30

保存退出後,能夠重啓機器使參數生效,若是想使參數立刻生效,也能夠執行以下命令:

   # sysctl  -p

 

3、sysctl.conf 文件中參數設置及說明

proc/sys/net/core/wmem_max

最大socket寫buffer,可參考的優化值:873200

 

/proc/sys/net/core/rmem_max 

最大socket讀buffer,可參考的優化值:873200

/proc/sys/net/ipv4/tcp_wmem 

TCP寫buffer,可參考的優化值: 8192 436600 873200

 

/proc/sys/net/ipv4/tcp_rmem 

TCP讀buffer,可參考的優化值: 32768 436600 873200

 

/proc/sys/net/ipv4/tcp_mem 

一樣有3個值,意思是: 

net.ipv4.tcp_mem[0]:低於此值,TCP沒有內存壓力. 

net.ipv4.tcp_mem[1]:在此值下,進入內存壓力階段. 

net.ipv4.tcp_mem[2]:高於此值,TCP拒絕分配socket. 

上述內存單位是頁,而不是字節.可參考的優化值是:786432 1048576 1572864

 

/proc/sys/net/core/netdev_max_backlog 

進入包的最大設備隊列.默認是300,對重負載服務器而言,該值過低,可調整到1000

 

/proc/sys/net/core/somaxconn 

listen()的默認參數,掛起請求的最大數量.默認是128.對繁忙的服務器,增長該值有助於網絡性能.可調整到256.

 

/proc/sys/net/core/optmem_max 

socket buffer的最大初始化值,默認10K

 

/proc/sys/net/ipv4/tcp_max_syn_backlog 

進入SYN包的最大請求隊列.默認1024.對重負載服務器,可調整到2048

 

/proc/sys/net/ipv4/tcp_retries2 

TCP失敗重傳次數,默認值15,意味着重傳15次才完全放棄.可減小到5,儘早釋放內核資源.

 

/proc/sys/net/ipv4/tcp_keepalive_time 

/proc/sys/net/ipv4/tcp_keepalive_intvl 

/proc/sys/net/ipv4/tcp_keepalive_probes 

這3個參數與TCP KeepAlive有關.默認值是: 

tcp_keepalive_time = 7200 seconds (2 hours) 

tcp_keepalive_probes = 9 

tcp_keepalive_intvl = 75 seconds 

意思是若是某個TCP鏈接在idle 2個小時後,內核才發起probe.若是probe 9次(每次75秒)不成功,內核才完全放棄,認爲該鏈接已失效.對服務器而言,顯然上述值太大. 可調整到: 

/proc/sys/net/ipv4/tcp_keepalive_time 1800 

/proc/sys/net/ipv4/tcp_keepalive_intvl 30 

/proc/sys/net/ipv4/tcp_keepalive_probes 3

 

/proc/sys/net/ipv4/ip_local_port_range 

指定端口範圍的一個配置,默認是32768 61000,已夠大.

net.ipv4.tcp_syncookies = 1 

表示開啓SYN Cookies。當出現SYN等待隊列溢出時,啓用cookies來處理,可防範少許SYN攻擊,默認爲0,表示關閉;

 

net.ipv4.tcp_tw_reuse = 1 

表示開啓重用。容許將TIME-WAIT sockets從新用於新的TCP鏈接,默認爲0,表示關閉;

 

net.ipv4.tcp_tw_recycle = 1 

表示開啓TCP鏈接中TIME-WAIT sockets的快速回收,默認爲0,表示關閉。

 

net.ipv4.tcp_fin_timeout = 30 

表示若是套接字由本端要求關閉,這個參數決定了它保持在FIN-WAIT-2狀態的時間。

 

net.ipv4.tcp_keepalive_time = 1200 

表示當keepalive起用的時候,TCP發送keepalive消息的頻度。缺省是2小時,改成20分鐘。

 

net.ipv4.ip_local_port_range = 1024 65000 

表示用於向外鏈接的端口範圍。缺省狀況下很小:32768到61000,改成1024到65000。

 

net.ipv4.tcp_max_syn_backlog = 8192 

表示SYN隊列的長度,默認爲1024,加大隊列長度爲8192,能夠容納更多等待鏈接的網絡鏈接數。

 

net.ipv4.tcp_max_tw_buckets = 5000 

表示系統同時保持TIME_WAIT套接字的最大數量,若是超過這個數字,TIME_WAIT套接字將馬上被清除並打印警告信息。默認爲 180000,改成 5000。對於Apache、Nginx等服務器,上幾行的參數能夠很好地減小TIME_WAIT套接字數量,可是對於Squid,效果卻不大。此項參數能夠控制TIME_WAIT套接字的最大數量,避免Squid服務器被大量的TIME_WAIT套接字拖死。

 

 

 

 

Linux上的NAT與iptables

談起Linux上的NAT,大多數人會跟你提到iptables。緣由是由於iptables是目前在linux上實現NAT的一個很是好的接口。它經過和內核級直接操做網絡包,效率和穩定性都很是高。這裏簡單列舉一些NAT相關的iptables實例命令,可能對於大多數實現有多幫助。

 這裏說明一下,爲了節省篇幅,這裏把準備工做的命令略去了,僅僅列出核心步驟命令,因此若是你單單執行這些沒有實現功能的話,極可能因爲準備工做沒有作好。若是你對整個命令細節感興趣的話,能夠直接訪問個人《如何讓你的Linux網關更強大》系列文章,其中對於各個腳本有詳細的說明和描述。

# 案例1:實現網關的MASQUERADE

# 具體功能:內網網卡是eth1,外網eth0,使得內網指定本服務作網關能夠訪問外網

 

EXTERNAL="eth0"

INTERNAL="eth1"

 

# 這一步開啓ip轉發支持,這是NAT實現的前提

echo 1 > /proc/sys/net/ipv4/ip_forward

iptables -t nat -A POSTROUTING -o $EXTERNAL -j MASQUERADE

# 案例2:實現網關的簡單端口映射

# 具體功能:實現外網經過訪問網關的外部ip:80,能夠直接達到訪問私有網絡內的一臺主機192.168.1.10:80效果

 

LOCAL_EX_IP=11.22.33.44 #設定網關的外網卡ip,對於多ip狀況,參考《如何讓你的Linux網關更強大》系列文章

LOCAL_IN_IP=192.168.1.1  #設定網關的內網卡ip

INTERNAL="eth1" #設定內網卡

 

# 這一步開啓ip轉發支持,這是NAT實現的前提

echo 1 > /proc/sys/net/ipv4/ip_forward

 

# 加載須要的ip模塊,下面兩個是ftp相關的模塊,若是有其餘特殊需求,也須要加進來

modprobe ip_conntrack_ftp

modprobe ip_nat_ftp

 

# 這一步實現目標地址指向網關外部ip:80的訪問都吧目標地址改爲192.168.1.10:80

iptables -t nat -A PREROUTING -d $LOCAL_EX_IP -p tcp --dport 80 -j DNAT --to 192.168.1.10

 

# 這一步實現把目標地址指向192.168.1.10:80的數據包的源地址改爲網關本身的本地ip,這裏是192.168.1.1

iptables -t nat -A POSTROUTING -d 192.168.1.10 -p tcp --dport 80 -j SNAT --to $LOCAL_IN_IP

 

# 在FORWARD鏈上添加到192.168.1.10:80的容許,不然不能實現轉發

iptables -A FORWARD -o $INTERNAL -d 192.168.1.10 -p tcp --dport 80 -j ACCEPT

 

# 經過上面重要的三句話以後,實現的效果是,經過網關的外網ip:80訪問,所有轉發到內網的192.168.1.10:80端口,實現典型的端口映射

# 特別注意,全部被轉發過的數據都是源地址是網關內網ip的數據包,因此192.168.1.10上看到的全部訪問都好像是網關發過來的同樣,而看不到外部ip

# 一個重要的思想:數據包根據「從哪裏來,回哪裏去」的策略來走,因此沒必要擔憂回頭數據的問題

 

# 如今還有一個問題,網關本身訪問本身的外網ip:80,是不會被NAT到192.168.1.10的,這不是一個嚴重的問題,但讓人很不爽,解決的方法以下:

iptables -t nat -A OUTPUT -d $LOCAL_EX_IP -p tcp --dport 80 -j DNAT --to 192.168.1.10

獲取系統中的NAT信息和診斷錯誤

瞭解/proc目錄的意義

在Linux系統中,/proc是一個特殊的目錄,proc文件系統是一個僞文件系統,它只存在內存當中,而不佔用外存空間。它包含當前系統的一些參數(variables)和狀態(status)狀況。它以文件系統的方式爲訪問系統內核數據的操做提供接口

經過/proc能夠了解到系統當前的一些重要信息,包括磁盤使用狀況,內存使用情況,硬件信息,網絡使用狀況等等,不少系統監控工具(如HotSaNIC)都經過/proc目錄獲取系統數據。

另外一方面經過直接操做/proc中的參數能夠實現系統內核參數的調節,好比是否容許ip轉發,syn-cookie是否打開,tcp超時時間等。

得到參數的方式:

第一種:cat /proc/xxx/xxx,如 cat /proc/sys/net/ipv4/conf/all/rp_filter

第二種:sysctl xxx.xxx.xxx,如 sysctl net.ipv4.conf.all.rp_filter

改變參數的方式:

第一種:echo value > /proc/xxx/xxx,如 echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter

第二種:sysctl [-w] variable=value,如 sysctl [-w] net.ipv4.conf.all.rp_filter=1

以上設定系統參數的方式只對當前系統有效,重起系統就沒了,想要保存下來,須要寫入/etc/sysctl.conf文件中

經過執行 man 5 proc能夠得到一些關於proc目錄的介紹

查看系統中的NAT狀況

和NAT相關的系統變量

/proc/slabinfo:內核緩存使用狀況統計信息(Kernel slab allocator statistics)

/proc/sys/net/ipv4/ip_conntrack_max:系統支持的最大ipv4鏈接數,默認65536(事實上這也是理論最大值)

/proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established 已創建的tcp鏈接的超時時間,默認432000,也就是5天

和NAT相關的狀態值

/proc/net/ip_conntrack:當前的前被跟蹤的鏈接情況,nat翻譯表就在這裏體現(對於一個網關爲主要功能的Linux主機,裏面大部分信息是NAT翻譯表)

/proc/sys/net/ipv4/ip_local_port_range:本地開放端口範圍,這個範圍一樣會間接限制NAT表規模

# 1. 查看當前系統支持的最大鏈接數

cat /proc/sys/net/ipv4/ip_conntrack_max 

# 值:默認65536,同時這個值和你的內存大小有關,若是內存128M,這個值最大8192,1G以上內存這個值都是默認65536

# 影響:這個值決定了你做爲NAT網關的工做能力上限,全部局域網內經過這臺網關對外的鏈接都將佔用一個鏈接,若是這個值過低,將會影響吞吐量

 

# 2. 查看tcp鏈接超時時間

cat /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established 

# 值:默認432000(秒),也就是5天

# 影響:這個值過大將致使一些可能已經不用的鏈接常駐於內存中,佔用大量連接資源,從而可能致使NAT ip_conntrack: table full的問題

# 建議:對於NAT負載相對本機的 NAT表大小很緊張的時候,可能須要考慮縮小這個值,以儘早清除鏈接,保證有可用的鏈接資源;若是不緊張,沒必要修改

 

# 3. 查看NAT表使用狀況(判斷NAT表資源是否緊張)

# 執行下面的命令能夠查看你的網關中NAT表狀況

cat /proc/net/ip_conntrack

 

# 4. 查看本地開放端口的範圍

cat /proc/sys/net/ipv4/ip_local_port_range

# 返回兩個值,最小值和最大值

 

# 下面的命令幫你明確一下NAT表的規模

wc -l /proc/net/ip_conntrack

#或者

grep ip_conntrack /proc/slabinfo | grep -v expect | awk '{print $1 ',' $2;}'

 

# 下面的命令幫你明確可用的NAT表項,若是這個值比較大,那就說明NAT表資源不緊張

grep ip_conntrack /proc/slabinfo | grep -v expect | awk '{print $1 ',' $3;}'

 

# 下面的命令幫你統計NAT表中佔用端口最多的幾個ip,頗有可能這些傢伙再作一些bt的事情,嗯bt的事情:-)

cat /proc/net/ip_conntrack | cut -d ' ' -f 10 | cut -d '=' -f 2 | sort | uniq -c | sort -nr | head -n 10

# 上面這個命令有點瑕疵cut -d' ' -f10會由於命令輸出有些行缺項而形成統計誤差,下面給出一個正確的寫法:

cat /proc/net/ip_conntrack | perl -pe s/^.∗?.∗? src/src/g | cut -d ' ' -f1 | cut -d '=' -f2 | sort | uniq -c | sort -nr | head -n 10

相關文章
相關標籤/搜索