優化內核參數提高伺服器的併發處理能力

来源:http://www.cnblogs.com/hodge01/archive/2016/12/14/6178415.html
-Advertisement-
Play Games

PS:在伺服器硬體資源額定有限的情況下,最大的壓榨伺服器的性能,提高伺服器的併發處理能力,是很多運維技術人員思考的問題。要提高Linux系統下的負載能力,可以使用nginx等原生併發處理能力就很強的web伺服器,如果使用Apache的可以啟用其Worker模式,來提高其併發處理能力。除此之外,在考慮 ...


PS:在伺服器硬體資源額定有限的情況下,最大的壓榨伺服器的性能,提高伺服器的併發處理能力,是很多運維技術人員思考的問題。要提高Linux系統下的負載能力,可以使用nginx等原生併發處理能力就很強的web伺服器,如果使用Apache的可以啟用其Worker模式,來提高其併發處理能力。除此之外,在考慮節省成本的情況下,可以修改Linux的內核相關TCP參數,來最大的提高伺服器性能。當然,最基礎的提高負載問題,還是升級伺服器硬體了,這是最根本的。

Linux系統下,TCP連接斷開後,會以TIME_WAIT狀態保留一定的時間,然後才會釋放埠。當併發請求過多的時候,就會產生大量的TIME_WAIT狀態的連接,無法及時斷開的話,會占用大量的埠資源和伺服器資源。這個時候我們可以優化TCP的內核參數,來及時將TIME_WAIT狀態的埠清理掉。

本文介紹的方法只對擁有大量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記憶體,但是它們的生存期長些。

經過這樣的優化配置之後,你的伺服器的TCP併發處理能力會顯著提高。以上配置僅供參考,用於生產環境請根據自己的實際情況。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 字元設備是Linux三大設備之一(另外兩種是塊設備,網路設備),字元設備就是位元組流形式通訊的I/O設備,絕大部分設備都是字元設備,常見的字元設備包括滑鼠、鍵盤、顯示器、串口等等,當我們執行 ls l /dev 的時候,就能看到大量的設備文件, c 就是字元設備, b 就是塊設備,網路設備沒有對應的設 ...
  • Linux許可權管理 chgrp :改變檔案所屬群組 # chgrp [-R] 群組 dirname/filename ... chown :改變檔案擁有者 # chown [-R] 賬號名稱 文件名或目錄 # chown [-R] 賬號名稱:組名 文件名或目錄 chmod :改變檔案的許可權, SUI ...
  • 安裝samba服務步驟ps -e 查看進程ps -e | grep 文件名 管道符的使用rpm -qa 安裝包的查看rpm -qa | grep samba 抓Samba安裝包 註釋:包與包之間有依賴關係,必須保證網路是暢通的 第一步:yum install samba samba-client s ...
  • 昨天搞定了一個十萬火急的issue,客戶抱怨產品升級後系統會變慢和CPU使用率相當高,客戶脾氣很大,聲稱不儘快解決這個問題就退貨,弄得我們 R&D壓力很大,解決這個issue的任務分給了我,客戶是南非的一個公司,由於時差問題,我只好在家遠程解決問題,晚上8點半用 gotomeeting遠程到客戶電腦 ...
  • 本文地址 分享提綱: 1.查看是否啟動 2. 設置自動啟動 1.【查看是否啟動】 啟動SSH服務 “/etc/init.d/sshd start”。然後用netstat -antulp | grep ssh看是否能看到相關信息就可以了。 2.【設置自動啟動】 如何設置把ssh等一些服務隨系統開機自動 ...
  • nginx代理https站點(親測) 首先,我相信大家已經搞定了nginx正常代理http站點的方法,下麵重點介紹代理https站點的配置方法,以及註意事項,因為目前大部分站點有轉換https的需要所以學習這個方法也是很重要的,我就不啰嗦了 直奔主題了……………… 測試環境 nginx版本 ngin ...
  • 在安裝好的matlab下有MCR(MatlabCompilerRuntime)在matlab2011/toolbox/compiler/deploy/glnxa64下找到MCRInstaller.zip安裝包解壓後執行install命令,選擇路徑進行安裝即可 環境變數設置:setenv LD_LIB ...
  • 最新發佈的開源 Zephyr Project™(Zephyr 項目)是一款小型且可伸縮的實時操作系統,尤其適用於資源受限的系統,可支持多種架構;該系統高度開源,對於開發人員社區完全開放,開發人員可根據需要對該系統進行剪裁,以支持最新硬體、工具和設備驅動程式;該系統高度模塊化平臺,可輕鬆集成任何架構的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...