⑴ linux內核能修改嗎
能的,她是是開放源代碼形式的
有一本linux內核的書,你可以買來參考一下。
linux內核內容比較大,建議你先選定一個方向閱讀。
⑵ 怎麼重新編譯linux伺服器內核
make
config首先配置內核,生成內核配置文件,如果是伺服器上的,建議使用編輯好的內核配置文件,自己在伺服器上配置比較麻煩;
make再根據生成的配置文件進行編譯;
找到新的內核就可以使用
⑶ 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 文件中載入,如:
以上兩種方法都可能立即開啟路由功能,但如果系統重啟,或執行了
# service network restart
命令,所設置的值即會丟失,如果想永久保留配置,可以修改/etc/sysctl.conf文件,將 net.ipv4.ip_forward=0改為net.ipv4.ip_forward=1
二、linux內核參數調整:linux 內核參數調整有兩種方式
方法一:修改/proc下內核參數文件內容,不能使用編輯器來修改內核參數文件,理由是由於內核隨時可能更改這些文件中的任意一個,另外,這些內核參數文件都是虛擬文件,實際中不存在,因此不能使用編輯器進行編輯,而是使用echo命令,然後從命令行將輸出重定向至 /proc 下所選定的文件中。如:將 timeout_timewait 參數設置為30秒:
參數修改後立即生效,但是重啟系統後,該參數又恢復成默認值。因此,想永久更改內核參數,需要修改/etc/sysctl.conf文件
方法二.修改/etc/sysctl.conf文件。檢查sysctl.conf文件,如果已經包含需要修改的參數,則修改該參數的值,如果沒有需要修改的參數,在sysctl.conf文件中添加參數。如:
net.ipv4.tcp_fin_timeout=30
保存退出後,可以重啟機器使參數生效,如果想使參數馬上生效,也可以執行如下命令:
三、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網關更強大》系列文章,其中對於各個腳本有詳細的說明和描述。
EXTERNAL="eth0"
INTERNAL="eth1"
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o $EXTERNAL -j MASQUERADE
LOCAL_EX_IP=11.22.33.44 #設定網關的外網卡ip,對於多ip情況,參考《如何讓你的Linux網關更強大》系列文章
LOCAL_IN_IP=192.168.1.1 #設定網關的內網卡ip
INTERNAL="eth1" #設定內網卡
echo 1 > /proc/sys/net/ipv4/ip_forward
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
iptables -t nat -A PREROUTING -d $LOCAL_EX_IP -p tcp --dport 80 -j DNAT --to 192.168.1.10
iptables -t nat -A POSTROUTING -d 192.168.1.10 -p tcp --dport 80 -j SNAT --to $LOCAL_IN_IP
iptables -A FORWARD -o $INTERNAL -d 192.168.1.10 -p tcp --dport 80 -j ACCEPT
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表規模
cat /proc/sys/net/ipv4/ip_conntrack_max
cat /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
cat /proc/net/ip_conntrack
cat /proc/sys/net/ipv4/ip_local_port_range
wc -l /proc/net/ip_conntrack
grep ip_conntrack /proc/slabinfo | grep -v expect | awk '{print 2;}'
grep ip_conntrack /proc/slabinfo | grep -v expect | awk '{print 3;}'
cat /proc/net/ip_conntrack | cut -d ' ' -f 10 | cut -d '=' -f 2 | sort | uniq -c | sort -nr | head -n 10
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
⑷ OS內核參數和JVM參數的調整
OS內核參數調整
vm.overcommit_memory 內存分配策略:可選值:0,1,2
0:表示內核將檢查是否有足夠的可用內存供應用進程使用;如果有足夠的可用內存,內存申請允許;否則,內存申請失敗,並把錯誤返回給應用進程。
1:表示內核允許分配所有的物理內存,而不管當前的內存狀態如何。
2: 表示內核允許分配超過所有物理內存和交換空間總和的內存。
一般需要將這個參數的值調整為1
可以用如下命令修改: echo 'vm.overcommit_memory=1'>> /etc/sysctl.conf
vm.max_map_count 文件句柄數
這個參數的值會影響中間件系統可以開啟的線程的數量。
如果這個參數過小,有的時候可能會導致有些中間件無法開啟足夠的線程,進而導致報錯,甚至中間件系統掛掉。
可以用如下命令修改: echo 'vm.max map_ count=655360' >> /etc/sysctl.conf.
vm.swappiness 控制換出運行時內存的相對權重
os會把一部分磁碟空間作為swap區域,然後如果有的進程現在可能不太活躍,就會被操作系統把進程調整為睡眠狀態,把進程中的數據放入磁碟上的swap區域,然後這個進程把原來佔用的內存空間騰出來,交給其他活躍運行的進程來使用。
如果這個參數的值設置為0,意思就是盡量別把任何一個進程放到磁碟swap區域去,盡量大家都用物理內存。
如果這個參數的值是100,那麼意思就是盡量把一些進程給放到磁碟swap區域去,內存騰出來給活躍的進程使用。
默認這個參數的值是60,有點偏高了,可能會導致我們的中間件運行不活躍的時候被迫騰出內存空間然後放磁碟swap區域去。
因此通常在生產環境建議把這個參數調整小-些,比如設置為10,盡量用物理內存,別放磁碟swap區域去。
可以用如下命令修改: echo 'vm.swappiness=10' >> /etc/sysctl.conf。
ulimit
這個是用來控制inux上的最大文件鏈接數的,默認值可能是1024, 一般肯定是不夠的,因為你在大量頻繁的讀寫磁碟文件的時候,或者是進行網路通信的時候,都會跟這個參數有關系對於一個中間件系統而言肯定是不能使用默認值的,如果你採用默認值,很可能在線上會出現如下錯誤: error: too many open files。
因此通常建議用如下命令修改這個值: echo 'ulimit -n 1000000' >> /etc/profile.
總結:
實大家綜合思考一下這幾個參數, 會發現到最後要調整的東西,無非都是跟磁碟文件IO、網路通信、內存管理、線程數量有關系的,因為我們的中間件系統在運行的時候無非就是跟這些打交道。
●中間件系統肯定要開啟大量的線程(跟vm.max_map_count有關)
●而且要進行大量的網路通信和磁碟IO (跟ulimit有關)
●然後大量的使用內存(跟vm.swappiness和vm.overcommit_memory有關)
所以對OS內核參數的調整,往往也就是圍繞跟中間件 系統運行最相關的一東西。
JVM參數調整
-server :這個參數就是說用伺服器模式啟動,這個沒什麼可說的,現在一般都是如此。
-Xms8g -Xmx8g -Xmn4g :這個就是很關鍵的一塊參數了,也是重點需要調整的,就是默認的堆大小是8g內存,新生代是4g內存,但是我們的高配物理機是48g內存的,所以這里完全可以給他們翻幾倍,比如給堆內存20g,中新生代給10g,甚至可更多-些,當然要留一些內存給操作系統來用。
-XX:+UseG1GC -XX:G1HeapRegionSize=16m :這幾個參數也是至關重要的,這是選用了G1垃圾回收器來做分代回收,對新生代和老年代都是用G1來回收這里把G1的region大小設置為了16m,這個因為機器內存比較多,所以region大小可以調大-些給到16m, 不然用2m的region, 會
導致region數量過多的。
-XX:G1 ReservePercent=25 :這個參數是說,在G1管理的老年代裡預留25%的空閑內存,保證新生代對象晉升到老年代的時候有足夠空間,避免老年代內存都滿了,新生代有對象要進入老年代沒有充足內存了默認值是10%,略微偏少,這里RocketMQ給調大了一些。
-XX:=30 :這個參數是說,當堆內存的使用率達到30%之後就會自動啟動G1的並發垃圾回收,開始嘗試回收一些垃圾對象,默認值是45%,這里調低了一些,也就是提高了GC的頻率,但是避免了垃圾對象過多, 一次垃圾回收耗時過長的問題。
-XX:SoftRefLRUPolicyMSPerMB=0 :這個參數不要設置為0,避免頻繁回收-些軟引|用的Class對象,這里可以調整為比如1000。
-verbose:gc -Xloggc:/dev/shm/mq_ gc _%p.log -XX:+ PrintGCDetails -XX: + PrintGCDateStamps -XX: + PrintGCApplicationStoppedTime -XX:+ PrintAdaptiveSizePolicy -XX:+UseGCLogFileRotation -
XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m :這一堆參數都是控制GC日誌列印輸出的, 確定了gc日誌文件的地址,要列印哪些詳細信息,然後控制每個gc日誌文件的大小是30m,最多保留5個gc日誌文件。
-XX:-OmitStackTraceInFastThrow :這個參數是說,有時候JVM會拋棄-些異常堆棧信息, 因此這個參數設置之後,就是禁用這個特性,要把完整的異常堆棧信息列印出來。
-XX:+ AlwaysPreTouch :這個參數的意思是我們剛開始指定JVM用多少內存,不會真正分配給他,會在實際需要使用的時候再分配給他。
所以使用這個參數之後,就是強制讓VM啟動的時候直接分配我們指定的內存,不要等到使用內存的時候再分配。
-XX:MaxDirectMemorySize= 15g :這是說RocketMQ里大用了NIO中的direct buffer,這里限定了direct buffer最多申請多少,如果你機器內存比較大,可以適當調大這個值。
-XX:-UseLargePages -XX:-UseBiasedLocking :這兩個參數的意思是禁用大內存頁和偏向鎖。
RocketMQ核心參數調整
sendMessageThreadPoolNums
RocketMQ內部用來發送消息的線程池的線程數量,默認是16。這個參數可以根據你的機器的CPU核數進行適當增加。
⑸ 伺服器TIME_WAIT和CLOSE_WAIT詳解和解決辦法
在日常的伺服器維護中,會經常用到如下命令。
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
它會顯示例如下面的信息:
TIME_WAIT 689
CLOSE_WAIT 2
FIN_WAIT1 1
ESTABLISHED 291
SYN_RECV 2
LAST_ACK 1
常用的三個狀態是:ESTABLISHED表示正在通信 、TIME_WAIT表示主動關閉、CLOSE_WAIT表示被動關閉。
如果伺服器出現了異常,很大的可能是出現了以下兩種情況:
我們也都知道Linux系統中分給每個用戶的文件句柄數是有限的,而TIME_WAIT和CLOSE_WAIT這兩種狀態如果一直被保持,那麼意味著對應數目的通道(此處應理解為socket,一般一個socket會佔用伺服器端一個埠,伺服器端的埠最大數是65535)一直被佔用,一旦達到了上限,則新的請求就無法被處理,接著就是大量Too Many Open Files異常,然後tomcat、nginx、apache崩潰。。。
下面來討論這兩種狀態的處理方法,網路上也有很多資料把這兩種情況混為一談,認為優化內核參數就可以解決,其實這是不恰當的。優化內核參數在一定程度上能解決time_wait過多的問題,但是應對close_wait還得從應用程序本身出發。
這種情況比較常見,一般會出現在爬蟲伺服器和web伺服器(如果沒做內核參數優化的話)上,那麼這種問題是怎麼產生的呢?
從上圖可以看出time_wait是主動關閉連接的一方保持的狀態,對於爬蟲伺服器來說它自身就是客戶端,在完成一個爬取任務後就會發起主動關閉連接,從而進入time_wait狀態,然後保持這個狀態2MSL時間之後,徹底關閉回收資源。這里為什麼會保持資源2MSL時間呢?這也是TCP/IP設計者規定的。
TCP要保證在所有可能的情況下使得所有的數據都能夠被正確送達。當你關閉一個socket時,主動關閉一端的socket將進入TIME_WAIT狀 態,而被動關閉一方則轉入CLOSED狀態,這的確能夠保證所有的數據都被傳輸。當一個socket關閉的時候,是通過兩端四次握手完成的,當一端調用 close()時,就說明本端沒有數據要發送了。這好似看來在握手完成以後,socket就都可以處於初始的CLOSED狀態了,其實不然。原因是這樣安 排狀態有兩個問題, 首先,我們沒有任何機制保證最後的一個ACK能夠正常傳輸,第二,網路上仍然有可能有殘余的數據包(wandering plicates),我們也必須能夠正常處理。
TIMEWAIT就是為了解決這兩個問題而生的。
再引用網路中的一段話:
time_wait問題可以通過調整內核參數和適當的設置web伺服器的keep-Alive值來解決。因為time_wait是自己可控的,要麼就是對方連接的異常,要麼就是自己沒有快速的回收資源,總之不是由於自己程序錯誤引起的。但是close_wait就不一樣了,從上圖中我們可以看到伺服器保持大量的close_wait只有一種情況,那就是對方發送一個FIN後,程序自己這邊沒有進一步發送ACK以確認。換句話說就是在對方關閉連接後,程序里沒有檢測到,或者程序里本身就已經忘了這個時候需要關閉連接,於是這個資源就一直被程序佔用著。這個時候快速的解決方法是:
註:
直到寫這篇文章的時候我才完全弄明白之前工作中遇到的一個問題。程序員寫了爬蟲(php)運行在採集伺服器A上,程序去B伺服器上採集資源,但是A伺服器很快就發現出現了大量的close_wait狀態的連接。後來手動檢查才發現這些處於close_wait狀態的請求結果都是404,那就說明B伺服器上沒有要請求的資源。
下面引用網友分析的結論:
服 務器A是一台爬蟲伺服器,它使用簡單的HttpClient去請求資源伺服器B上面的apache獲取文件資源,正常情況下,如果請求成功,那麼在抓取完 資源後,伺服器A會主動發出關閉連接的請求,這個時候就是主動關閉連接,伺服器A的連接狀態我們可以看到是TIME_WAIT。如果一旦發生異常呢?假設 請求的資源伺服器B上並不存在,那麼這個時候就會由伺服器B發出關閉連接的請求,伺服器A就是被動的關閉了連接,如果伺服器A被動關閉連接之後程序員忘了 讓HttpClient釋放連接,那就會造成CLOSE_WAIT的狀態了。
⑹ 戴爾伺服器怎麼調風扇轉速,bios和網上的不一樣
1、進入BIOS下的POWER,將CPUFAN Mode Setting設置為AUTO,重起。 先將風扇設置為自動模式,開機後查看轉速與聲音,如果可以接受,最好是在這中模式下。如果不行,那麼繼續。
2、在CPUFAN Mode Setting設置manual mode ,cpufan 設置為100-150之間(默認250),這樣風扇的轉速就下降到1800--2400之間,噪音會小得多了,但是此時風扇並不是智能調節轉速的,即轉速是一定值!
3、設置智能調速,CPUFAN Target Temp valun(CPU風扇模式設置)--40 CPUFAN Startup value(CPU風扇的啟動數)---40,就是CPU溫度達到40°後開始啟動智能調速
4、 CPUFAN STOP value(CPU風扇停止數)---35,即CPU溫度到35°後停止調速,並隨之降速!注意:在風扇的整個調整過程中需要檢測CPU溫度,如果出現過高或死機,要立刻停止將風扇修改為原先的默認設置使用,如果是這樣說明你的風扇功率小不能降低轉速需要另外購買散熱器
⑺ 安裝了一台Linux伺服器,想自己編譯內核,一步一步做下來,
一般情況下
initrd這個文件在台式機上不是必須的,但是在有SCSI設備的伺服器上卻是必須的。有可能因為編譯內核的時候沒有產生initrd那個文件,所以會有上面的錯誤提示。用戶可以使用mkinitrd命令來生成一個initrd.img文件,然後加入GRUB,重啟試一試更多內容請查看《Linux就該這么學》。
⑻ 不能上網的內網Linux伺服器怎麼升級到指定的內核版本
下載需要更新的內核版本安裝包, 解壓後進行編譯安裝
⑼ 一般優化linux的內核,需要優化什麼參數
方法只對擁有大量TIME_WAIT狀態的連接導致系統資源消耗有效,如果不是這種情況下,效果可能不明顯。可以使用netstat命令去查TIME_WAIT狀態的連接狀態,輸入下面的組合命令,查看當前TCP連接的狀態和對應的連接數量:
#netstat -n | awk 『/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}』
這個命令會輸出類似下面的結果:
LAST_ACK 16
SYN_RECV 348
ESTABLISHED 70
FIN_WAIT1 229
FIN_WAIT2 30
CLOSING 33
TIME_WAIT 18098
我們只用關心TIME_WAIT的個數,在這里可以看到,有18000多個TIME_WAIT,這樣就佔用了18000多個埠。要知道埠的數量只有65535個,佔用一個少一個,會嚴重的影響到後繼的新連接。這種情況下,我們就有必要調整下Linux的TCP內核參數,讓系統更快的釋放TIME_WAIT連接。
用vim打開配置文件:#vim /etc/sysctl.conf
在這個文件中,加入下面的幾行內容:
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
輸入下面的命令,讓內核參數生效:#sysctl -p
簡單的說明上面的參數的含義:
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
#修改系統默認的 TIMEOUT 時間。
在經過這樣的調整之後,除了會進一步提升伺服器的負載能力之外,還能夠防禦小流量程度的DoS、CC和SYN攻擊。
此外,如果你的連接數本身就很多,我們可以再優化一下TCP的可使用埠范圍,進一步提升伺服器的並發能力。依然是往上面的參數文件中,加入下面這些配置:
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.ip_local_port_range = 10000 65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000
#這幾個參數,建議只在流量非常大的伺服器上開啟,會有顯著的效果。一般的流量小的伺服器上,沒有必要去設置這幾個參數。
net.ipv4.tcp_keepalive_time = 1200
#表示當keepalive起用的時候,TCP發送keepalive消息的頻度。預設是2小時,改為20分鍾。
net.ipv4.ip_local_port_range = 10000 65000
#表示用於向外連接的埠范圍。預設情況下很小:32768到61000,改為10000到65000。(注意:這里不要將最低值設的太低,否則可能會佔用掉正常的埠!)
net.ipv4.tcp_max_syn_backlog = 8192
#表示SYN隊列的長度,默認為1024,加大隊列長度為8192,可以容納更多等待連接的網路連接數。
net.ipv4.tcp_max_tw_buckets = 6000
#表示系統同時保持TIME_WAIT的最大數量,如果超過這個數字,TIME_WAIT將立刻被清除並列印警告信息。默 認為180000,改為6000。對於Apache、Nginx等伺服器,上幾行的參數可以很好地減少TIME_WAIT套接字數量,但是對於Squid,效果卻不大。此項參數可以控制TIME_WAIT的最大數量,避免Squid伺服器被大量的TIME_WAIT拖死。
內核其他TCP參數說明:
net.ipv4.tcp_max_syn_backlog = 65536
#記錄的那些尚未收到客戶端確認信息的連接請求的最大值。對於有128M內存的系統而言,預設值是1024,小內存的系統則是128。
net.core.netdev_max_backlog = 32768
#每個網路介面接收數據包的速率比內核處理這些包的速率快時,允許送到隊列的數據包的最大數目。
net.core.somaxconn = 32768
#web應用中listen函數的backlog默認會給我們內核參數的net.core.somaxconn限制到128,而nginx定義的NGX_LISTEN_BACKLOG默認為511,所以有必要調整這個值。
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216 #最大socket讀buffer,可參考的優化值:873200
net.core.wmem_max = 16777216 #最大socket寫buffer,可參考的優化值:873200
net.ipv4.tcp_timestsmps = 0
#時間戳可以避免序列號的卷繞。一個1Gbps的鏈路肯定會遇到以前用過的序列號。時間戳能夠讓內核接受這種「異常」的數據包。這里需要將其關掉。
net.ipv4.tcp_synack_retries = 2
#為了打開對端的連接,內核需要發送一個SYN並附帶一個回應前面一個SYN的ACK。也就是所謂三次握手中的第二次握手。這個設置決定了內核放棄連接之前發送SYN+ACK包的數量。
net.ipv4.tcp_syn_retries = 2
#在內核放棄建立連接之前發送SYN包的數量。
#net.ipv4.tcp_tw_len = 1
net.ipv4.tcp_tw_reuse = 1
# 開啟重用。允許將TIME-WAIT sockets重新用於新的TCP連接。
net.ipv4.tcp_wmem = 8192 436600 873200
# TCP寫buffer,可參考的優化值: 8192 436600 873200
net.ipv4.tcp_rmem = 32768 436600 873200
# TCP讀buffer,可參考的優化值: 32768 436600 873200
net.ipv4.tcp_mem = 94500000 91500000 92700000
# 同樣有3個值,意思是:
net.ipv4.tcp_mem[0]:低於此值,TCP沒有內存壓力。
net.ipv4.tcp_mem[1]:在此值下,進入內存壓力階段。
net.ipv4.tcp_mem[2]:高於此值,TCP拒絕分配socket。
上述內存單位是頁,而不是位元組。可參考的優化值是:786432 1048576 1572864
net.ipv4.tcp_max_orphans = 3276800
#系統中最多有多少個TCP套接字不被關聯到任何一個用戶文件句柄上。
如果超過這個數字,連接將即刻被復位並列印出警告信息。
這個限制僅僅是為了防止簡單的DoS攻擊,不能過分依靠它或者人為地減小這個值,
更應該增加這個值(如果增加了內存之後)。
net.ipv4.tcp_fin_timeout = 30
#如果套接字由本端要求關閉,這個參數決定了它保持在FIN-WAIT-2狀態的時間。對端可以出錯並永遠不關閉連接,甚至意外當機。預設值是60秒。2.2 內核的通常值是180秒,你可以按這個設置,但要記住的是,即使你的機器是一個輕載的WEB伺服器,也有因為大量的死套接字而內存溢出的風險,FIN- WAIT-2的危險性比FIN-WAIT-1要小,因為它最多隻能吃掉1.5K內存,但是它們的生存期長些。