內核調優通常通過修改內核運行時參數來實現,這些參數的配置文件是 Linux 系統中核心的性能調整點。
內核調優配置文件名稱
/etc/sysctl.conf
: 這是最傳統和主要的內核參數配置文件。系統啟動時或手動執行sysctl -p
命令時會讀取并應用其中的設置。/etc/sysctl.d/*.conf
: 這是一個現代的、推薦使用的目錄。你可以將不同的調優需求(如網絡優化、內存優化)放在單獨的.conf
文件中(例如99-net-tuning.conf
,99-memory.conf
)。這樣做的好處是:- 模塊化: 易于管理和維護不同方面的配置。
- 避免沖突: 升級系統或軟件包時,它們通常會將配置放到
/usr/lib/sysctl.d/
或/run/sysctl.d/
,而用戶的自定義配置放在/etc/sysctl.d/
可以覆蓋它們,且不會被升級覆蓋掉。 - 加載順序: 系統會按字母順序加載
/etc/sysctl.d/
、/run/sysctl.d/
和/usr/lib/sysctl.d/
目錄下的.conf
文件,后加載的文件中的參數值會覆蓋先加載文件中相同參數的值(因此通常用戶自定義文件以99-
開頭確保最后加載)。
如何生效?
- 修改上述文件后,需要執行以下命令之一使配置生效(無需重啟):
sysctl -p
: 重新加載/etc/sysctl.conf
。sysctl -p /etc/sysctl.d/99-my-tuning.conf
: 重新加載特定文件。sysctl --system
: 重新加載所有配置文件(包括/etc/sysctl.conf
和/etc/sysctl.d/*.conf
等)。這是推薦的做法。
- 如果想臨時測試參數效果(重啟失效),可以直接使用
sysctl -w parameter=value
命令。
常見需要優化的內核參數舉例
內核需要優化的參數非常多且高度依賴于具體應用場景(Web服務器、數據庫、文件服務器、高并發負載、虛擬化等)。以下是一些非常常見且普遍適用的參數類別和具體例子:
1. 網絡性能相關
net.core.somaxconn
:- 作用: 定義系統中每個監聽套接字(socket)的最大連接請求隊列長度。當服務器瞬間收到大量連接請求時,超過
somaxconn
的請求會被丟棄或忽略。 - 優化場景: 高并發服務器(Web Server如 Nginx/Apache,數據庫等)。默認值通常較低(128 或 1024),對于高并發可能需要提高到 4096 或 8192,甚至更高。
- 注意: 應用層(如 Nginx 的
listen backlog
參數)也需要相應調整,不能超過內核的這個值。
- 作用: 定義系統中每個監聽套接字(socket)的最大連接請求隊列長度。當服務器瞬間收到大量連接請求時,超過
net.ipv4.tcp_max_syn_backlog
:- 作用: 定義系統中尚未收到客戶端最終 ACK 的 SYN 半連接請求的最大隊列長度。
- 優化場景: 防御 SYN Flood 攻擊或應對瞬間高 SYN 連接請求。通常需要配合
net.core.somaxconn
調整,建議等于或略大于somaxconn
。
net.ipv4.tcp_tw_reuse
(TIME_WAIT
優化):- 作用: 允許內核將處于
TIME_WAIT
狀態的套接字重新用于新的OUTGOING
(出站) TCP 連接。默認通常是 0 (禁用)。 - 優化場景: 服務器需要頻繁主動向外部建立大量短連接(例如作為客戶端連接后端服務、爬蟲等),導致本地端口耗盡(大量
TIME_WAIT
狀態)。設置為1
可以緩解端口壓力。注意:主要用于解決主動關閉連接方的問題。
- 作用: 允許內核將處于
net.ipv4.tcp_tw_recycle
(TIME_WAIT
優化 - 謹慎使用!):- 作用: 啟用對
TIME_WAIT
套接字的快速回收。 - 風險: 在 NAT 網絡環境下極易導致連接問題(如移動客戶端通過 NAT 網關訪問服務器)。在 Linux 4.10+ 內核中已被移除,現代內核不再建議也不應使用此參數。 優先考慮
tcp_tw_reuse
和增加端口范圍。
- 作用: 啟用對
net.ipv4.ip_local_port_range
:- 作用: 定義本地(作為客戶端發起連接時)使用的 TCP/UDP 端口號范圍。
- 優化場景: 服務器需要作為客戶端發起大量連接時(如代理服務器、微服務調用),默認范圍(32768-60999)可能不夠用,可以擴大(例如
1024 65000
)。注意不要和知名端口(<1024)沖突。
net.ipv4.tcp_fin_timeout
:- 作用: 控制套接字保持在
FIN_WAIT_2
狀態的最長時間(秒)。默認通常是 60 秒。 - 優化場景: 可以適當降低(如 30 秒)以更快釋放資源,特別是在連接非常頻繁的情況下。但降低過多可能導致連接異常終止。
- 作用: 控制套接字保持在
net.core.netdev_max_backlog
:- 作用: 定義當內核處理網絡包的速度跟不上網卡接收速度時,每個網絡接口接收隊列的最大包數。
- 優化場景: 在網絡流量非常大的服務器上,增加此值(如 10000)可以減少因接收隊列滿而導致的丟包。需要結合
net.core.somaxconn
考慮。
2. 虛擬內存管理相關
vm.swappiness
:- 作用: 控制內核將內存頁交換(swap)到磁盤的積極程度。值范圍 0-100。值越高,內核越積極地使用交換空間;值越低,內核盡量避免交換,更傾向于回收文件系統緩存(page cache)。默認值通常是 60。
- 優化場景:
- 數據庫服務器/內存密集型應用: 通常建議設置為較低值(如 10 甚至 1 或 0),以盡量減少對性能影響巨大的磁盤交換,優先釋放文件緩存。
- 內存充足但希望更多內存用于緩存: 降低
swappiness
。 - 內存不足且希望避免 OOM Killer頻繁觸發: 可適當提高(但這是治標不治本,加內存才是根本)。
- 注意: 設置為 0 并不代表完全禁止交換,極端內存壓力下還是會發生的。
vm.vfs_cache_pressure
:- 作用: 控制內核回收用于 目錄項(dentry) 和 inode 對象緩存 的積極程度。默認值通常是 100。值越高,回收越積極(釋放越快);值越低,回收越保守(保留緩存更久)。
- 優化場景: 對于文件密集型應用(如文件服務器、Web 靜態資源服務器),如果發現
dentry
和inode
緩存頻繁被回收導致文件訪問變慢,可以嘗試適當降低此值(如 50)。
3. 文件系統相關
vm.dirty_background_ratio
/vm.dirty_background_bytes
:- 作用: 當系統中臟頁(被修改過但尚未寫入磁盤的內存頁)占總內存的百分比 (
dirty_background_ratio
) 或達到指定字節數 (dirty_background_bytes
) 時,系統在后臺開始寫回臟頁。 - 優化場景: 控制后臺刷盤的閾值。降低此值(如設為 5 或 10)可以讓后臺刷盤更早開始,避免臟頁累積過多導致后續同步刷盤阻塞應用。
...bytes
優先級高于...ratio
。
- 作用: 當系統中臟頁(被修改過但尚未寫入磁盤的內存頁)占總內存的百分比 (
vm.dirty_ratio
/vm.dirty_bytes
:- 作用: 當臟頁占總內存的百分比 (
dirty_ratio
) 或達到指定字節數 (dirty_bytes
) 時,生成臟頁的應用程序會被阻塞(同步地),直到臟頁被寫入磁盤一部分為止。 - 優化場景: 控制應用被阻塞的閾值。增大此值(如 30 或 40)可以減少寫入密集型應用(如數據庫事務日志寫入)被阻塞的頻率,提高吞吐,但風險是系統崩潰時丟失的數據增多。
...bytes
優先級高于...ratio
。
- 作用: 當臟頁占總內存的百分比 (
vm.dirty_expire_centisecs
:- 作用: 定義臟頁在內存中可停留的最長時間(以百分之一秒計),超過時間的臟頁會被周期性刷盤線程寫回磁盤。
- 優化場景: 控制臟頁存活時間。減少此值(如設為 500,即 5 秒)可以減少崩潰時潛在的數據丟失量;增大此值(如 3000,即 30 秒)可能合并更多寫操作,減少磁盤I/O次數(適合對數據一致性要求不那么極端實時、且寫入非常零碎的場景)。
fs.file-max
/fs.nr_open
:fs.file-max
: 系統級別允許打開的文件描述符最大總數。fs.nr_open
: 單個進程允許打開的文件描述符最大數。- 優化場景: 需要處理大量并發連接或打開大量文件的服務器(數據庫、Web服務器、代理服務器)。需要將此值調大(例如設置為幾十萬甚至上百萬),并且同時需要調整用戶進程的 ulimit (
nofile
) 限制。
重要提示
- 沒有萬能配置: 最佳配置極其依賴你的具體硬件、工作負載(是 CPU 密集型、內存密集型、網絡 I/O 密集型還是磁盤 I/O 密集型?)、應用類型(數據庫、Web 服務器、文件服務器、虛擬化宿主機?)。
- 循序漸進: 不要一次性修改大量參數。理解每個參數的作用,一次修改一兩個,并密切監控系統性能指標(使用
top
,vmstat
,iostat
,netstat
,ss
,sar
,dstat
等工具)和應用表現。 - 基準測試: 在應用重要變更前后進行基準測試,量化調整的效果。
- 備份: 修改關鍵配置文件前進行備份。
- 默認值: 大多數參數的默認值對于通用場景是合理的。優化通常是為了解決特定負載下的瓶頸。
- 文檔: 參考內核文檔 (
/usr/share/doc/kernel-doc-<version>/Documentation/sysctl/
或在線資源) 了解每個參數的詳細描述。 - 發行版差異: 不同 Linux 發行版及其不同版本的默認參數值可能有差異。
- 監控與驗證: 使用
sysctl -a | grep parameter_name
或cat /proc/sys/path/to/parameter
查看參數的當前運行值。
總結來說,內核調優的核心在于理解 /etc/sysctl.conf
和 /etc/sysctl.d/
目錄下的 .conf
文件的作用,并且根據你的服務器承擔的角色(Web服務器、數據庫、文件服務器等),有針對性地調整如網絡連接數參數 (somaxconn
, tcp_max_syn_backlog
)、TCP 連接復用參數 (tcp_tw_reuse
)、內存交換傾向 (vm.swappiness
)、臟頁刷盤策略 (dirty_ratio
, dirty_background_ratio
) 以及文件描述符限制 (file-max
) 等關鍵參數。務必在調整前后進行性能監控和測試。