用sysctl調整linux內核選項
需求:
在我們的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=1
2.
臨時啟用某個設置,使用命令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," ",state[key]}"
當發現到達了net.ipv4.ip_local_port_range 所指定的上限,除了使用虛ip增加埠使用數量外,
可以對這個參數進行調優。設置參數
sysctl net.ipv4.tcp_tw_reuse=1
可以一定程度上緩解這種狀況。注意有些網上給出的選項還有net.ipv4.tcp_tw_recycle=1。但這個參數會產生額外的麻煩
在負載均衡的後端機中使用這個參數,會將負載均衡設備建立的多個連接請求當成同一個,從而使後建建立的連接斷開。(未測試…)
打開今日頭條,查看更多精彩圖片※監控管理之Spring Boot Admin使用
※PyQt5+ Python3 多線程通信
TAG:程序員小新人學習 |