Linux系統性能優化

目錄

Linux系統性能優化

一、性能優化概述

二、性能監控工具

1. 基礎工具

2. 高級工具

三、子系統優化策略

1. CPU優化

2. 內存優化

3. 磁盤I/O優化

4. 網絡優化

四、資源限制優化

1. ulimit

2. cgroups(控制組)

五、安全與注意事項

六、綜合案例

案例1:TCP連接數過高導致Web服務卡頓

問題描述

優化配置

驗證方法

案例2:Java應用內存溢出導致系統崩潰

問題描述

優化配置

驗證方法

案例3:磁盤I/O延遲導致數據庫性能下降

問題描述

優化配置

驗證方法

案例4:CPU競爭導致多線程應用性能差

問題描述

優化配置

驗證方法

案例5:網絡丟包導致視頻流傳輸卡頓

問題描述

優化配置

驗證方法

總結:優化配置原則



一、性能優化概述

  1. 目標:提升系統響應速度、資源利用率,避免瓶頸。

  2. 核心原則

    • 監控先行:先分析瓶頸,再針對性優化。

    • 逐步調整:避免一次性修改過多參數。

    • 穩定性優先:優化后需充分測試。


二、性能監控工具

1. 基礎工具

  • top / htop

    top ? ? ? ? ?# 實時查看CPU、內存、進程
    htop ? ? ? ? # 增強版(支持鼠標操作)
    • 關鍵指標%CPU(CPU占用)、%MEM(內存占用)、LOAD AVERAGE(系統負載)。

  • vmstat

    vmstat 1 ? ? # 每秒輸出一次系統狀態
    • 關鍵列

      • r:等待CPU的進程數(> CPU核數表示過載)。

      • si/so:Swap交換頻率(頻繁交換說明內存不足)。

  • iostat

    iostat -xz 1 # 查看磁盤I/O
    • 關鍵指標%util(磁盤利用率 >80% 表示瓶頸)、await(I/O等待時間)。

  • netstat / ss

    netstat -ant | grep ESTABLISHED | wc -l ?# 查看TCP連接數
    ss -s ? ? ? ?# 統計套接字信息

2. 高級工具

  • sar(系統活動報告)

    sar -u 1 3 ? ?# 查看CPU使用率(每秒1次,共3次)
    sar -r ? ? ? ?# 查看內存使用歷史
  • dstat

    dstat -cmsn ?# 綜合監控CPU、內存、網絡、磁盤

三、子系統優化策略

1. CPU優化

  • 調整進程優先級

    nice -n 19 ./script.sh ? # 啟動低優先級進程
    renice 19 -p PID ? ? ? ? # 修改運行中進程的優先級
  • 綁定CPU核心(減少上下文切換)

    taskset -c 0,1 ./program ?# 綁定到CPU0和CPU1
  • 內核參數調整

    # 修改/etc/sysctl.conf
    kernel.sched_child_runs_first = 1 ?# 子進程優先調度

2. 內存優化

  • 調整Swap使用策略

    # 修改/etc/sysctl.conf
    vm.swappiness = 10 ? ? ? ?# 降低Swap使用傾向(0-100,默認60)
    vm.vfs_cache_pressure = 50 # 減少inode緩存回收頻率
  • 禁用透明大頁(THP)

    echo never > /sys/kernel/mm/transparent_hugepage/enabled

3. 磁盤I/O優化

  • 選擇合適I/O調度器

    # 查看當前調度器
    cat /sys/block/sda/queue/scheduler
    # 臨時修改為deadline調度器(適用于SSD)
    echo deadline > /sys/block/sda/queue/scheduler
  • 文件系統優化(ext4)

    # 掛載參數:noatime(不記錄訪問時間), data=writeback
    UUID=xxx / ext4 defaults,noatime,data=writeback 0 1

4. 網絡優化

  • TCP參數調優

    # 修改/etc/sysctl.conf
    net.core.somaxconn = 4096 ? ? ? # 提高連接隊列長度
    net.ipv4.tcp_fin_timeout = 30 ? # 縮短TIME_WAIT超時
    net.ipv4.tcp_tw_reuse = 1 ? ? ? # 允許重用TIME_WAIT連接
    sysctl -p ?# 應用配置
  • 限制連接數

    # 使用iptables限制單IP連接數
    iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 50 -j DROP

四、資源限制優化

1. ulimit

  • 修改用戶級限制

    # 編輯/etc/security/limits.conf
    * soft nofile 65535    # 文件描述符軟限制
    * hard nofile 65535    # 硬限制
  • 生效方式:重啟會話或執行 ulimit -n 65535

2. cgroups(控制組)

  • 限制進程資源

    # 創建cgroup(需安裝cgroup-tools)
    cgcreate -g cpu,memory:/my_group
    # 限制CPU使用為50%
    cgset -r cpu.cfs_period_us=100000 -r cpu.cfs_quota_us=50000 my_group
    # 限制內存為1GB
    cgset -r memory.limit_in_bytes=1G my_group
    # 將進程加入cgroup
    cgexec -g cpu,memory:my_group ./program

五、安全與注意事項

  1. 備份配置文件:修改前備份 /etc/sysctl.conf/etc/security/limits.conf

  2. 灰度測試:先在測試環境驗證參數調整效果。

  3. 避免過度優化:如無明確瓶頸,優先使用默認配置。


六、綜合案例


案例1:TCP連接數過高導致Web服務卡頓

問題描述

Nginx服務器在高并發時出現 Too many open files 錯誤,TCP連接數超過默認限制。

優化配置

  1. 修改文件描述符限制

    # 編輯 /etc/security/limits.conf
    * soft nofile 65535
    * hard nofile 65535
    nginx soft nofile 65535   # 針對Nginx用戶單獨設置
  2. 調整Nginx配置

    # /etc/nginx/nginx.conf
    worker_rlimit_nofile 65535;  # 與limits.conf一致
    events {worker_connections 4096;   # 每個Worker進程連接數
    }
  3. 內核TCP參數優化

    # 編輯 /etc/sysctl.conf
    net.core.somaxconn = 65535     # 最大連接隊列
    net.ipv4.tcp_max_syn_backlog = 65535  # SYN隊列長度
    net.ipv4.tcp_tw_reuse = 1      # 重用TIME_WAIT連接
    net.ipv4.tcp_fin_timeout = 30  # 縮短FIN超時
    sysctl -p  # 生效配置

驗證方法

ss -lnt | grep 'LISTEN'   # 查看監聽隊列長度
cat /proc/$(pidof nginx)/limits | grep 'open files'  # 確認Nginx進程限制

案例2:Java應用內存溢出導致系統崩潰

問題描述

Tomcat服務頻繁觸發OOM(Out of Memory),且系統Swap使用率過高。

優化配置

  1. 限制JVM堆內存

    # 修改Tomcat啟動腳本 catalina.sh
    export JAVA_OPTS="-Xms2G -Xmx2G -XX:MaxMetaspaceSize=512M"
  2. 調整系統Swap策略

    # 編輯 /etc/sysctl.conf
    vm.swappiness = 10       # 降低Swap使用傾向
    vm.overcommit_memory = 1 # 允許超量分配內存(謹慎使用)
  3. 使用cgroups限制內存

    # 創建內存限制組
    cgcreate -g memory:/tomcat
    cgset -r memory.limit_in_bytes=4G /tomcat
    cgset -r memory.memsw.limit_in_bytes=6G /tomcat  # 物理內存+Swap總限制
    # 啟動Tomcat
    cgexec -g memory:tomcat /opt/tomcat/bin/startup.sh

驗證方法

free -h          # 查看內存和Swap使用
ps aux | grep tomcat  # 確認cgroup限制生效
cat /sys/fs/cgroup/memory/tomcat/memory.usage_in_bytes  # 查看內存占用

案例3:磁盤I/O延遲導致數據庫性能下降

問題描述

MySQL讀寫緩慢,iostat 顯示磁盤 %util 持續高于90%。

優化配置

  1. 切換I/O調度器

    # 臨時切換為deadline調度器(SSD推薦)
    echo deadline > /sys/block/sda/queue/scheduler
    # 永久生效(GRUB配置)
    vi /etc/default/grub
    GRUB_CMDLINE_LINUX_DEFAULT="elevator=deadline"
    update-grub  # Debian/Ubuntu
    grub2-mkconfig -o /boot/grub2/grub.cfg  # CentOS/RHEL
  2. 調整文件系統掛載參數

    # 編輯 /etc/fstab
    UUID=xxxx /data ext4 defaults,noatime,nodiratime,data=writeback 0 2
  3. MySQL配置優化

    # /etc/my.cnf
    innodb_flush_method = O_DIRECT     # 繞過內核緩存
    innodb_io_capacity = 2000          # SSD建議值
    innodb_buffer_pool_size = 8G       # 分配足夠緩沖池

驗證方法

cat /sys/block/sda/queue/scheduler  # 確認調度器
iostat -xm 1                        # 觀察%util和await變化
mysql> SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool%';  # 查看緩沖池命中率

案例4:CPU競爭導致多線程應用性能差

問題描述

Python多進程數據處理程序運行緩慢,top 顯示CPU在多個核心間頻繁切換。

優化配置

  1. 綁定進程到特定CPU核心

    # 使用taskset綁定到CPU0-3
    taskset -c 0-3 python3 data_processing.py
  2. 調整進程優先級

    nice -n -20 python3 high_priority_task.py  # 最高優先級(需root)
    renice -n 19 -p 1234   # 將運行中的PID=1234進程設為低優先級
  3. 禁用CPU節能模式

    # 安裝cpufrequtils(Debian/Ubuntu)
    apt install cpufrequtils
    # 設置為性能模式
    cpufreq-set -g performance -c 0  # 對每個CPU核心執行

驗證方法

mpstat -P ALL 1      # 查看各核心利用率
cpufreq-info         # 確認當前CPU頻率策略

案例5:網絡丟包導致視頻流傳輸卡頓

問題描述

視頻流服務器在傳輸大流量UDP數據時出現丟包,sar -n UDP 1 顯示 idgm/s(輸入數據報)超過網卡處理能力。

優化配置

  1. 增大Socket緩沖區

    # 編輯 /etc/sysctl.conf
    net.core.rmem_max = 67108864   # 接收緩沖區最大值(64MB)
    net.core.wmem_max = 67108864   # 發送緩沖區最大值
    net.core.netdev_max_backlog = 500000  # 網卡隊列長度
  2. 多隊列網卡優化

    # 啟用RSS(Receive Side Scaling)
    ethtool -L eth0 combined 8     # 設置8個隊列(需網卡支持)
    # 綁定IRQ到不同CPU核心
    vi /etc/rc.local
    /usr/bin/irqbalance --powerthresh=50  # 啟用IRQ平衡
  3. 應用層優化(FFmpeg示例)

    ffmpeg -i input -c copy -f mpegts udp://target:1234?buffer_size=4194304  # 增大發送緩沖區

驗證方法

ethtool -S eth0 | grep rx_dropped  # 查看丟包統計
sar -n UDP 1                       # 監控UDP報文狀態
cat /proc/interrupts | grep eth0   # 確認IRQ分布

總結:優化配置原則

  1. 精準定位瓶頸

    • 使用 perf top 分析CPU熱點。

    • 通過 dmesg 檢查內核OOM或I/O錯誤日志。

  2. 層級化調整

    層級工具/方法
    應用層代碼優化、連接池配置
    運行時JVM參數、Golang GC策略
    操作系統sysctl、cgroups、ulimit
    硬件/驅動升級SSD、調整RAID級別
  3. 自動化監控

    # 使用Prometheus + Grafana監控模板
    - node_exporter 采集系統指標  
    - alertmanager 配置CPU/內存閾值告警  

附:配置修改注意事項

  1. 備份原始文件

    cp /etc/sysctl.conf /etc/sysctl.conf.bak
  2. 分階段生效

    • 優先通過 sysctl -w 臨時修改測試。

    • 確認穩定后寫入配置文件。

  3. 回歸測試

    ab -n 10000 -c 500 http://localhost/  # ApacheBench壓力測試
    iperf3 -c target_ip -t 60            # 網絡帶寬測試

附:常用命令速查表

命令作用
sar -u 1 3查看CPU使用率
vmstat 1監控內存和進程隊列
iostat -xz 1分析磁盤I/O瓶頸
ss -s統計TCP連接狀態

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/85776.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/85776.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/85776.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【streamlit streamlit中 顯示 mermaid 流程圖有兩種方式】

streamlit中顯示mermaid 流程圖有兩種方式 mermaind示例 code """ flowchart LRmarkdown["This **is** _Markdown_"]newLines["Line1Line 2Line 3"]markdown --> newLinesmarkdown["This **is** _Markdown_"]newLines[&quo…

Rust調用 DeepSeek API

Rust 實現類似 DeepSeek 的搜索工具 使用 Rust 構建一個高效、高性能的搜索工具需要結合異步 I/O、索引結構和查詢優化。以下是一個簡化實現的框架: 核心組件設計 索引結構 use std::collections::{HashMap, HashSet}; use tantivy::schema::{Schema, TEXT, STORED}; use …

Unity3D仿星露谷物語開發69之動作聲音

1、目標 Player動作時產生的聲音,比如砍倒樹木、砸石頭。 2、修復NPC快速行進的bug(與本節無關) 修改NPCMovement.cs腳本的MoveToGridPositionRoutine方法。 確保npcCalculatedSpeed的速度不少于最慢速度。 原代碼: 修改后的…

【Node.js 的底層實現機制】從事件驅動到異步 I/O

簡介 Node.js 作為 JavaScript 后端運行環境,其核心優勢在于高并發處理能力和非阻塞 I/O 模型。 特點: 高并發處理:單線程事件循環高效處理大量并發連接I/O 密集型任務:非阻塞 I/O 模型避免線程切換開銷,不適合 CPU…

nginx服務器配置時遇到的一些問題

京東云 CentOS 8.2 64位 Nginx配置文件修改后需要重啟或重載服務的原因以及不重啟的后果: ??工作進程不主動重讀配置??: Nginx采用master-worker多進程架構。master進程讀取配置文件并管理worker進程,worker進程處理實際請求。修改配置…

【論文閱讀 | CVPR 2024 |Fusion-Mamba :用于跨模態目標檢測】

論文閱讀 | CVPR 2024 |Fusion-Mamba :用于跨模態目標檢測 1.摘要&&引言2.方法2.1 預備知識2.2 Fusion-Mamba2.2.1 架構特征提取與多模態融合(FMB模塊)FMB的應用與輸出2.2.2 關鍵組件3.2.2.1 SSCS 模塊:淺層跨模態特征交互…

Nginx-Ingress-Controller自定義端口實現TCP/UDP轉發

背景1 使用deployment部署一個http服務,配合使用ingresstls的解析在ingress終止。 apiVersion: networking.k8s.io/v1 kind: Ingress metadata:annotations:name: test.comnamespace: rcs-netswitch-prod spec:defaultBackend:service:name: rcs-netswitch-prodpo…

基于Vue.js的圖書管理系統前端界面設計

一、系統前端界面設計要求與效果 (一)系統功能結構圖 設計一個基于Vue.js的圖書管理系統前端界面。要充分體現Vue的核心特性和應用場景,同時結合信息管理專業的知識。要求系統分為儀表盤、圖書管理、借閱管理和用戶管理四個主要模塊&#x…

Perplexity AI:對話式搜索引擎的革新者與未來認知操作系統

在信息爆炸的數字時代,傳統搜索引擎提供的海量鏈接列表已無法滿足用戶對高效、精準知識獲取的需求。Perplexity AI作為一款融合人工智能與實時網絡檢索的對話式搜索引擎,正通過技術創新重新定義人們獲取信息的方式。這家成立于2022年的硅谷初創企業&…

第七講 信號

1. 信號鋪墊 信號: Linux 系統提供的, 簡單輕量的, 用于向指定進程發送特定事件, 讓接受信號進程做識別和對應處理實現進程控制的一種異步通信機制. 1~31 普通信號 34 ~ 64 實時信號 信號概覽 下面是Linux系統中所有標準信號的名稱及其對應的數字: SIGHUP (1…

2025年滲透測試面試題總結-2025年HW(護網面試) 02(題目+回答)

安全領域各種資源,學習文檔,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具,歡迎關注。 目錄 2025年HW(護網面試) 02 1. 有趣的挖洞經歷 2. 高頻漏洞及修復方案 3. PHP/Java反序列化漏洞 4. 服務器入…

Odoo 18進階開發:打造專業級list,kanban視圖Dashboard

🎯 項目概述 在現代企業級應用中,數據可視化已成為提升用戶體驗的關鍵要素。Odoo 18 作為領先的企業資源規劃系統,為開發者提供了強大的視圖定制能力。本教程將帶您深入了解如何在list(列表)視圖和Kanban(…

LabVIEW儀表檢測

依托LabVIEW 圖形化開發平臺,集成 NI、Keysight、Fluke 等硬件,構建自動化儀表檢測工裝系統。方案覆蓋從二維碼識別、程序燒寫、多維度校準到數據管理的全流程自動化檢測,解決傳統人工檢測中效率低下(單卡檢測效率提升 62.5%&…

Java八股文——消息隊列「場景篇」

什么是消息隊列? 面試官您好,消息隊列(Message Queue, MQ),從本質上講,是一個實現了“先進先出”(FIFO)隊列數據結構的、專門用于在不同系統或服務之間進行可靠異步通信的中間件。 …

CTE vs 子查詢:深入拆解PostgreSQL復雜SQL的隱藏性能差異

1 SQL優化的關鍵抉擇 在PostgreSQL數據庫性能優化領域,CTE(公共表表達式) 和子查詢的選擇往往決定了復雜SQL查詢的執行效率。許多開發者習慣性地認為兩者功能等價,但實際執行路徑卻存在顯著差異。本文將深入剖析兩者的底層機制&a…

【fargo】x264的intra refresh 1:編碼

【fargo】x264的intra refresh 2:識別NAL類型、 NAL slice header 解析器大神的理論分析: H264Encoder 編碼輸出一幀 D:\XTRANS\thunderbolt\ayame\zhb-bifrost\player-only\echo\codec\x264\echo_h264_encoder.cppbool H264Encoder::encode

npm下載離線依賴包

項目中需要用到mermaid以來,使用npm安裝: npm install mermaid 但是客戶現場是離線環境,無法直接使用npm install mermaid安裝,所以需要考慮下載離線依賴包,命令為: npm pack mermaid 下載后&#xff1…

【教程】不同架構(armv7l等)下載Miniconda安裝包

轉載請注明出處:小鋒學長生活大爆炸[xfxuezhagn.cn] 如果本文幫助到了你,歡迎[點贊、收藏、關注]哦~ 目錄 armv7l架構 aarch、arm、x86架構 armv7l架構 wget http://repo.continuum.io/miniconda/Miniconda3-latest-Linux-armv7l.sh bash Miniconda3-…

【C++特殊工具與技術】嵌套類

在 C 中,類的嵌套(Nested Class)是一種強大的封裝手段。通過將一個類定義在另一個類(稱為外圍類,Enclosing Class)的內部,我們可以將關聯緊密的功能邏輯集中管理,同時限制嵌套類的作…

Python安裝cartopy報錯,解決cartopy環境配置問題

1、嘗試過各種辦法,說依賴包的問題,下載了沒用,說版本問題沒用。conda安裝成功了,運行仍然報錯。采用了一個笨辦法解決(高效便捷)。 用 conda-forge 重建環境,因為依賴混亂,重新創建…