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/内存阈值告警  
相关推荐
懒羊羊大王呀几秒前
Ubuntu20.04中MySQL的安装和配置
linux·mysql·ubuntu
浅安的邂逅7 分钟前
Ubuntu apt-get安装-报错:尝试“apt --fix-broken install”有未能满足的依赖关系,几种解决办法
linux·ubuntu·apt install
鸡鸭扣21 分钟前
25年春招:米哈游运维开发一面总结
运维·面试·求职招聘·运维开发·面经·sre·米哈游
Auv开心22 分钟前
ubuntu22.04和ubuntu20.04 的ssh配置不然repo init失败
运维·ssh
SZ17011023135 分钟前
IGP(Interior Gateway Protocol,内部网关协议)
运维·服务器·gateway
moxiaoran575344 分钟前
Spring Cloud Gateway 动态路由实现方案
运维·服务器·前端
知之则吱吱1 小时前
亚马逊云服务器(AWS)会限制用户使用吗?深度解读AWS资源政策
服务器·经验分享
运维日常手记1 小时前
最新1.33.1 k8s高可用集群搭建(免翻墙)
运维
爱瑞瑞1 小时前
🐧深入浅出的认识 Linux 指令
linux·shell
星哥说事1 小时前
开源综合性网络安全检测和运维工具-TscanClient
运维·web安全·开源