您好,登錄后才能下訂單哦!
怎么進行linux內核參數優化,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
linux 內核參數優化 (2011-08-12 19:21) 分類: Linux SA+
Sysctl命令及linux內核參數調整 一、Sysctl命令用來配置與顯示在/proc/sys目錄中的內核參數.如果想使參數長期保存,可以通過編輯/etc/sysctl.conf文件來實現。 命令格式: sysctl [-n] [-e] -w variable=value sysctl [-n] [-e] -p (default /etc/sysctl.conf) sysctl [-n] [-e] –a 常用參數的意義: -w 臨時改變某個指定參數的值,如 # 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 二、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 三、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 # 具體功能:內網網卡是eth2,外網eth0,使得內網指定本服務做網關可以訪問外網 EXTERNAL="eth0" INTERNAL="eth2" # 這一步開啟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="eth2" #設定內網卡 # 這一步開啟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
關于怎么進行linux內核參數優化問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。