1. 程式人生 > >Linux核心引數詳解

Linux核心引數詳解

核心引數詳解

長期更新

SYN_RECV

服務端收到sys,還未發出syn+ack
1.net.ipv4.tcp_synack_retries
預設值5,linux對應1+2+4+..32=2^6-1=63s

2.net.ipv4.tcp_syncookies
應該設定為1,防止SYN Flood。
處在SYN_RECV的TCP連線稱為半連線,儲存在SYN佇列。大量SYN_RECV會導致佇列溢位,後續請求將被核心直接丟棄,也就是SYN Flood攻擊。
開啟syncookies後,當SYN佇列滿了後,TCP會通過原地址埠,目的地址埠和時間戳打造一個特別的Sequence Number(又叫cookie)發回去,如果是攻擊者則不會有響應,如果是正常連線則把這個SYNCookie發回來,然後伺服器端可以通過cookie建立連線(即使不在SYN佇列)。
別用tcp_syncookies來處理正常大負載連線

,因為syncookies是妥協版的TCP協議,不嚴謹。對於正常的請求可調整三個TCP引數。
1.tcp_max_syn_backlog 減少重試次數
2.tcp_max_syn_backlog 增大syn連線數
3.tcp_abort_on_overflow 處理不過來拒絕連線

CLOSE_WAIT

被動關閉的一方收到FIN後傳送ACK處於CLOSE_WAIT狀態。出現這種狀態比較多時,一般都是沒有及時close()導致的,預設將持續2小時。

TIME_WAIT

主動關閉一方,socket將在TIME_WAIT等待2msl時間。
1.net.ipv4.tcp_fin_timeout
預設值60,TCP保持在FIN_WAIT2狀態的時間,超時後直接處於CLOSED,所以降低tcp_fin_timeout有助於減少TIME_WAIT數量。注意:雖然shutdown(SHUD_WR)也會處於FIN_WAIT2狀態,但超時並不起作用。

2.net.ipv4.tcp_tw_recycle
預設值0,開啟快速TIME_WAIT socket回收。
如果tcp_timestamps開啟的話,會快取每個連線的最新時間戳,如果後續請求時間戳小於快取的時間戳,即視為無效,相應的包被丟棄。所以如果是nat或負載均衡環境下,就可能出現數據包丟棄的現象。

3.net.ipv4.tcp_tw_resue
預設值0,是否重用TIME_WAIT狀態的socket用於新的連線
這個選項要比tcp_tw_recycle安全,從協議的角度看,複用是安全的。
網上查詢的複用條件:

1.tcp_timestamps選項必須開啟(客戶端也必須開啟)
2.重用TIME_WAIT的條件是收到最後一個包後超過1s

4.net.ipv4.tcp_timestamps
預設值1,tcp增加時間戳,可避免序列號的環繞,更精確的RTT計算,為了更好的效能應該啟用這個選項。

5.net.ipv4.tcp_max_tw_buckets
預設值180000,TIME_WAIT的上限。

TCP優化

1.net.ipv4.tcp_moderate_rcvbuf
預設值1,是否自動調節TCP接收緩衝區大小,當程式設計中設定了SO_SNDBUF,SO_RCVBUF將會使核心不對這些連線執行自動調節。
2. net.ipv4.tcp_adv_win_scale
預設值2,將拿出1/(2^tcp_adv_win_scale)快取做應用讀快取,那麼最大的接受滑動視窗只能到達讀快取的3/4。

3.net.ipv4.tcp_rmem
4096 87380 6291456
第一個是接受緩衝區最小位元組
第二個是接受緩衝區長度初始值,用來初始化sock的sk_rcvbuf,將取代rmem_default
第三個是接受緩衝區長度最大值,用來調整sock的sk_rcvbuf

4.net.core.rmem_default
適用所有協議的預設接受視窗大小(位元組)
接受視窗(rwnd)合理值取決於BDP(頻寬和延遲的乘積),假設頻寬100Mbps,延遲100ms
BDP= (100Mbps/8) * (100/1000) = 1.25M
由於有tcp_adv_win_scale額外開銷,所以快取的合理值為:
BDP/(1-1/(2^tcp_adv_win_scale))

5.net.ipv4.tcp_window_scaling
預設值1,是否啟用windows scaling,若要支援超過64KB的視窗,必須啟用。

6.net.ipv4.tcp_sack
預設值1,是否開啟sack(selective ack),報告收到的資料碎片,解決快速重傳不知道後續資料是否重傳的問題。

擁塞視窗

擁塞視窗(cwnd)是傳送端一個內部引數,用來避免網路擁塞,
通過慢啟動快速增加cwnd,Linux2.6核心初始為3*MSS,為了提高傳輸效率,Linux3.0以後為10*MSS,可通過以下命令修改

[[email protected]10-9-22-239 ~]# ip route show
default via 10.9.0.1 dev eth0 
10.9.0.0/16 dev eth0  proto kernel  scope link  src 10.9.22.239 
172.17.0.0/16 dev docker0  proto kernel  scope link  src 172.17.42.1 
[[email protected]10-9-22-239 ~]# ip route change default via 10.9.0.1 dev eth0 initcwnd 10
[[email protected]10-9-22-239 ~]# ip route show
default via 10.9.0.1 dev eth0  initcwnd 10
10.9.0.0/16 dev eth0  proto kernel  scope link  src 10.9.22.239 
172.17.0.0/16 dev docker0  proto kernel  scope link  src 172.17.42.1

Out of socket memory

原因

1.有很多孤兒(orphan)socket
2.tcp socket用盡了分配的記憶體
tcp socket使用page計數,linux預設4096bytes

getconf PAGESIZE

1./proc/net/ipv4/tcp_mem
365664 487552 731328
當使用小於365664 page時,kernel不對其進行干預
當使用超過487552 page時,kernel進入”memory pressure”
當tcp使用超過731328時,會報:Out of socket memory

2./proc/net/sockstat

sockets: used 307
TCP: inuse 13 orphan 0 tw 0 alloc 34 mem 6
UDP: inuse 6 mem 2
UDPLITE: inuse 0
RAW: inuse 0
FRAG: inuse 0 memory 0

可通過對比tcp_mem檢視當前socket記憶體狀態。

孤兒(orphan)socket

1.FIN_WAIT1和LAST_ACK狀態連線就是孤兒socket
2.FIN_WAIT2加入tw狀態統計,而不是orphan socket
3.CLOSE_WAIT既不假如orphan統計也不加入tw統計

fs

1.fs.file-max
系統所能開啟的最大檔案數
fs.file-max代表系統級別能夠開啟的檔案控制代碼,ulimit -n控制使用者程序所能開啟的數量
設定多少比較合適,建議:記憶體/10k

grep -r MemTotal /proc/meminfo | awk '{printf("%d",$2/10)}'

2.fs.file-nr 只讀檔案
1984 0 65535
第一個代表了目前分配的檔案控制代碼數,第三個代表了系統分配的最大檔案控制代碼數(同file-max)
file-nr一般會小於lsof | wc -l,但數量級是一致的。

vm

1.vm.dirty_background_ratio
預設值10
kdmflush守護程序負責同步所有與檔案系統相關的頁面至磁碟,當記憶體中的髒頁面數量超過10%時kdmflush開始回寫。

kswapd

kswapd守護程序負責確保記憶體保持可用空閒空間,它監控核心中pages_high和page_low標準,如果空閒記憶體空間小於pages_low,kswapd開始掃描並嘗試每次回收32個頁面,直到空閒記憶體大於pages_high。
kswapd執行以下操作:

1.假如頁面未改變,它將該頁面放入free list
2.假如頁面改變且被檔案系統回寫,它將頁面寫入磁碟
2.假如頁面改變且未被檔案系統回寫,它將頁面寫入swap裝置

buff:供read()和write()使用的實體記憶體緩衝大小
cache:對映到程序地址空間的實體記憶體數

1.當大量的資料從磁碟讀入記憶體(bi),cache值將不斷增加
2.vmstat中swapd值不斷增大,說明kswapd正將髒頁面寫入交換空間(so)
3.buff值不斷減少,說明kswapd正不斷回收記憶體

參考文章

相關推薦

Linux核心引數

核心引數詳解 長期更新 SYN_RECV 服務端收到sys,還未發出syn+ack 1.net.ipv4.tcp_synack_retries 預設值5,linux對應1+2+4+..32=2^6-1=63s 2.net.ipv4.tcp_s

Linux核心調整和核心引數

SYN COOKIE原理和Linux核心中的實現 http://www.ibm.com/developerworks/cn/linux/l-syncookie/?ca=dwcn-newsletter-linux Linux系統下的DDOS攻擊防範 http://hi.baidu.com/mo

linux核心優化,核心引數

轉自百度文庫,最後有一部分修改: 一、前言 本文件針對OOP8生產環境,具體優化策略需要根據實際情況進行調整;本文件將在以下幾個方面來闡述如何針對RedHat Enterprise Linux進行效能優化。 1)       Linux Proc檔案系統,通過對Proc檔案

Linux 記憶體引數

【檢視記憶體引數詳解】Linux free -m 詳細說明 free 命令相對於top 提供了更簡潔的檢視系統記憶體使用情況: $ free           &nb

linux核心sysfs-1

sysfs 是 Linux 核心中設計較新的一種虛擬的基於記憶體的檔案系統,它的作用與 proc 有些類似,但除了與 proc 相同的具有檢視和設定核心引數功能之外,還有為 Linux 統一裝置模型作為管理之用。相比於 proc 檔案系統,使用 sysfs 匯出核心資料的方

Linux iptables引數

1、下面是我的伺服器/etc/sysconfig/iptables正常的配置,對每一行進行講解 *filter :INPUT ACCEPT [0:0] #該規則表示INPUT表預設策略是ACCEPT,Input: 就是接入本機地址的資料,說白了就是設定別人可以訪問我

Linux核心程序之三:flush-x:y

上一篇文章《裝置檔案與裝置號》當然不是突然穿插而來的自言自語,而是理解本文的前提,下面來看。是一類程序,這在系列的上一篇文章裡已經講到過,系統的絕大部分的bdi裝置都會有對應的flush-x:y核心程序,而這個x:y是對應bdi裝置的裝置號。 先看一下系統當前掛載的檔案系統

Linux核心編譯

學習了網上的一些資料,自己試著摸索了一下,整理出此文。 由於在下水平相當有限,不當之處,還望大家批評指正^_^ 重要的參考資料有: 好了,下面進入正題。 一、準備工作 準備工作如何做,這裡就不詳說了。 a) 首先,你要有一臺PC(這不廢話麼^_^),裝好了Lin

Linux核心程序之一:sync_supers

先說下環境,CentOS 6.0/Linux kernel 2.6.38.8/X86-64,後面提到的程式碼也都來之kernel 2.6.38.8。這個環節下的程序列表具體如下所示,後續將有一系列的文章分析各個程序(主要是核心程序)的功能: [[email pro

linux中mount命令引數 nfs 引數

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

linux每日命令(22):find命令引數

一. name選項 檔名選項是find命令最常用的選項,要麼單獨使用該選項,要麼和其他選項一起使用。 可以使用某種檔名模式來匹配檔案,記住要用引號將檔名模式引起來。 不管當前路徑是什麼,如果想要在自己的根目錄$HOME中查詢檔名符合*.log的檔案,使用~作為 'pathname'引數,波浪號~代表了你的$

linux】Valgrind工具集(八):Memcheck命令列引數

【linux】Valgrind工具集詳解(五):命令列詳解中不夠全,在此專門針對Memcheck工具中的命令列引數做一次詳細的解釋。 Memcheck命令列選項 –leak-check=<no|summary|yes|full> [default: summary]

linux shutdown命令以及引數

在說shutdown命令之前 先說一下sync命令: sync:將記憶體中尚未寫入硬碟的資料寫入硬碟 因為linux為了保證資料讀寫速度,把常用的資料放在記憶體中,不會立即寫入硬碟,如果有不當關機,這些資料就會丟失 所以在執行shutdown、reboot之類的命令之前,應當多執行幾次sync命令來保

linux TOP命令各引數【轉載】

實時監控或檢視系統資源使用情況的工具——TOP top命令是Linux下常用的效能分析工具,能夠實時顯示系統中各個程序的資源佔用狀況,類似於Windows的工作管理員. 下面詳細介紹它的使用方法:               &nbs

Linux】DHCP 引數

環境:CentOS 6.5 dhcpd.conf的配置檔案的詳細說明: 1,全域性設定 DDNS更新式的引數:設定DHCP伺服器與DNS伺服器的動態資訊更新模式,一般的DHCP伺服器可以不考慮設定

linux系統下top命令的詳細用法、引數、以及模式配置

用過linux系統的人都知道top命令,它是Linux下一個最常用的效能分析工具,能夠實時顯示系統中各個程序的資源佔用狀況,類似於Windows的工作管理員。 top顯示系統當前的程序和其他狀況,是一個動態顯示過程,即可以通過使用者按鍵來不斷重新整理當前狀態。如果在前臺執行該命令,它

Linux壓力測試工具stress的引數

為了測試根據伺服器的負載情況,給大家推薦下stress這個壓力測試工具,具體安裝方式就不說了,本文主要介紹下stress的命令引數,大家可以在環境上驗證測試下。 引數說明: -? 顯示幫助資訊 -v 顯示版本號 -q 不顯示執行資訊 -n 顯示已

Linux系統呼叫(如何從使用者空間進入核心空間)

系統呼叫概述         計算機系統的各種硬體資源是有限的,在現代多工作業系統上同時執行的多個程序都需要訪問這些資源,為了更好的管理這些資源程序是不允許直接操作的,所有對這些資源的訪問都必須有作業系統控制。也就是說作業系統是使用這些資源的唯一入口,而這個入口就是作業系

linux核心剖析---Linux系統呼叫(實現機制分析)

本文介紹了系統呼叫的一些實現細節。首先分析了系統呼叫的意義,它們與庫函式和應用程式介面(API)有怎樣的關係。然後,我們考察了Linux核心如何實現系統呼叫,以及執行系統呼叫的連鎖反應:陷入核心,傳遞系統呼叫號和引數,執行正確的系統呼叫函式,並把返回值帶回使用者空間。最後

linux Nginx配置篇:gzip常用引數(附使用效果驗證過程)

gzip模組是使用“gzip”方法壓縮響應的過濾器,有助於將響應傳輸的資料大小減少一半甚至更多,能有效的緩解頻寬及流量問題。以下內容均翻譯於官網使用者手冊,介紹了gzip的一些常用引數,更多配置資訊可