目录

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 重建环境,因为依赖混乱,重新创建…