20121022 用sysctl調整linux核心選項
阿新 • • 發佈:2018-12-21
需求:在我們的dlna程式執行期間,發現有丟包的現象,有的NOTIFY包丟失,有的M-SEARCH包丟失。更極端的是,有次使用電信msm7627a手機,通過抓包,在出現了3此NOTIFY之後,M-SEARCH一直都沒有出現。而通常情況下,兩個廣播包在開始是交替出現的。這樣,就導致這款只能傳送廣播不能接收廣播的手機一直不能發現其他裝置。還有一次丟包的例子,是使用HTC的一款手機。這塊手機也是屬於只能傳送廣播不能接收廣播的情況。大概過了九分鐘才發現裝置,很顯然是漏掉了一次。當時還進一步確認兩個數值在不同的終端是不是固定的。最終確認為固定值。為了確定在哪一層丟包,想到了sysctl工具。sysctl是一個允許您改變正在執行中的Linux系統的介面。它包含一些 TCP/IP 堆疊和虛擬記憶體系統的高階選項, 這可以讓有經驗的管理員提高引人注目的系統性能。並且,sysctl可以在不用重啟系統的情況下是設定生效。用sysctl可以讀取設定超過五百個系統變數。基於這點,sysctl(8) 提供兩個功能:讀取和修改系統設定。檢視所有可讀變數:sysctl -a選取其中部分可讀變數檢視:sysctl -a | grep port經過使用該工具分析,在裝有ubuntu系統的PC上,XBMC執行期間(只有dms和dmr,沒有dmc),選項的改變不能影響到廣播的接收或者傳送,即系統該怎麼執行還是怎麼執行,在這個層次上不能擷取廣播包。下面是具體步驟:step 1.備份/etc/sysctl.conf檔案step 2.修改/etc/sysctl.conf檔案step 3.執行sysctl -p使你修改的引數生效。===================下面是一些設定:1.Enable ignoring broadcasts request:net.ipv4.icmp_echo_ignore_broadcasts=12.臨時啟用某個設定,使用命令sysctl -w ~例如:sysctl -w net.ipv4.ip_forward=1在系統重啟,或者執行了service network restart後,所設定的值就會丟失。3.用於向外連線的埠範圍:net.ipv4.ip_local_port_range =8000 65535客戶端測試併發連線超過一定數量時候,出現埠號耗盡情況,尤其被大量TIME_WAIT佔用。使用如下命令檢視佔用情況。其上限是net.ipv4.ip_local_port_range 所指定的區間內的埠總數。netstat -an | awk '/^tcp/ {++state[$6]} END {for (key in state) print key,"\t",state[key]}'當發現到達了net.ipv4.ip_local_port_range 所指定的上限,除了使用虛ip增加埠使用數量外,可以對這個引數進行調優。設定引數sysctl net.ipv4.tcp_tw_reuse=1可以一定程度上緩解這種狀況。注意有些網上給出的選項還有net.ipv4.tcp_tw_recycle=1。但這個引數會產生額外的麻煩在負載均衡的後端機中使用這個引數,會將負載均衡裝置建立的多個連線請求當成同一個,從而使後建建立的連線斷開。(未測試…)