調諧LINUX網路效能之調諧方法概述(轉)

ba發表於2007-08-16
調諧LINUX網路效能之調諧方法概述(轉)[@more@]在《調諧LINUX網路效能之除錯工具篇》和《調諧LINUX網路效能之網路配置檔案詳解》兩篇文章中,我們介紹了route、netstat、tcpdump三種網路調諧測試工具的使用方法及其可實現的功能和網路配置檔案的內容,本文我們將從實戰的角度介紹網路效能調諧的方法。

下面,我們先來介紹網路效能調諧的第一種方法:服務方式選擇。


服務方式選擇
網路伺服器由於要同時為多個客戶提供服務,就必須使用某種方式來支援這種多工的服務方式。一般情況下可以有三種方式來選擇,多程式方式、多執行緒方式及非同步方式。其中,多程式方式中伺服器對一個客戶要使用一個程式來提供服務,由於在作業系統中,生成一個程式需要程式記憶體複製等額外的開銷,這樣在客戶較多時的效能就會降低。為了克服這種生成程式的額外開銷,可以使用多執行緒方式或非同步方式。在多執行緒方式中,使用程式中的多個執行緒提供服務,由於執行緒的開銷較小,效能就會提高。事實上,不需要任何額外開銷的方式還是非同步方式,它使用非阻塞的方式與每個客戶通訊,伺服器使用一個程式進行輪詢就行了。非同步方式下,多個任務之間的排程是由伺服器程式自身來完成的,而且一旦一個地方出現問題則整個伺服器就會出現問題,不在討論的範圍內。增大系統執行緒的數量:限制執行緒的數量的因素很多,主要有程式數量的限制,記憶體大小的限制,mutex/semaphore/shm/ipc的限制;一般情況下先增大程式最大數,再擴充記憶體,在增大執行緒最大數,而增大執行緒最大數的方法很簡單,只需改變glibc中兩處即可:執行緒最大數和執行緒堆疊區的大小;執行緒最大數的增加是以程式的非同步I/O效能下為代價;所以需要加以平衡。


絡配置檔案中有用的內容
1. 對於資料庫而言,增大共享記憶體段和訊號量的多少,對資料傳輸效率的提高起到很重要的作用;

方法:只需編輯檔案linux/include/linux/sem.h和linux/include/asm-i386/shmparam.h即可。

2. 先增大程式最大數,再擴充記憶體,再增大執行緒最大數,而增大執行緒最大數的方法很簡單,只需改變glibc中兩處即可:執行緒最大數和執行緒堆疊區的大小;

3. 把"/etc/inittab"檔案中的一行註釋掉可以禁止用Control-Alt-Delete關閉計算機。如果伺服器不是放在一個安全的地方,這非常重要。

編輯inittab檔案(vi /etc/inittab)把這一行:

ca::ctrlaltdel:/sbin/shutdown -t3 -r now



改為:

#ca::ctrlaltdel:/sbin/shutdown -t3 -r now



用下面的命令使改變生效:

[root@deep]# /sbin/init q



4. /etc/host.conf 檔案指定如何解析主機名。Linux透過解析器庫來獲得主機名對應的IP地址。下面是一個"/etc/host.conf"的示例:

order bind,hosts :指定主機名查詢順序,這裡規定先使用DNS來解析域名,然後再查詢"/etc/hosts"檔案(也可以相反)。

可以在該檔案後加上以下兩句:

multi on:指定的主機可以有多個地址,擁有多個IP地址的主機一般稱為多穴主機。

ospoof on:指不允許對該伺服器進行IP地址欺騙,以提高伺服器的安全性。IP欺騙是一種攻擊系統安全的手段,透過把IP地址偽裝成別的計算機,來取得其它計算機的信任。


可調諧的Linux核心網路引數
ICMP相關核心配置引數

概述:通常我們使用icmp包來探測目的主機上的其它協議(如tcp和udp)是否可用。比如包含"destination unreachable"資訊的icmp包就是最常見的icmp包。

(1) icmp_destunreach_rate:設定內容為"Destination Unreachable"icmp包的響應速率。設定值應為整數。

應用例項: 假設有A、B兩部主機,首先我們在主機A上執行以下ipchains語句:

ipchains -A input -p icmp -j REJECT



這裡的REJECT和DENY不同,DENY會丟掉符合條件的包如同沒有接收到該包一樣,而REJECT會在丟掉該包的同時給請求主機發回一個"Destination Unreachable"的icmp。

然後在主機B上ping主機A,這時候我們會發現"Destination Unreachable"icmp包的響應速度是很及時的。接著我們在主機A上執行:

echo "1000" > /proc/sys/net/ipv4/icmp_destunreach_rate



也即每10秒鐘響應一個"Destination Unreachable"的icmp包。

這時候再從主機B上ping主機A就會發現"Destination Unreachable"icmp包的響應速度已經明顯變慢,我很好奇的測試了一下,發現剛好是每10秒響應一次。

(2)icmp_echo_ignore_broadcasts:設定是否響應icmp echo請求廣播,設定值應為布林值,0表示響應icmp echo請求廣播,1表示忽略。

注意:windows系統是不響應icmp echo請求廣播的。

應用例項:

在我的RedHat6.x和RedHat7上該值預設為0,這樣當有個使用者ping我的伺服器所在的網段的網路地址時,所有的linux伺服器就會響應,從而也能讓讓該使用者得到我的伺服器的ip地址,可以執行

echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts



來關閉該功能。從而防止icmp風暴,防止網路阻塞。

(3)icmp_echoreply_rate:設定系統響應icmp echo請求的icmp包的響應速度,設定值為整數。

應用例項:

假設有A、B兩部主機,首先我們在主機B上ping主機A,可以看到響應很正常,然後在主機A上執行

echo "1000" > /proc/sys/net/ipv4/icmp_echoreply_rate



也即每10秒鐘響應一個icmp echo請求包。然後再ping主機A就可以看到響應速度已經變成10秒一次。

最好合理的調整該引數的值來防止icmp風暴。

(4)icmp_echo_ignore_all:設定系統是否忽略所有的icmp echo請求,如果設定了一個非0值,系統將忽略所有的icmp echo請求。其實這是icmp_echoreply_rate的一種極端情況。引數值為布林值,1:表示忽略,0:表示響應。

(5)icmp_paramprob_rate:當系統接收到資料包的損壞的ip或tcp頭時,就會向源發出一個包含有該錯誤資訊的icmp包。這個引數就是用來設定向源傳送這種icmp包的速度。當然,在通常情況下ip或tcp頭出錯是很少見的。引數值為整數。

(6)icmp_timeexceed_rate:資料包在網路上傳輸時,其生存時間(time to live)欄位會不斷減少,當生存時間為0時,正在處理該資料包的路由器就會丟棄該資料包,同時給源主機傳送一個"time to live exceeded"的icmp包。該引數就是用來設定這種icmp包的傳送的速度。當然,這通常用於充當路由器的linux主機。

IP相關核心配置引數

linux核心網路引數中關於ip的配置引數通常是用來定義或調整ip包的一些特定的引數,除此之外還定義了系統的一些網路特性。

(1)ip_default_ttl:設定從本機發出的ip包的生存時間,引數值為整數,範圍為0~128,預設值為64。在windows系統中,ip包的生存時間通常為128。如果你的系統經常得到"Time to live exceeded"的icmp回應,可以適當增大該引數的值,但是也不能過大,因為如果你的路由壞路的話,就會增加系統報錯的時間。

(2)ip_dynaddr:該引數通常用於使用撥號連線的情況,可以使系統能夠立即改變ip包的源地址為該ip地址,同時中斷原有的tcp對話而用新地址重新發出一個syn請求包,開始新的tcp對話。在使用ip欺騙時,該引數可以立即改變偽裝地址為新的ip地址。該引數的引數值可以是:

1:啟用該功能
2:使用冗餘模式啟用該功能
0:禁止該功能



應用例項:在使用ipchains配置ip欺騙帶動區域網共享一個ppp連線上網時,有時會出現剛開時連線一個站點連不通,再次重新整理又可以連線的情況,這時候就可以設定該引數的值為1,從而立即改變偽裝地址為新的ip地址,就可以解決這類問題。命令為:

echo "1" > /proc/sys/net/ipv4/ip_dynaddr



(3)ip_forward:可以透過該引數來啟用包轉發功能,從而使系統充當路由器。引數值為1時啟用ip轉發,為0時禁止ip轉發。注意,我們可以在單網路卡或雙網路卡的主機上實現ip轉發。

應用例項:

假設我們使用一部裝有雙網路卡的linux主機充當防火牆,這時候我們就必須執行以下命令來開啟ip轉發功能:

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



(4) ip_local_port_range:設定當本地系統向外發起tcp或udp連線請求時使用的埠範圍。設定值為兩個整數,預設為"1024 4999"。

應用例項:

echo "1450 6000" > /proc/sys/net/ipv4/ip_local_port_range



tcp相關核心配置引數

透過tcp配置引數可以控制tcp會話過程中的各個方面。

(1) tcp_fin_timeout:在一個tcp會話過程中,在會話結束時,A首先向B傳送一個fin包,在獲得B的ack確認包後,A就進入FIN WAIT2狀態等待B的fin包然後給B發ack確認包。這個引數就是用來設定A進入FIN WAIT2狀態等待對方fin包的超時時間。如果時間到了仍未收到對方的fin包就主動釋放該會話。引數值為整數,單位為秒,預設為180秒。

(2) tcp_syn_retires:設定開始建立一個tcp會話時,重試傳送syn連線請求包的次數。 引數值為小於255的整數,預設值為10。假如你的連線速度很快,可以考慮降低該值來提高系統響應時間,即便對連線速度很慢的使用者,預設值的設定也足夠大了。

(3) tcp_window_scaling:設定tcp/ip會話的滑動視窗大小是否可變。引數值為布林值,為1時表示可變,為0時表示不可變。Tcp/ip通常使用的視窗最大可達到65535位元組,對於高速網路,該值可能太小,這時候如果啟用了該功能,可以使tcp/ip滑動視窗大小增大數個數量級,從而提高資料傳輸的能力。

針對每一網路介面的核心網路引數

透過針對每一網路介面的核心網路引數,你可以為諸如eth0、eth1等具體的網路介面指定響應的核心網路引數。注意:/proc/sys/net/ipv4/conf/all/下的引數將應用於所有的網路介面。

(1) accept_redirects:該引數位於/proc/sys/net/ipv4/conf/DEV/accept_redirects(DEV表示具體的網路介面),如果你的主機所在的網段中有兩個路由器,你將其中一個設定成了預設閘道器,但是該閘道器在收到你的ip包時發現該ip包必須經過另外一個路由器,這時這個路由器就會給你發一個所謂的"重定向"icmp包,告訴將ip包轉發到另外一個路由器。引數值為布林值,1表示接收這類重定向icmp 資訊,0表示忽略。在充當路由器的linux主機上預設值為0,在一般的linux主機上預設值為1。建議將其改為0,或者使用"安全重定向"(見下文)以消除安全性隱患。

(2) log_martians:將包含非法地址資訊的ip包記錄到核心日誌。引數值為布林值。

應用例項:

上面我們講過rp_filter反向路徑過濾引數,同時我們可以執行下面的語句

echo "1" > /proc/sys/net/ipv4/conf/all/log_martians



然後就可以將進行ip假冒的ip包記錄到/var/log/messages。

(3) forwarding:啟用特定網路介面的ip轉發功能。引數值為布林值,1表示進行記錄。

應用例項:

echo "1" > /proc/sys/net/ipv4/conf/eth0/forwarding



(4) accept_source_route:是否接受含有源路由資訊的ip包。引數值為布林值,1表示接受,0表示不接受。在充當閘道器的linux主機上預設值為1,在一般的linux主機上預設值為0。從安全性角度出發,建議你關閉該功能。

(5) secure_redirects:前面我們已經提到過"安全重定向"的概念,其實所謂的"安全重定向"就是隻接受來自閘道器的"重定向"icmp包。該引數就是用來設定"安全重定向"功能的。引數值為布林值,1表示啟用,0表示禁止,預設值為啟用。

(6) proxy_arp:設定是否對網路上的arp包進行中繼。引數值為布林值,1表示中繼,0表示忽略,預設值為0。該引數通常只對充當路由器的linux主機有用。


改變有關係統預設引數限制
1. _SHM_ID_BITS:在/usr/src/linux/include/asm/shmparam.h檔案中定義了該值;

作用:定義共享記憶體段表識的數量;其預設值為7,變化範圍:1-128;

調諧:可將該值增大到9,需重新編譯核心;

2. MSGMNI:/proc/sys/kernel/msgmni檔案中定義了該值;

作用:該值定義了訊息佇列的最大長度;要使db2(7.1版)正常執行,其最小值為128;

對於高負荷的DB2伺服器,可將該值調整為 >= 1024;

調諧:對於2.4.6版本的核心,其預設值為16;可用以下三中方法改變該值

(1) bash# sysctl -w kernel.msgmni=128

(2) bash# sysctl -w kernel.msgmni=128

(3) 如果要在系統啟動時改變該值,可在/etc/sysctl.conf檔案中加入以下幾句:

# Sets maximum number of message queues to 128
# Set this to 1024 or higher on production systems
kernel.msgmni = 128



(用ipcs -l 命令來檢視當前ipc 引數的各種設定)

3. NR_TASKS:/usr/src/linux/include/linux/tasks.h檔案中定義了該

MAX_TASKS_PER_USER被定義為NR_TASKS/2;linux 將DB2的每個例項看作使用者,每個連結一般都使用一個程式,而每個例項的最大連結數被限制為NR_TASKS/2;儘管2.4的核心對該值無限制,但有linux該預設值仍為512;

調諧:>= 1024, 重新編譯核心;

4. SEMMNI:/usr/src/linux/include/linux/sem.h 檔案中定義了該值;

作用:該值定義了linux所能支援的最大訊號量表識;

調諧:其預設值為128,增大到1024;


從IPV4過渡到IPV6
儘管IPv6比IPv4具有明顯的先進性,要想在短時間內將Internet和各個企業網路中的所有系統全部從IPv4升級到IPv6是不可能的。為此,做為IPv6研究工作的一個部分,IETF制定了推動IPv4向IPv6過渡的方案,其中包括三個機制:相容IPv4的IPv6地址、雙IP協議棧和基於IPv4通道的IPv6。

相容IPv4的IPv6地址是一種特殊的IPv6單點廣播地址,一個IPv6節點與一個IPv4節點可以使用這種地址在IPv4網路中通訊。這種地址是由96個0位加上32位IPv4地址組成的,例如,假設某節點的IPv4地址是192.56.1.1,那麼相容IPv4的IPv6地址就是:

0: 0:0:0:0:0:C038:101。



雙IP協議棧是在一個系統(如一個主機或一個路由器)中同時使用IPv4和IPv6兩個協議棧。這類系統既擁有IPv4地址,也擁有IPv6地址,因而可以收發IPv4和IPv6兩種IP資料包。也就是用兩套,需要使用IPv4的時候就使用IPv4,需要使用IPv6的時候就使用IPv6。

與雙IP協議棧相比,基於IPv4通道的IPv6是一種更為複雜的技術,它是將整個IPv6資料包封裝在IPv4資料包中,由此實現在當前的IPv4網路(如Internet)中IPv6節點與IPv4節點之間的IP通訊。基於IPv4通道的IPv6實現過程分為三個步驟:封裝、解封和通道管理。封裝,是指由通道起始點建立一個IPv4包頭,將IPv6資料包裝入一個新的IPv4資料包中。解封,是指由通道終結點移去IPv4包頭,還原原始的IPv6資料包。通道管理,是指由通道起始點維護通道的配置資訊。IPv4通道有四種方案:路由器對路由器、主機對路由器、主機對主機、路由器對主機。

當進行通訊的兩個主機都有相容IPv4的IPv6地址時,資料傳送方主機將建立一個主機對主機通道。通道起始點(資料傳送方主機)確定資料接收方主機就是通道終結點,並自動從其相容IPv4的IPv6地址中抽取後32個地址位以確定通道終結點的IPv4地址,這種型別的通道被稱為自動通道(automated tunneling)。

雙IP協議棧和基於IPv4通道的IPv6網路使IPv4網路能夠以可控的速度向IPv6遷移。在開始向IPv6過渡之前,必須設定一個同時支援IPv4和IPv6的新的DNS伺服器。有關設定或關於IPv6更多的詳細內容可訪問IPv6相關網站。我們在這裡僅為在Linux下使用IPV6提供一種簡單的理論敘述。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-961104/,如需轉載,請註明出處,否則將追究法律責任。

相關文章