Linux操作系統-性能優化

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    # 硬限制

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. 避免過度優化:如無明確瓶頸,優先使用默認配置。

六、綜合案例

問題描述

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

優化配置

  1. 修改文件描述符限制

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

調整Nginx配置

# /etc/nginx/nginx.conf
worker_rlimit_nofile 65535;  # 與limits.conf一致
events {worker_connections 4096;   # 每個Worker進程連接數
}

內核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"

調整系統Swap策

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

使用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%。

優化配置

切換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

調整文件系統掛載參數

# 編輯 /etc/fstab
UUID=xxxx /data ext4 defaults,noatime,nodiratime,data=writeback 0 2

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在多個核心間頻繁切換。

綁定進程到特定CPU核心

# 使用taskset綁定到CPU0-3
taskset -c 0-3 python3 data_processing.py

調整進程優先級

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

禁用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平衡

應用層優化(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分布

總結:優化配置原則

精準定位瓶頸

  • 使用 perf top 分析CPU熱點。

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

層級化調整

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

自動化監控

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

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

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

相關文章

如何徹底解決緩存擊穿、緩存穿透、緩存雪崩

一、緩存擊穿 成因:緩存擊穿通常發生在某個熱點數據失效或清空后,大量請求同時涌入后端數據庫,導致數據庫崩潰或宕機。 解決方案: 互斥鎖:在獲取數據時,使用分布式鎖(如Redis的分布式鎖&…

JDK 8、JDK 17和JDK 19綜合對比分析

JDK 8、JDK 17和JDK 19在性能、特性、易用性及普及性等方面的綜合對比分析,結合了各版本的核心改進和實際應用場景 目錄 ? 一、性能對比 ? 二、語言與特性演進 🛠? 三、API與功能增強 🎯 四、易用性改進 📊 五、市場普及…

Vue-理解 vuex

一、前言 在開發中大型 Vue 應用時,我們常常會遇到多個組件之間共享數據、通信復雜的問題。例如: 多個組件需要訪問同一個用戶信息;組件之間需要傳遞狀態或事件;數據變更需要同步更新多個組件; 這時,Vue…

【209】VS2022 C++對排好序的vector使用二分查找算法的例子

本文介紹了如何對已經排序的 vector 進行二分法查找。 首先&#xff0c;我們先看一下存儲數據的類&#xff0c;我們假設所有數據的 id 是唯一的&#xff1a; DataItem.h #pragma once #include<string>namespace zc {class DataItem{public:int m_id;std::string m_na…

ABAP 上傳 excel 報表

&#xff08;1&#xff09;先在屏幕上增加上傳文件的按鈕 "屏幕選擇條件" SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001. PARAMETERS : p_source LIKE rlgrap-filename . SELECTION-SCREEN END OF BLOCK b1. 你會發現&#xff0c;上面的代碼只…

Compose與View系統互操作方案

本文將全面解析 Android 現代 UI 框架 Jetpack Compose 與傳統 View 系統的互操作方案&#xff0c;涵蓋基礎原理、實戰技巧、性能優化和高級應用&#xff0c;助你實現漸進式遷移和混合開發。 一、互操作的必要性與整體架構 1.1 為什么需要互操作性 漸進式遷移&#xff1a;大型…

HNCTF 2025 Just Ping Write-up

part 1 路由部分主邏輯逆向 package mainimport ("net/http" )func main() {// 注冊路由和處理函數// 當訪問 "/api/ping" 路徑時&#xff0c;調用 pingHandler 函數處理請求http.HandleFunc("/api/ping", pingHandler)// 注冊開發測試API路由//…

OpenCV CUDA模塊中用于稠密光流計算的 TV-L1(Dual TV-L1)算法類cv::cuda::OpticalFlowDual_TVL1

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 cv::cuda::OpticalFlowDual_TVL1類是基于變分優化方法的稠密光流算法實現&#xff08;Dual TV-L1 光流模型&#xff09;&#xff0c;在 GPU 上加…

ThreadPoolTaskExecutor+CompletableFuture實現多線程異步數據同步和自定義線程池監控和動態調整實現

前言 ThreadPoolTaskExecutor是Spring框架提供的一個線程池實現&#xff0c;它是對Java標準庫中ThreadPoolExecutor的封裝&#xff0c;提供了更便捷的配置和集成方式&#xff0c;特別適合在Spring環境中使用。相關線程池概念見線程&線程池相關 CompletableFuture 是 Java…

一篇文章理解js閉包和作用于原理

一、js閉包的作用原理 JS閉包是指內部函數訪問外部函數變量的機制&#xff0c;常用于數據封裝和模塊化。典型應用包括創建私有變量、解決循環中的異步問題、實現函數柯里化等。案例分析展示了閉包在計數器、防抖函數等場景的使用&#xff0c;同時揭示了可能的內存泄漏風險。正…

GUI絲滑教程-python tinker

在 Tkinter GUI 應用中&#xff0c;線程可以幫助你在后臺執行長時間運行的任務&#xff0c;而不阻塞界面響應。下面是一些技巧&#xff0c;幫助你在使用線程時避免 Tkinter 界面卡頓的問題。 為什么 Tkinter 界面會卡頓&#xff1f; Tkinter 使用 主線程 來處理 UI 更新&…

第一部分-數據通信網絡基礎

目錄 一、什么是網絡通信&#xff1f; 二、網絡通信設備的基本識別 1.雙絞線 2.集線器&#xff08;物理層設備&#xff09; 3.中繼器&#xff08;物理層設備&#xff09; 4.接入交換機 5.匯聚交換機 6.核心交換機 7.路由器 8.無線路由器 9.光貓 一、什么是網絡通信&#xff1f;…

windows電腦解決筆記本搜索不到wifi問題

windows筆記本電腦明明打開了wifi功能&#xff0c;卻搜索不到wifi&#xff0c;此問題可能是網絡適配器被禁用的原因導致&#xff0c;通過以下方法也許能解決&#xff0c;無需重啟電腦 1、右鍵點擊網絡或wifi圖標&#xff0c;打開界面”網絡和internet“ 2、選擇”高級網絡設置…

C# 界面檢測顯示器移除并在可用顯示器上顯示

C# 檢測顯示器被移除&#xff0c;將界面在當前可用的顯示器上顯示&#xff0c;避免程序在任務欄點擊無響應。 using System; using System.Linq; using System.Windows.Forms;public class MonitorWatcher : IDisposable {private readonly Form _targetForm;private Screen …

JAVA實戰開源項目:青年公寓服務平臺 (Vue+SpringBoot) 附源碼

本文項目編號 T 233 &#xff0c;文末自助獲取源碼 \color{red}{T233&#xff0c;文末自助獲取源碼} T233&#xff0c;文末自助獲取源碼 目錄 一、系統介紹二、數據庫設計三、配套教程3.1 啟動教程3.2 講解視頻3.3 二次開發教程 四、功能截圖五、文案資料5.1 選題背景5.2 國內…

阿里云服務狀態監控:實時掌握云服務健康狀況

前言 在云計算時代,企業和開發者越來越依賴云服務提供商的基礎設施和服務。當我們的應用部署在云上,服務的可用性和穩定性就與云服務提供商息息相關。一旦云服務出現故障或維護,可能會對我們的業務造成直接影響。因此,實時了解云服務的運行狀態變得尤為重要。阿里云作為國…

使用VSCode開發FastAPI指南

1概述 FastAPI 是一個現代的高性能 Web 框架&#xff0c;用于使用 Python 構建 API。它旨在讓開發者輕松快速高效地構建 API&#xff0c;同時提供 API 的自動驗證、序列化和文檔記錄等功能&#xff0c;使其成為構建 Web 服務和微服務的熱門選擇。 在這個 FastAPI 教程中&#…

2025年硬件實習/秋招面試準備

前言 暑期即將到來&#xff0c;有很多研一研二以及大三大四的同學準備硬件類&#xff08;硬件研發、嵌入式硬件、layout、電源設計、射頻、硬件測試、工藝、FAE&#xff09;的實習或秋招。鑒于此&#xff0c;總結一下網友們秋招、實習中的硬件高頻考點&#xff0c;并分析他們是…

VSCode - Trae 插件關閉彈出框代碼補全

Trae 插件關閉彈出框代碼補全 彈出框代碼補全與非彈出框代碼補全 如下是彈出框代碼補全 如下是非彈出框代碼補全 關閉 / 啟用彈出框代碼補全 點擊 【管理】&#xff08;小齒輪&#xff09; -> 點擊 【設置】 取消勾選&#xff08;如果需要啟用&#xff0c;則勾選即可&…

Elasticsearch從安裝到實戰、kibana安裝以及自定義IK分詞器/集成整合SpringBoot詳細的教程ES(三)

DSL官方地址&#xff1a; DSL查詢分類 Elasticsearch提供了基于JSON的DSL&#xff08;https://www.elastic.co/docs/explore-analyze/query-filter/languages/querydsl&#xff09;來定義查詢。常見的查詢類型包括&#xff1a; 查詢所有&#xff1a;查詢出所有數據&#xff0…