1. 程式人生 > 實用技巧 >Linux核心優化實戰(sysctl.conf和ulimits)

Linux核心優化實戰(sysctl.conf和ulimits)

一、sysctl.conf優化

簡介:Linux系統核心引數的配置檔案為/etc/sysctl.conf和/etc/sysctl.d/目錄。其讀取順序為:/etc/sysctl.d/下面的檔案按照字母排序;然後讀取/etc/sysctl.conf。

一般所有對系統對修改引數放在/etc/sysctl.d/目錄,系統原有對sysctl.conf檔案儲存一些更加基礎對配置。

sysctl.conf可優化引數如下:

fs.file-max = 65535

 

# 減少交換記憶體使用,預設60,建議10-30

vm.swappiness = 30

 

# 髒資料的比例和處理,根據場景不同設定

# 參考 https://lonesysadmin.net/2013/12/22/better-linux-disk-caching-performance-vm-dirty_ratio/

# 如果是資料庫伺服器,希望資料能夠儘快安全寫入,可降低記憶體快取比例

# vm.dirty_background_ratio = 5

# vm.dirty_ratio = 10

 

# 如果是業務伺服器,對資料安全寫入無要求,可加大記憶體快取比例

# vm.dirty_background_ratio = 50

# vm.dirty_ratio = 80

 

# 設定為1,核心允許分配所有的實體記憶體,Redis常用

vm.overcommit_momory = 1

 

# 系統擁有的記憶體數,ElasticSearch啟動必備

vm.max_map_count = 262144

 

# 設定為1

net.ipv4.tcp_no_metrics_save = 1

 

# 禁用 sysrq 功能

kernel.sysrq = 0

 

# 控制 core 檔案的檔名中是否新增 pid 作為擴充套件

kernel.core_uses_pid = 1

 

# 設定為1, 防止 SYN FlOOD 攻擊

net.ipv4.tcp_syncookies = 1

 

# 訊息佇列的最大訊息大小,預設8k,建議64kb

kernel.msgmax = 65536

# 訊息佇列存放訊息的總位元組數

kernel.msgmnb = 163840

 

# TIME_WAIT socker的最大數目,不宜太大或者太小,nginx反向代理必備

net.ipv4.tcp_max_tw_buckets = 50000

# 開啟 SACK  選項,設定為1

net.ipv4.tcp_sack = 1

# 啟用視窗擴充因子,支援64kb以上資料傳輸

net.ipv4.tcp_window_scaling = 1

 

# TCP 緩衝區記憶體,連線數達到非常高時候需要配置好

net.ipv4.tcp_mem = 786432 2097152 3145728

net.ipv4.tcp_rmem = 4096 4096 16777216

net.ipv4.tcp_wmem = 4096 4096 16777216

 

# socket 緩衝區預設值和最大值

net.core.wmem_default = 8388608

net.core.rmem_default = 8388608

net.core.rmem_max = 16777216

net.core.wmem_max = 16777216

 

# ACCEPT 等待佇列長度,適當,太大了堆積也無用

net.core.netdev_max_backlog = 65535

 

# 允許最大併發連線數,重要

net.core.somaxconn = 65535

 

# 不屬於任何程序的socket數目,不宜太大,防止攻擊

net.ipv4.tcp_max_orphans = 65535

 

# SYNC等待佇列長度,適當,太大了排隊也沒用

net.ipv4.tcp_max_syn_backlog = 65535

 

# 禁用timestamp,重要,高併發下設定為0

net.ipv4.tcp_timestamps = 0

 

# 傳送SYNC+ACK 的重試次數,不宜太大,5以內

net.ipv4.tcp_synack_retries = 1

# 傳送SYNC的重試次數,不宜太大,5以內

net.ipv4.tcp_syn_retries = 1

 

# 允許回收TCP連線,重要,必須為1

net.ipv4.tcp_tw_recycle = 1

 

# 允許重用TCP連線,重要,必須為1

net.ipv4.tcp_tw_reuse = 1

 

# 服務端主動關閉後,客戶端釋放連線的超時,重要,<30

net.ipv4.tcp_fin_timeout = 5

 

# 允許TCP連線保持的空閒keepalive時長,不需要太長

net.ipv4.tcp_keepalive_time = 30

 

# 系統作為TCP客戶端連線自動使用的埠(start,end),可發起併發連線數為end-start

net.ipv4.ip_local_port_range = 10240 65535

執行sysctl -p 過載配置

[tips] 常用指令:sysctl -a | grep <引數名> 可查詢當前引數值

核心優化指令碼

# 禁用大記憶體頁面 Transparent Huge Pages for Redis/MongoDB,預設是always
echo "never" > /sys/kernel/mm/transparent_hugepage/enabled

二、ulimits優化

設定開啟檔案的最大數量(檔案描述符),按需修改最大數值。

編輯/etc/security/limits.conf,新增或替換下面幾行程式碼到檔案結尾:

root hard nofile 65535
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535

斷開SSH並重新SSH連線伺服器,輸入下面的命令檢查是否生效:

ulimit -a

對於程序來說,重啟就能使其生效。