sysctl -a?命令會列出當前Linux內核所有可配置的參數及其當前值。這些參數允許你在系統運行時動態地調整內核的行為,而無需重新編譯內核或重啟系統。
內容非常多,因為內核有很多可調的方面。我們可以把它們大致分為幾個主要類別:
-
kernel.*: 內核核心參數
-
vm.*: 虛擬內存管理 (Virtual Memory)
-
net.*: 網絡相關參數 (Networking)
-
fs.*: 文件系統相關參數 (File System)
-
dev.*: 特定設備參數
-
abi.*: 應用程序二進制接口 (Application Binary Interface)
-
user.*: 用戶命名空間限制
下面我會對每一類進行解釋,并列舉一些常見的、重要的參數:
1.?kernel.*?(內核核心參數)
這類參數控制著內核的許多基本行為。
-
kernel.hostname = your_hostname
-
解釋: 系統的主機名。
-
-
kernel.domainname = (none)
-
解釋: 系統的 NIS/YP 域名。
-
-
kernel.ostype = Linux
-
解釋: 操作系統類型。
-
-
kernel.osrelease = 5.15.0-76-generic?(示例版本號)
-
解釋: 操作系統內核版本號。
-
-
kernel.version = #83~20.04.1-Ubuntu SMP Mon Jun 5 11:53:06 UTC 2023?(示例)
-
解釋: 內核編譯的具體版本信息,包括編譯日期等。
-
-
kernel.panic = 0
-
解釋: 當內核發生嚴重錯誤 (panic) 時,系統在多少秒后自動重啟。0 表示不自動重啟。
-
-
kernel.panic_on_oops = 1
-
解釋: 當內核發生 oops (一種不那么嚴重的錯誤,但仍有問題) 時是否觸發 panic。
-
-
kernel.shmmax = 18446744073692774399?(示例,非常大的值)
-
解釋: 單個共享內存段的最大尺寸(字節)。對數據庫等應用很重要。
-
-
kernel.shmall = 18446744073692774399?(示例,非常大的值)
-
解釋: 系統范圍內共享內存總頁數。
-
-
kernel.shmmni = 4096
-
解釋: 系統范圍內共享內存段的最大數量。
-
-
kernel.msgmax = 65536
-
解釋: 單個消息隊列中消息的最大字節數。
-
-
kernel.msgmnb = 65536
-
解釋: 單個消息隊列的最大字節數。
-
-
kernel.msgmni = 32000
-
解釋: 系統中消息隊列標識符的最大數量。
-
-
kernel.sem = 250 32000 32 128
-
解釋: System V 信號量參數 (SEMMSL, SEMMNS, SEMOPM, SEMMNI)。
-
-
kernel.sysrq = 1
-
解釋: 是否啟用 "Magic SysRq key"。這是一個調試工具,允許通過特定組合鍵直接向內核發送命令。
-
-
kernel.pid_max = 32768
-
解釋: 系統中進程ID的最大值。
-
-
kernel.core_pattern = |/usr/share/apport/apport %p %s %c %d %P %E?(Ubuntu 特有)
-
解釋: 當程序崩潰產生 core dump 文件時,文件的命名模式或處理程序。Ubuntu 使用 apport 來收集崩潰報告。
-
-
kernel.randomize_va_space = 2
-
解釋: 地址空間布局隨機化 (ASLR) 的級別,用于增強安全性。2 表示完全隨機化。
-
-
kernel.threads-max = ...
-
解釋: 系統支持的最大線程數。
-
2.?vm.*?(虛擬內存管理)
這類參數控制內核如何管理內存,包括物理內存和交換空間 (swap)。
-
vm.swappiness = 60
-
解釋: 內核使用交換空間的積極程度。值從 0 到 100。0 表示盡可能不使用 swap,100 表示積極使用 swap。默認 60。服務器上如果有足夠內存,可以適當調低。
-
-
vm.dirty_background_ratio = 10
-
解釋: 當臟頁 (已修改但未寫入磁盤的內存頁) 占總可用內存的百分比達到此值時,內核后臺進程開始將臟頁寫回磁盤。
-
-
vm.dirty_ratio = 20
-
解釋: 當臟頁占總可用內存的百分比達到此值時,進行寫操作的進程會被阻塞,直到足夠的臟頁被寫回磁盤。
-
-
vm.vfs_cache_pressure = 100
-
解釋: 內核回收用于目錄和inode緩存的內存的傾向性。值越大,回收越積極。
-
-
vm.overcommit_memory = 0
-
解釋: 內存分配策略。
-
0: 內核執行啟發式內存過量分配處理,通常會允許適度的過量分配,但如果明顯超出,則會拒絕。
-
1: 內核總是允許過量分配,不進行檢查。
-
2: 內核不允許過量分配超過?(SwapTotal + RAM * vm.overcommit_ratio / 100)?的內存。
-
-
-
vm.overcommit_ratio = 50
-
解釋: 當?vm.overcommit_memory?設置為 2 時,允許過量分配的物理內存百分比。
-
-
vm.min_free_kbytes = ...
-
解釋: 強制Linux VM保留的最小可用千字節數。確保系統在內存緊張時仍能執行關鍵操作。
-
-
vm.nr_hugepages = 0
-
解釋: 配置的巨頁 (Huge Pages) 數量。巨頁可以提高某些高性能應用的內存性能。
-
3.?net.*?(網絡相關參數)
這是非常大的一類,通常會進一步細分為?net.ipv4.*,?net.ipv6.*,?net.core.*?等。
net.core.*?(核心網絡參數)
-
net.core.somaxconn = 128?(默認可能較低, 建議調高)
-
解釋: TCP監聽隊列的最大長度。對于高并發服務器,這個值需要調大 (例如 1024, 4096 或更高)。
-
-
net.core.netdev_max_backlog = 1000
-
解釋: 當網絡接口接收數據包的速度快于內核處理的速度時,允許排隊的最大數據包數量。
-
-
net.core.rmem_default = 212992
-
解釋: TCP套接字接收緩沖區的默認大小。
-
-
net.core.wmem_default = 212992
-
解釋: TCP套接字發送緩沖區的默認大小。
-
-
net.core.rmem_max = ...
-
解釋: TCP套接字接收緩沖區的最大大小。
-
-
net.core.wmem_max = ...
-
解釋: TCP套接字發送緩沖區的最大大小。
-
net.ipv4.*?(IPv4 特定參數)
-
net.ipv4.ip_forward = 0
-
解釋: 是否啟用IPv4轉發 (即作為路由器)。0 為禁用,1 為啟用。
-
-
net.ipv4.tcp_syncookies = 1
-
解釋: 是否啟用 SYN Cookies。當 SYN 隊列溢出時,可以幫助防御 SYN Flood 攻擊。
-
-
net.ipv4.tcp_tw_reuse = 0?(或 1)
-
解釋: 是否允許將 TIME_WAIT 狀態的套接字重新用于新的 TCP 連接。通常在客戶端或負載均衡器上設置為 1,可以快速回收端口。
-
-
net.ipv4.tcp_tw_recycle = 0?(已廢棄且不推薦使用)
-
解釋: 是否快速回收 TIME_WAIT 狀態的套接字。注意:此參數在高版本內核中已移除或不建議使用,因為它可能導致NAT環境下的問題。通常應保持禁用 (0)。
-
-
net.ipv4.tcp_fin_timeout = 60
-
解釋: 對于已關閉的本地 TCP 連接,保持在 FIN_WAIT_2 狀態的時間。
-
-
net.ipv4.tcp_keepalive_time = 7200
-
解釋: TCP 發送 keepalive 消息的頻率 (秒)。
-
-
net.ipv4.tcp_keepalive_intvl = 75
-
解釋: 當 keepalive探測未得到響應時,重試發送的間隔時間 (秒)。
-
-
net.ipv4.tcp_keepalive_probes = 9
-
解釋: 在斷定連接失效前,發送 keepalive 探測的次數。
-
-
net.ipv4.ip_local_port_range = 32768 60999
-
解釋: 本地TCP/UDP端口的可用范圍 (用于客戶端連接或服務器的臨時端口)。
-
-
net.ipv4.tcp_max_syn_backlog = ...
-
解釋: 未完成連接(SYN_RECV狀態)的隊列最大長度。
-
-
net.ipv4.tcp_congestion_control = cubic?(或 bbr)
-
解釋: TCP 擁塞控制算法。cubic?是默認的,bbr?是Google開發的較新算法,在高延遲或有丟包的網絡中表現可能更好。
-
-
net.ipv4.conf.all.accept_redirects = 0
-
net.ipv4.conf.default.accept_redirects = 0
-
解釋: 是否接受 ICMP 重定向報文。出于安全考慮,通常設置為 0。
-
-
net.ipv4.conf.all.secure_redirects = 1
-
解釋: 是否只接受來自網關列表中的主機的ICMP安全重定向。
-
-
net.ipv4.conf.all.send_redirects = 1?(如果是路由器則為1,否則為0)
-
解釋: 是否發送 ICMP 重定向報文。
-
-
net.ipv4.conf.all.rp_filter = 1?(或 2)
-
解釋: 反向路徑過濾,用于防止 IP 欺騙。1 為嚴格模式,2 為松散模式。
-
net.ipv6.*?(IPv6 特定參數)
-
與 IPv4 類似,但針對 IPv6。例如:
-
net.ipv6.conf.all.forwarding = 0
-
net.ipv6.conf.all.accept_redirects = 0
-
net.ipv6.conf.all.disable_ipv6 = 0?(0 表示啟用IPv6, 1 表示禁用指定接口的IPv6)
-
net.ipv6.conf.default.disable_ipv6 = 0
-
4.?fs.*?(文件系統相關參數)
-
fs.file-max = ...
-
解釋: 系統級別的文件句柄最大數量(所有進程打開的文件總數)。
-
-
fs.nr_open = 1048576
-
解釋: 單個進程可以分配的文件句柄的最大數量(這個值受限于?fs.file-max?和?ulimit)。
-
-
fs.inotify.max_user_watches = 8192?(默認可能較低)
-
解釋: 每個用戶可以創建的 inotify watch 的最大數量。當使用像 VS Code、文件同步工具等監視大量文件變化的程序時,可能需要調大此值。
-
-
fs.inotify.max_user_instances = 128
-
解釋: 每個用戶可以創建的 inotify 實例的最大數量。
-
-
fs.aio-max-nr = 65536
-
解釋: 系統中異步I/O請求的最大數量。
-
5.?dev.*?(特定設備參數)
-
這些參數通常是針對特定類型的設備或驅動程序的。例如,你可能會看到與特定網絡接口卡 (NIC)、CD-ROM 或其他硬件相關的參數。
-
例如:?dev.cdrom.info,?dev.mac_hid.*
-
一般情況下,用戶很少直接調整這些參數,它們通常由驅動程序或更高級別的工具管理。
6.?abi.*?(應用程序二進制接口)
-
abi.vsyscall32 = 1
-
解釋: 是否啟用 32 位應用程序的 vsyscall 仿真。通常不需要修改。
-
7.?user.*?(用戶命名空間限制)
-
這些參數用于控制用戶命名空間 (user namespaces) 的資源限制,這是一個用于容器化和權限隔離的 Linux 特性。
-
例如:
-
user.max_user_namespaces = ...
-
user.max_mnt_namespaces = ...
-
如何理解和使用這些參數?
-
大部分參數不需要修改: 對于大多數桌面用戶和許多服務器場景,默認值已經足夠好。
-
按需調整: 只有當你遇到特定的性能瓶頸、安全需求或應用兼容性問題時,才考慮調整這些參數。
-
查閱文檔: 在修改任何參數之前,務必查閱相關文檔(如?man sysctl.conf,內核文檔?Documentation/sysctl/?目錄下的文件,或在線資源)來理解其確切含義和潛在影響。
-
臨時修改:
sudo sysctl -w parameter.name=value
這種修改在系統重啟后會丟失。 -
永久修改:
-
編輯?/etc/sysctl.conf?文件。
-
或者,在?/etc/sysctl.d/?目錄下創建一個新的?.conf?文件 (例如?99-custom.conf)。
-
格式為?parameter.name = value。
-
修改后,執行?sudo sysctl -p?或?sudo sysctl --system?來使配置生效(-p?只加載指定文件,通常是?/etc/sysctl.conf;--system?會加載所有?/etc/sysctl.d/*.conf?和?/etc/sysctl.conf)。
-
-
逐步調整和測試: 不要一次修改太多參數。修改一個或一組相關的參數后,進行測試,觀察系統行為和性能,確保沒有負面影響。
sysctl -a?的輸出非常龐大,但通過分類和關注其中一些關鍵參數,你就能更好地理解你的 Ubuntu 系統是如何運行和配置的。希望這個解釋對你有幫助!