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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…