面試官問你:我想優(yōu)化 Linux 內核參數(shù),你有哪些建議呢?
引言
關于內核這方面確實很想分享下,因為工作中還有面試中這都算是一個大頭了,把下面的掌握了,面試基本沒什么大問題了。
開始
1. 內存管理優(yōu)化
vm.swappiness
? 作用: 控制內核在物理內存使用滿時,交換(swap)到磁盤的頻率。數(shù)值越高,越傾向于交換數(shù)據(jù),數(shù)值越低,內存壓力更大時才會進行交換。
? 推薦值: 通常設置為 10-60(默認 60),對于內存密集型應用(如數(shù)據(jù)庫)建議將此值設低。
? 命令: sysctl -w vm.swappiness=10
vm.dirty_background_ratio 和 vm.dirty_ratio
? 作用: 控制臟頁(dirty pages,已修改但未寫回磁盤的數(shù)據(jù))的最大比例。vm.dirty_background_ratio 定義了系統(tǒng)開始將臟頁刷寫到磁盤的觸發(fā)閾值,而 vm.dirty_ratio 則是寫操作的上限。
? 推薦值: vm.dirty_background_ratio = 10,vm.dirty_ratio = 20-40
? 命令:
sysctl -w vm.dirty_background_ratio=10
sysctl -w vm.dirty_ratio=20
vm.min_free_kbytes
? 作用: 指定內核保留的一定量的內存,用于防止系統(tǒng)內存完全耗盡,避免系統(tǒng)進入 OOM(Out of Memory)狀態(tài)。
? 推薦值: 通常設置為系統(tǒng)總內存的 1%-2%,也可以根據(jù)系統(tǒng)實際情況調整。
? 命令: sysctl -w vm.min_free_kbytes=65536
vm.overcommit_memory
? 作用: 控制內存分配的策略。該參數(shù)有三個值:
? 推薦值: vm.overcommit_memory = 2 適用于大部分生產(chǎn)環(huán)境,特別是在運行數(shù)據(jù)庫等內存密集型應用時。
? 命令: sysctl -w vm.overcommit_memory=2
2. 進程調度優(yōu)化
kernel.sched_latency_ns
? 作用: 控制調度器延遲(任務調度時的最大延遲)。該參數(shù)決定了調度器在處理實時任務時的延遲。
? 推薦值: 適用于需要低延遲的場景,默認值通常已足夠。
? 命令: sysctl -w kernel.sched_latency_ns=5000000(5ms)
kernel.sched_min_granularity_ns
? 作用: 控制 CPU 時間片的最小粒度。該參數(shù)決定了調度器給每個任務分配的最小時間。
? 推薦值: sysctl -w kernel.sched_min_granularity_ns=20000000(20ms)
kernel.sched_wakeup_granularity_ns
? 作用: 定義一個進程被喚醒時,它被重新調度的時間間隔。適用于減少高負載系統(tǒng)中的上下文切換。
? 推薦值: sysctl -w kernel.sched_wakeup_granularity_ns=15000000(15ms)
kernel.sched_tunable_scaling
? 作用: 啟用動態(tài)調整調度器參數(shù)的功能,用于自動根據(jù)系統(tǒng)負載優(yōu)化調度器行為。
? 推薦值: sysctl -w kernel.sched_tunable_scaling=1
3. 文件系統(tǒng)優(yōu)化
vm.vfs_cache_pressure
? 作用: 控制內核回收用于緩存的內存。當該值較大時,內核會傾向于回收更多的緩存,較小的值則保留更多的緩存。
? 推薦值: 通常設置為 50(默認 100),在文件系統(tǒng)緩存非常重要的情況下,可以降低該值。
fs.file-max
? 作用: 定義系統(tǒng)允許的最大文件描述符數(shù)量。對于大并發(fā)應用或數(shù)據(jù)庫應用,可能需要增加此值。
? 推薦值: 可以根據(jù)應用需求進行調整,默認通常為 1,000,000。
? 命令: sysctl -w fs.file-max=2097152
4. 網(wǎng)絡性能優(yōu)化
net.core.somaxconn
? 作用: 控制系統(tǒng)允許的最大連接請求隊列長度。該值決定了在 TCP 連接請求被處理之前,最大允許的掛起請求數(shù)量。
? 推薦值: sysctl -w net.core.somaxconn=1024
net.ipv4.tcp_rmem 和 net.ipv4.tcp_wmem
? 作用: 分別控制 TCP 接收和發(fā)送緩沖區(qū)的最小、默認和最大大小。這對于高帶寬網(wǎng)絡應用至關重要。
? 推薦值: sysctl -w net.ipv4.tcp_rmem="4096 87380 16777216"
? 命令: sysctl -w net.ipv4.tcp_wmem="4096 87380 16777216"
net.core.netdev_max_backlog
? 作用: 設置網(wǎng)絡接口的最大接收隊列。如果網(wǎng)絡流量很大,設置較大的值可以避免丟包。
? 推薦值: sysctl -w net.core.netdev_max_backlog=5000
net.ipv4.tcp_fin_timeout
? 作用: 控制 TCP 連接在關閉時的等待時間。減小此值可以加速連接的關閉,減少過多的 TCP 連接狀態(tài)。
? 推薦值: sysctl -w net.ipv4.tcp_fin_timeout=30
net.ipv4.tcp_tw_reuse
? 作用: 允許重用 TIME_WAIT 狀態(tài)的 TCP 連接,減少對系統(tǒng)資源的消耗,尤其是在高并發(fā)場景下。
? 推薦值: sysctl -w net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_max_syn_backlog
? 作用: 控制內核在 TCP 連接建立時,最大等待處理的 SYN 包隊列長度。如果應用程序需要處理大量的 TCP 連接,增大該值可以提升 TCP 性能。
? 推薦值: sysctl -w net.ipv4.tcp_max_syn_backlog=4096
? 命令:
sysctl -w net.ipv4.tcp_max_syn_backlog=4096
5. 系統(tǒng)性能優(yōu)化
kernel.shmmax 和 kernel.shmall
? 作用: 分別控制系統(tǒng)允許的最大共享內存段大小和系統(tǒng)總的共享內存頁數(shù)。在處理數(shù)據(jù)庫和大規(guī)模數(shù)據(jù)處理時,這兩個參數(shù)的調優(yōu)尤為重要。
? 推薦值: 根據(jù)內存大小和應用需求設置,通常設置為物理內存的 50%-75%。
? 命令:
sysctl -w kernel.shmmax=2147483648
sysctl -w kernel.shmall=2097152
fs.inotify.max_user_watches
? 作用: 控制系統(tǒng)中可用的最大 inotify 監(jiān)聽器數(shù)目。增加該值可以幫助增強監(jiān)控能力,尤其在大量文件監(jiān)控的場景下。
? 推薦值: sysctl -w fs.inotify.max_user_watches=524288
6. I/O 性能優(yōu)化
vm.dirty_background_bytes 和 vm.dirty_bytes
? 作用: 控制在將數(shù)據(jù)寫入磁盤之前,內核將保持多大的臟數(shù)據(jù)。vm.dirty_background_bytes 控制后臺刷寫臟數(shù)據(jù)的閾值,vm.dirty_bytes 控制刷寫的最大數(shù)據(jù)量。調整這兩個參數(shù)可以優(yōu)化磁盤的寫入性能。
? 推薦值: 將 vm.dirty_bytes 設置為更高的值,避免頻繁刷寫;而將 vm.dirty_background_bytes 設置為較小的值,確保系統(tǒng)能夠及時將臟數(shù)據(jù)刷回磁盤。
? 命令:
sysctl -w vm.dirty_background_bytes=134217728 # 128MB
sysctl -w vm.dirty_bytes=268435456 # 256MB
block.mq-deadline(I/O 調度器)
? 作用: 在進行磁盤 I/O 操作時,調整調度器策略,mq-deadline 調度器適用于需要低延遲和高吞吐量的應用程序,特別是數(shù)據(jù)庫和文件服務器。
? 推薦值: 將調度器設置為 mq-deadline 可以提升磁盤的讀寫性能。
? 命令:
echo mq-deadline > /sys/block/sda/queue/scheduler
fs.aio-max-nr
? 作用: 控制系統(tǒng)允許的最大異步 I/O 請求數(shù)。在高并發(fā)的場景下,增加該參數(shù)的值有助于提升 I/O 請求的吞吐能力。
? 推薦值: sysctl -w fs.aio-max-nr=1048576 以支持更多并發(fā)的 I/O 操作。
? 命令:
sysctl -w fs.aio-max-nr=1048576
7. CPU 性能優(yōu)化
kernel.sched_min_granularity_ns
? 作用: 調整調度器為每個任務分配的最小時間片。較大的值可以減少上下文切換,提高吞吐量;較小的值則增加系統(tǒng)響應性。
? 推薦值: sysctl -w kernel.sched_min_granularity_ns=20000000 (20ms)
? 命令:
sysctl -w kernel.sched_min_granularity_ns=20000000
kernel.sched_wakeup_granularity_ns
? 作用: 定義進程被喚醒時,它被重新調度的時間間隔。適用于減少高負載系統(tǒng)中的上下文切換。
? 推薦值: sysctl -w kernel.sched_wakeup_granularity_ns=15000000 (15ms)
? 命令:
sysctl -w kernel.sched_wakeup_granularity_ns=15000000
cpu.cpuacct.usage
? 作用: 控制 CPU 使用時間的跟蹤。增加該值可以用于高負載的多核系統(tǒng)中進行細粒度監(jiān)控,幫助更精確地了解每個 CPU 核心的資源使用情況。
? 推薦值: 該參數(shù)一般用于監(jiān)控,不是直接的優(yōu)化參數(shù),但對于負載均衡和監(jiān)控系統(tǒng)非常有用。
8. 文件系統(tǒng)優(yōu)化
fs.file-max
? 作用: 控制系統(tǒng)中允許的最大文件句柄數(shù)量。對于高并發(fā)的系統(tǒng),尤其是 Web 服務器和數(shù)據(jù)庫服務器,需要增加文件句柄數(shù)量。
? 推薦值: sysctl -w fs.file-max=2097152
? 命令:
sysctl -w fs.file-max=2097152
fs.inotify.max_user_watches
? 作用: 控制用戶可監(jiān)控的最大文件數(shù)。對于需要大量文件監(jiān)控的場景(如容器管理、日志管理等),增加該值可以提高性能。
? 推薦值: sysctl -w fs.inotify.max_user_watches=524288
? 命令:
sysctl -w fs.inotify.max_user_watches=524288
9. 安全優(yōu)化
kernel.randomize_va_space
? 作用: 啟用地址空間布局隨機化(ASLR),增加系統(tǒng)的安全性,防止攻擊者猜測內存布局。
? 推薦值: sysctl -w kernel.randomize_va_space=2
? 命令:
sysctl -w kernel.randomize_va_space=2
fs.suid_dumpable
? 作用: 控制是否允許執(zhí)行 setuid 程序時轉儲 core 文件。為了提高安全性,建議將其設置為 0(不允許轉儲)。
? 推薦值: sysctl -w fs.suid_dumpable=0
? 命令:
sysctl -w fs.suid_dumpable=0
10. 內核參數(shù)和系統(tǒng)資源
kernel.shmmax 和 kernel.shmall
? 作用: 控制共享內存的最大值。適用于需要大量共享內存的應用,如數(shù)據(jù)庫。
? 推薦值: 設置為物理內存的 50%-75%,確保足夠的共享內存資源。
? 命令:
sysctl -w kernel.shmmax=2147483648 # 2GB
sysctl -w kernel.shmall=2097152 # 對應 2GB
kernel.msgmni
? 作用: 控制內核消息隊列的最大數(shù)量。對于消息密集型應用,如 IPC 或消息隊列系統(tǒng),可以調整此值。
? 推薦值: sysctl -w kernel.msgmni=1024
? 命令:
sysctl -w kernel.msgmni=1024
11. 高階 Linux 內核優(yōu)化參數(shù)
kernel.sched_child_runs_first
? 作用: 控制任務的子進程是否優(yōu)先調度。當該參數(shù)設置為 1 時,子進程會比父進程優(yōu)先調度,主要用于需要高并發(fā)子任務處理的應用場景。
? 推薦值: 對于計算密集型任務,通常保持默認值 0,但在多核環(huán)境下,可能會使用該值提高子進程的調度優(yōu)先級。
? 命令:
sysctl -w kernel.sched_child_runs_first=1
kernel.sched_idle
? 作用: 控制 Linux 調度器是否允許低優(yōu)先級任務在空閑時運行。啟用此參數(shù)時,系統(tǒng)會給空閑任務分配 CPU 時間,適用于不需要及時響應的后臺作業(yè)。
? 推薦值: 一般在空閑時間任務較多的環(huán)境中使用。默認 0 不啟用,只有在有空閑計算需求時啟用。
? 命令:
sysctl -w kernel.sched_idle=1
vm.page-cluster
? 作用: 控制內核一次回收多少個頁面進行交換。增大該值可以減少交換的次數(shù),從而提升內存效率,適用于內存密集型的應用。
? 推薦值: 默認值通常為 3,增大該值可以提高高負載環(huán)境下的性能,尤其是數(shù)據(jù)庫和大數(shù)據(jù)處理。
? 命令:
sysctl -w vm.page-cluster=5
net.core.optmem_max
? 作用: 控制網(wǎng)絡套接字接收緩沖區(qū)的最大內存使用量。這個參數(shù)可以用來控制接收緩存的大小,對于高流量的網(wǎng)絡應用非常重要。
? 推薦值: 對于高負載的 Web 服務或數(shù)據(jù)庫服務器,可以增大此值。
? 命令:
sysctl -w net.core.optmem_max=25165824 # 24MB
kernel.sysrq
? 作用: 控制 sysrq 按鍵的功能,用于調試和管理系統(tǒng)。通過啟用該功能,管理員可以在系統(tǒng)出現(xiàn)問題時執(zhí)行緊急任務,例如重啟或查看內存。
? 推薦值: 在需要遠程恢復和緊急處理的場景下可以啟用該功能。一般情況下可以禁用或限制。
? 命令:
sysctl -w kernel.sysrq=1 # 啟用 sysrq 功能
net.ipv4.tcp_max_tw_buckets
? 作用: 控制 TCP 協(xié)議棧中 TIME-WAIT 狀態(tài)的最大桶數(shù)。當連接被關閉后,TCP 會進入 TIME-WAIT 狀態(tài),增加該值有助于高并發(fā)系統(tǒng)處理更多的連接。
? 推薦值: 對于需要處理大量 TCP 連接的環(huán)境,增大此值可以減少連接過多導致的性能瓶頸。
? 命令:
sysctl -w net.ipv4.tcp_max_tw_buckets=1000000
net.ipv4.tcp_fin_timeout
? 作用: 控制 TCP 連接處于 FIN-WAIT-2 狀態(tài)的最大時間。該參數(shù)對短時間內頻繁建立和關閉連接的應用程序(如高并發(fā)的 Web 服務器)非常重要。
? 推薦值: 減小該值可以更快地關閉連接并釋放資源。
? 命令:
sysctl -w net.ipv4.tcp_fin_timeout=15 # 縮短連接關閉等待時間
net.ipv4.tcp_retries2
? 作用: 控制 TCP 連接在重試失敗后最大重試次數(shù)。適用于需要降低 TCP 連接恢復延遲的場景,尤其是在高丟包率的網(wǎng)絡環(huán)境下。
? 推薦值: 通常設置為 8-15,但對于對時延要求較低的應用,可以適當降低此值。
? 命令:
sysctl -w net.ipv4.tcp_retries2=8
fs.file-max
? 作用: 控制 Linux 系統(tǒng)中所有進程可以打開的最大文件描述符數(shù)。對于數(shù)據(jù)庫、Web 服務器或其他高并發(fā)服務,增加此值可以避免文件描述符耗盡。
? 推薦值: 根據(jù)應用的并發(fā)連接數(shù)調整,一般為 1,000,000 或更高。
? 命令:
sysctl -w fs.file-max=1000000
vm.dirty_expire_centisecs
? 作用: 控制內核將臟頁刷回磁盤的時間。較低的值可以使得系統(tǒng)在低內存時更早地寫回磁盤,防止內存過度使用,適用于大規(guī)模并發(fā)系統(tǒng)。
? 推薦值: 默認為 3000,適用于需要平衡內存和磁盤 I/O 的系統(tǒng)。
? 命令:
sysctl -w vm.dirty_expire_centisecs=2000 # 提前回寫臟頁
kernel.panic_on_oops
? 作用: 控制內核在遇到嚴重錯誤(如 Oops 錯誤)時是否自動重啟。啟用該功能可以在系統(tǒng)出現(xiàn)嚴重故障時自動恢復,避免人工干預。
? 推薦值: 對于生產(chǎn)環(huán)境中的關鍵系統(tǒng),啟用自動重啟功能有助于系統(tǒng)自動恢復。
? 命令:
sysctl -w kernel.panic_on_oops=1 # 啟用自動重啟
net.ipv6.bindv6only
? 作用: 控制 IPv6 套接字是否只綁定到 IPv6 地址。適用于需要區(qū)分 IPv4 和 IPv6 流量的應用程序。
? 推薦值: 根據(jù)具體的網(wǎng)絡需求設置此值,IPv4 和 IPv6 共存時可能需要禁用該選項。
? 命令:
sysctl -w net.ipv6.bindv6only=1 # 啟用 IPv6 僅綁定