引言:AlmaLinux 性能优化的重要性
AlmaLinux 作为 CentOS 的稳定替代品,继承了企业级 Linux 的可靠性和安全性。然而,随着业务负载的增加,系统性能可能成为瓶颈。本文将深入探讨提升 AlmaLinux 系统性能的实用技巧,并针对常见问题提供详细的解决方案。
性能优化不仅仅是调整几个参数,而是一个系统工程,涉及硬件资源管理、内核调优、服务优化、监控分析等多个层面。通过合理的配置和优化,可以显著提升 AlmaLinux 的响应速度、吞吐量和稳定性,从而更好地支撑业务运行。
一、系统资源监控与分析
在进行任何优化之前,首先需要了解系统的当前状态。只有通过准确的监控和分析,才能找到性能瓶颈所在。
1.1 使用 top 和 htop 实时监控
top 是 Linux 系统自带的实时监控工具,可以显示系统中各个进程的资源占用情况。
# 安装 htop(如果未安装)
sudo dnf install htop -y
# 运行 top
top
# 运行 htop
htop
使用说明:
- 在
top界面中,按P键按 CPU 使用率排序,按M键按内存使用率排序。 htop提供了更友好的界面,支持鼠标操作,可以更直观地查看进程信息。
1.2 使用 vmstat 和 iostat 分析系统瓶颈
vmstat 和 iostat 是 sysstat 包中的工具,用于监控虚拟内存、进程和 I/O 统计信息。
# 安装 sysstat
sudo dnf install sysstat -y
# 每隔 2 秒刷新一次 vmstat,共 5 次
vmstat 2 5
# 每隔 2 秒刷新一次 iostat,共 5 次
iostat -x 2 5
输出示例与解读:
vmstat 输出示例:
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 123456 78910 456789 0 0 10 20 100 200 5 2 93 0 0
- r:运行队列长度(大于 CPU 核数表示 CPU 瓶颈)。
- free:空闲内存(如果持续很低,可能内存不足)。
- si/so:换入/换出(如果持续非零,说明内存不足,正在使用交换空间)。
- us/sy/id/wa:用户 CPU、系统 CPU、空闲 CPU、I/O 等待(如果 wa 高,说明 I/O 瓶颈)。
iostat -x 输出示例:
avg-cpu: %user %nice %system %iowait %steal %idle
5.00 0.00 2.00 1.00 0.00 92.00
Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
sda 5.00 10.00 20.00 50.00 0.00 0.00 0.00 0.00 0.50 1.00 0.10 4.00 5.00 0.20 0.50
- %util:设备利用率(接近 100% 表示磁盘 I/O 已饱和)。
- await:平均 I/O 等待时间(过高表示磁盘响应慢)。
- aqu-sz:平均队列长度(大于 1 表示磁盘繁忙)。
1.3 使用 sar 进行长期监控
sar 可以收集、报告和保存系统活动信息,用于长期分析。
# 启用 sar 收集(默认会自动启用,每 10 分钟记录一次)
sudo systemctl enable sysstat
sudo systemctl start sysstat
# 查看过去 24 小时的 CPU 使用情况
sar -u
# 查看过去 24 小时的内存使用情况
sar -r
# 查看过去 24 小时的 I/O 统计
sar -b
# 查看特定时间的报告(例如昨天 14:00)
sar -u -f /var/log/sa/sa$(date -d "yesterday" +%d)
1.4 使用 perf 进行性能剖析
perf 是 Linux 内核自带的性能分析工具,可以深入到内核级别进行性能剖析。
# 安装 perf
sudo dnf install perf -y
# 记录 CPU 使用情况 10 秒
perf record -g sleep 10
# 生成报告
perf report
使用说明:
perf record -g会记录调用栈信息,-g表示记录调用图。perf report会以交互式界面展示性能数据,可以找到热点函数。
二、内核参数调优
内核参数直接影响系统资源的管理和调度。通过调整内核参数,可以优化内存、网络和 I/O 性能。
2.1 调整虚拟内存参数
虚拟内存参数决定了系统如何管理内存和交换空间。常见的优化参数包括 vm.swappiness、vm.vfs_cache_pressure 和 vm.dirty_ratio。
# 查看当前参数
sysctl vm.swappiness
sysctl vm.vfs_cache_pressure
sysctl vm.dirty_ratio
# 临时调整(重启后失效)
sudo sysctl -w vm.swappiness=10
sudo sysctl -w vm.vfs_cache_pressure=50
sudo sysctl -w vm.dirty_ratio=10
sudo sysctl -w vm.dirty_background_ratio=5
# 永久调整(编辑 /etc/sysctl.conf)
echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf
echo "vm.vfs_cache_pressure=50" | sudo tee -a /etc/sysctl.conf
echo "vm.dirty_ratio=10" | sudo tee -a /etc/sysctl.conf
echo "vm.dirty_background_ratio=5" | sudo tee -a /etc/sysctl.conf
# 应用配置
sudo sysctl -p
参数说明:
- vm.swappiness:控制内核将内存数据交换到交换空间的积极性。默认值为 60,降低该值(如 10)可以减少交换,提升性能,尤其适用于数据库服务器。
- vm.vfs_cache_pressure:控制内核回收用于目录项和 inode 缓存的内存的倾向。默认值为 100,降低该值(如 50)可以保留更多缓存,提升文件系统性能。
- vm.dirty_ratio:控制进程在写入脏数据到磁盘前必须在内存中拥有的最大百分比。降低该值可以减少 I/O 突发,但可能增加延迟。
- vm.dirty_background_ratio:控制后台刷新线程开始写入脏数据到磁盘的阈值。降低该值可以避免 I/O 峰值。
2.2 优化网络参数
对于网络密集型应用,调整网络栈参数可以显著提升性能。
# 查看当前参数
sysctl net.core.somaxconn
sysctl net.ipv4.tcp_max_syn_backlog
sysctl net.ipv4.tcp_tw_reuse
sysctl net.core.netdev_max_backlog
# 临时调整
sudo sysctl -w net.core.somaxconn=65535
sudo sysctl -w net.ipv4.tcp_max_syn_backlog=65535
sudo sysctl -w net.ipv4.tcp_tw_reuse=1
sudo sysctl -w net.core.netdev_max_backlog=65535
sudo sysctl -w net.ipv4.tcp_fin_timeout=15
# 永久调整
echo "net.core.somaxconn=65535" | sudo tee -a /etc/sysctl.conf
echo "net.ipv4.tcp_max_syn_backlog=65535" | sudo tee -a /etc/sysctl.conf
echo "net.ipv4.tcp_tw_reuse=1" | sudo tee -a /etc/sysctl.conf
echo "net.core.netdev_max_backlog=65535" | sudo tee -a /etc/sysctl.conf
echo "net.ipv4.tcp_fin_timeout=15" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
参数说明:
- net.core.somaxconn:监听套接字的最大队列长度。对于高并发 Web 服务器,应增大此值。
- net.ipv4.tcp_max_syn_backlog:SYN 队列的最大长度。应对 SYN 洪水攻击和高并发连接。
- net.ipv4.tcp_tw_reuse:允许将 TIME_WAIT 状态的套接字重新用于新的 TCP 连接。在高并发环境下可以快速释放端口。
- net.core.netdev_max_backlog:当内核处理速度比网卡接收速度慢时,允许有多少个数据包在队列中等待。
- net.ipv4.tcp_fin_timeout:FIN_WAIT_2 状态的超时时间。缩短此时间可以更快释放资源。
2.3 调整 I/O 调度器
I/O 调度器决定了块设备(如硬盘、SSD)处理 I/O 请求的方式。对于 SSD,应使用 none 或 noop 调度器;对于 HDD,可以使用 deadline 或 cfq。
# 查看当前 I/O 调度器
cat /sys/block/sda/queue/scheduler
# 临时更改(例如,将 sda 的调度器改为 deadline)
echo deadline | sudo tee /sys/block/sda/queue/scheduler
# 永久更改(使用 udev 规则)
# 创建规则文件
sudo tee /etc/udev/rules.d/60-ioscheduler.rules <<EOF
# 为所有 SSD 设置 none 调度器
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="none"
# 为所有 HDD 设置 deadline 调度器
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="deadline"
EOF
# 重新加载 udev 规则
sudo udevadm control --reload-rules
sudo udevadm trigger
说明:
- none 或 noop:适用于 SSD,没有调度开销,直接将请求提交给底层设备。
- deadline:适用于 HDD,保证请求的公平性和截止时间,避免饥饿。
- cfq:适用于多用户桌面系统,为每个进程分配时间片。
2.4 使用 tuned 进行自动调优
tuned 是一个动态自适应系统调优守护进程,可以根据预定义的配置文件自动调整内核参数。
# 安装 tuned
sudo dnf install tuned -y
# 启动并启用 tuned
sudo systemctl enable tuned
sudo systemctl start tuned
# 查看可用配置文件
tuned-adm list
# 推荐配置(根据系统角色自动选择)
sudo tuned-adm recommend
# 应用配置文件(例如,虚拟主机)
sudo tuned-adm profile virtual-guest
# 查看当前配置文件
tuned-adm active
常用配置文件:
- latency-performance:低延迟性能,适用于需要快速响应的场景。
- throughput-performance:高吞吐量性能,适用于文件服务器、数据库。
- virtual-guest:针对虚拟机优化的配置。
- desktop:针对桌面应用优化。
三、服务与进程管理优化
系统中运行的服务和进程会消耗 CPU、内存和 I/O 资源。优化服务配置和管理进程可以显著提升性能。
3.1 禁用不必要的服务
减少运行的服务数量可以释放系统资源。
# 查看当前启用的服务
systemctl list-unit-files --type=service --state=enabled
# 查看所有服务的状态
systemctl list-units --type=service --all
# 禁用不必要的服务(例如,bluetooth)
sudo systemctl stop bluetooth
sudo systemctl disable bluetooth
# 禁用并停止服务(例如,cups)
sudo systemctl stop cups
sudo systemctl disable cups
# 查看服务依赖关系(避免禁用关键服务)
systemctl list-dependencies cups
注意: 在禁用服务之前,请确保了解该服务的作用,避免影响系统正常运行。例如,sshd 是远程管理服务,不能禁用。
3.2 使用 systemd 资源控制
systemd 支持对服务进行资源限制,防止单个服务消耗过多资源。
# 创建一个 systemd 服务文件(例如,myapp.service)
sudo tee /etc/systemd/system/myapp.service <<EOF
[Unit]
Description=My Application
After=network.target
[Service]
ExecStart=/usr/bin/myapp
Restart=always
# CPU 限制:最多使用 2 个 CPU 核心
CPUQuota=200%
# 内存限制:最多使用 1GB 内存,超过后会被 OOM killer 杀掉
MemoryLimit=1G
# 限制进程数:最多 50 个进程
TasksMax=50
# 限制 I/O 权重(0-1000,默认 100)
IOWeight=100
[Install]
WantedBy=multi-user.target
EOF
# 重新加载 systemd 配置
sudo systemctl daemon-reload
# 启动并启用服务
sudo systemctl start myapp
sudo systemctl enable myapp
# 查看资源使用情况
systemctl status myapp
说明:
- CPUQuota:绝对百分比,例如 200% 表示 2 个核心。
- MemoryLimit:可以使用 K, M, G, T 等单位。
- TasksMax:限制服务可以创建的最大进程/线程数。
- IOWeight:相对权重,值越高,I/O 优先级越高。
3.3 使用 cgroups 进行更精细的控制
如果 systemd 的资源控制不够用,可以手动使用 cgroups。
# 安装 libcgroup-tools
sudo dnf install libcgroup-tools -y
# 创建一个 cgroup(例如,限制 myapp 的 CPU)
sudo cgcreate -g cpu:/myapp
# 设置 CPU 限制(例如,最多使用 50% CPU)
echo 50000 | sudo tee /sys/fs/cgroup/cpu/myapp/cpu.cfs_quota_us
echo 100000 | sudo tee /sys/fs/cgroup/cpu/myapp/cpu.cfs_period_us
# 将进程添加到 cgroup(假设 myapp 的 PID 是 1234)
sudo cgclassify -g cpu:myapp 1234
# 查看 cgroup 中的进程
cat /sys/fs/cgroup/cpu/myapp/tasks
# 删除 cgroup
sudo cgdelete -g cpu:myapp
说明:
- cpu.cfs_period_us:周期时间(微秒),默认 100000(100ms)。
- cpu.cfs_quota_us:在周期内允许使用的 CPU 时间(微秒)。50000 表示 50% 的 CPU。
3.4 优化 sshd 配置
sshd 是远程管理服务,优化其配置可以减少资源消耗。
# 编辑 sshd 配置文件
sudo vim /etc/ssh/sshd_config
# 优化建议
# 1. 禁用 DNS 解析(减少连接延迟)
UseDNS no
# 2. 限制登录用户(只允许特定用户)
AllowUsers alice bob
# 3. 限制认证尝试次数(防止暴力破解)
MaxAuthTries 3
# 4. 使用更安全的加密算法(减少 CPU 开销)
# 注意:需要根据客户端兼容性调整
Ciphers aes256-gcm@openssh.com
MACs hmac-sha2-512-etm@openssh.com
# 5. 禁用 X11 转发(如果不需要)
X11Forwarding no
# 重启 sshd 服务
sudo systemctl restart sshd
四、文件系统优化
文件系统是数据存储的基础,其性能直接影响 I/O 效率。
4.1 选择合适的文件系统
- XFS:AlmaLinux 默认文件系统,适合大文件和高并发 I/O,性能优秀。
- ext4:稳定可靠,适合通用场景。
- Btrfs:支持高级特性(如快照、压缩),但性能可能略低。
对于新安装,建议使用 XFS。对于现有系统,如果使用 ext4,可以考虑优化挂载选项。
4.2 优化挂载选项
在 /etc/fstab 中调整挂载选项可以提升性能。
# 查看当前挂载选项
mount | grep " / "
# 编辑 /etc/fstab
sudo vim /etc/fstab
# 示例:优化 /data 分区(XFS)
# 原始行:
# /dev/sdb1 /data xfs defaults 0 0
# 优化后:
/dev/sdb1 /data xfs noatime,nodiratime,logbufs=8,logbsize=256k 0 0
# 示例:优化 /var/log 分区(ext4)
# 原始行:
# /dev/sdc1 /var/log ext4 defaults 0 0
# 优化后:
/dev/sdc1 /var/log ext4 defaults,noatime,nodiratime,data=writeback,barrier=0 0 0
选项说明:
- noatime:禁止更新文件访问时间,减少写操作。
- nodiratime:禁止更新目录访问时间。
- logbufs=8, logbsize=256k:增加 XFS 日志缓冲区大小,提升写性能。
- data=writeback:ext4 的写回模式,提升写性能,但可能增加数据丢失风险(需权衡)。
- barrier=0:禁用写屏障,提升性能,但断电可能导致数据损坏(仅适用于有 UPS 的系统)。
4.3 使用 fstrim 优化 SSD
对于 SSD,定期运行 fstrim 可以回收已删除数据占用的块,保持写入性能。
# 手动运行 fstrim(例如,对 / 分区)
sudo fstrim -v /
# 设置定时任务(每周运行一次)
sudo crontab -e
# 添加以下行
0 2 * * 0 /usr/sbin/fstrim -v / > /var/log/fstrim.log 2>&1
注意: fstrim 会消耗一定的系统资源,建议在低峰期运行。
4.4 使用 tmpfs 提升临时文件性能
将临时目录挂载为内存文件系统可以显著提升读写速度。
# 编辑 /etc/fstab
sudo vim /etc/fstab
# 添加以下行(例如,为 /tmp 分配 2GB 内存)
tmpfs /tmp tmpfs defaults,size=2G 0 0
# 重新挂载
sudo mount -a
# 验证
df -h /tmp
注意: tmpfs 中的数据在重启后会丢失,仅适用于临时文件。
五、网络性能优化
网络性能优化涉及网络栈参数调整、协议优化和硬件优化。
5.1 启用网络接口多队列
现代网卡支持多队列(RSS),可以将中断分配到多个 CPU 核心,提升网络吞吐量。
# 查看网卡队列数
ethtool -l eth0
# 设置队列数(例如,设置为 CPU 核数)
sudo ethtool -L eth0 combined 8
# 验证
ethtool -l eth0
# 持久化设置(使用 udev 规则)
sudo tee /etc/udev/rules.d/99-net-multi-queue.rules <<EOF
ACTION=="add", SUBSYSTEM=="net", KERNEL=="eth0", RUN+="/usr/sbin/ethtool -L %k combined 8"
EOF
sudo udevadm control --reload-rules
sudo udevadm trigger
5.2 使用 irqbalance 分配中断
irqbalance 可以自动将硬件中断分配到各个 CPU 核心,避免单个 CPU 过载。
# 安装 irqbalance
sudo dnf install irqbalance -y
# 启动并启用
sudo systemctl enable irqbalance
sudo systemctl start irqbalance
# 查看状态
systemctl status irqbalance
# 配置(可选,编辑 /etc/irqbalance.conf)
# 设置为 1 表示在每个 CPU 上平均分配中断
sudo vim /etc/irqbalance.conf
# 找到 INTERVAL,设置为 1
INTERVAL=1
# 重启服务
sudo systemctl restart irqbalance
5.3 使用 tuned 网络优化配置
tuned 提供了网络优化的配置文件。
# 应用网络吞吐量优化配置
sudo tuned-adm profile network-throughput
# 或者应用网络延迟优化配置
sudo tuned-adm profile network-latency
5.4 使用 iperf3 测试和优化网络带宽
iperf3 是一个网络性能测试工具,可以测试 TCP/UDP 带宽。
# 安装 iperf3
sudo dnf install iperf3 -y
# 在服务器端运行(监听)
iperf3 -s
# 在客户端运行(连接服务器)
iperf3 -c <server_ip> -t 30 -P 4
# 参数说明:
# -t 30:测试 30 秒
# -P 4:使用 4 个并行连接
优化建议:
- 如果带宽达不到预期,检查网络栈参数(如
net.core.rmem_max、net.core.wmem_max)。 - 考虑启用 TCP BBR 拥塞控制算法(需要内核支持)。
# 查看当前拥塞控制算法
sysctl net.ipv4.tcp_congestion_control
# 临时启用 BBR
sudo sysctl -w net.ipv4.tcp_congestion_control=bbr
# 永久启用
echo "net.ipv4.tcp_congestion_control=bbr" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
六、数据库与应用服务器优化
数据库和应用服务器通常是性能瓶颈的核心。优化它们可以带来显著的性能提升。
6.1 MySQL/MariaDB 优化
MySQL/MariaDB 是常见的数据库,优化其配置可以提升查询性能。
# 编辑 MySQL 配置文件(例如,/etc/my.cnf.d/server.cnf)
sudo vim /etc/my.cnf.d/server.cnf
# 在 [mysqld] 部分添加或修改以下参数
[mysqld]
# 内存相关
innodb_buffer_pool_size = 4G # 设置为系统内存的 50-70%
innodb_log_file_size = 512M # 日志文件大小
innodb_flush_log_at_trx_commit = 2 # 0: 每秒写入,1: 每次提交写入(性能 vs 安全)
innodb_flush_method = O_DIRECT # 绕过系统缓存,直接写入磁盘
# 连接相关
max_connections = 200 # 最大连接数
thread_cache_size = 50 # 线程缓存
# 查询缓存(MySQL 8.0 已移除,适用于 5.7 及以下)
# query_cache_type = 1
# query_cache_size = 64M
# 日志相关(生产环境建议关闭)
# slow_query_log = 1
# slow_query_log_file = /var/log/mysql/slow.log
# long_query_time = 2
# 重启 MySQL 服务
sudo systemctl restart mysqld
说明:
- innodb_buffer_pool_size:InnoDB 缓冲池大小,是最重要的参数。
- innodb_flush_log_at_trx_commit:0 或 2 可以提升性能,但可能在崩溃时丢失 1 秒的数据。
- max_connections:根据业务需求调整,避免过高导致内存耗尽。
6.2 Nginx 优化
Nginx 是高性能的 Web 服务器和反向代理。
# 编辑 Nginx 配置文件(例如,/etc/nginx/nginx.conf)
sudo vim /etc/nginx/nginx.conf
# 在 http 部分添加或修改以下参数
http {
# 连接相关
worker_processes auto; # 自动设置为 CPU 核数
worker_connections 1024; # 每个 worker 的最大连接数
worker_rlimit_nofile 65535; # worker 进程可以打开的文件描述符数量
# 缓存相关
open_file_cache max=200000 inactive=20s; # 文件描述符缓存
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
# Gzip 压缩
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css text/xml text/javascript application/json application/javascript application/xml+rss application/rss+xml font/truetype font/opentype application/vnd.ms-fontobject image/svg+xml;
# 其他
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
keepalive_requests 100;
# 包含其他配置文件
include /etc/nginx/conf.d/*.conf;
}
# 检查配置并重启
sudo nginx -t
sudo systemctl restart nginx
说明:
- worker_processes:通常设置为 CPU 核数。
- worker_connections:根据内存和并发需求调整。
- open_file_cache:缓存文件描述符,减少磁盘 I/O。
- gzip:压缩响应内容,减少传输数据量。
6.3 Redis 优化
Redis 是内存数据库,优化其配置可以提升读写性能。
# 编辑 Redis 配置文件(例如,/etc/redis.conf)
sudo vim /etc/redis.conf
# 修改以下参数
# 内存相关
maxmemory 4gb # 最大内存限制
maxmemory-policy allkeys-lru # 内存满时的策略(LRU:最近最少使用)
# 持久化相关(根据需求选择)
save 900 1 # 900 秒内至少有 1 次更新则保存
save 300 10
save 60 10000
appendonly yes # 启用 AOF 持久化
appendfsync everysec # 每秒同步一次(性能 vs 安全)
# 网络相关
bind 0.0.0.0 # 监听所有接口(注意安全)
port 6379
tcp-backlog 511 # TCP 连接队列长度
# 性能相关
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
# 重启 Redis
sudo systemctl restart redis
说明:
- maxmemory:根据系统内存设置,避免 Redis 占用过多内存。
- maxmemory-policy:根据业务需求选择,如
allkeys-lru、volatile-lru。 - appendfsync:
everysec是性能和安全的平衡点。
七、常见问题解决方案
7.1 问题:CPU 使用率持续 100%
症状: 系统响应缓慢,top 显示 CPU 使用率接近 100%。
排查步骤:
- 使用
top或htop找到占用 CPU 最高的进程。 - 如果是用户进程,使用
perf分析其热点函数。 - 如果是内核进程,检查是否是中断或系统调用过多。
解决方案:
- 如果是特定进程: 优化该进程的代码或配置,或使用
cgroups限制其 CPU 使用。 - 如果是内核进程: 检查
irqbalance是否运行,或使用perf分析内核热点。 - 如果是中断过多: 检查网卡队列设置,或调整
irqbalance配置。
示例: 使用 perf 分析 CPU 使用率高的进程(假设 PID 为 1234)。
# 记录 10 秒的性能数据
sudo perf record -p 1234 -g sleep 10
# 生成报告
sudo perf report
7.2 问题:内存不足导致频繁交换(OOM)
症状: 系统卡顿,vmstat 显示 si/so 非零,或出现 Out of memory 错误。
排查步骤:
- 使用
free -h查看内存使用情况。 - 使用
smem -s rss或ps aux --sort=-%mem查看内存占用最高的进程。 - 检查
/var/log/messages或dmesg是否有 OOM 记录。
解决方案:
- 释放缓存: 临时释放页面缓存、目录项和 inode 缓存(谨慎使用)。
sudo sync; echo 3 > /proc/sys/vm/drop_caches - 调整
vm.swappiness: 降低该值以减少交换。 - 增加内存: 如果物理内存不足,考虑升级硬件。
- 限制进程内存: 使用
systemd或cgroups限制内存占用高的进程。 - 优化应用: 检查应用是否有内存泄漏,优化内存使用。
示例: 使用 smem 查看内存占用。
# 安装 smem
sudo dnf install smem -y
# 按 RSS(常驻内存集大小)排序
smem -s rss -r
7.3 问题:磁盘 I/O 瓶颈
症状: iostat 显示 %util 接近 100%,await 时间过长,系统响应慢。
排查步骤:
- 使用
iostat -x 1持续监控 I/O 统计。 - 使用
iotop查看哪些进程在进行大量 I/O。 - 检查磁盘健康状态(
smartctl)。
解决方案:
- 优化 I/O 调度器: 根据磁盘类型选择合适的调度器。
- 使用
fstrim: 对于 SSD,定期运行fstrim。 - 优化文件系统挂载选项: 使用
noatime等。 - 分散 I/O: 将热点数据分散到不同的磁盘或分区。
- 升级硬件: 使用 SSD 或 RAID 卡。
示例: 使用 iotop 查看 I/O 进程。
# 安装 iotop
sudo dnf install iotop -y
# 运行
sudo iotop
7.4 问题:网络连接缓慢或丢包
症状: ping 延迟高,curl 下载慢,netstat 显示大量连接处于 TIME_WAIT 或 SYN_RECV 状态。
排查步骤:
- 使用
ss -s查看连接统计。 - 使用
netstat -an | grep TIME_WAIT | wc -l统计TIME_WAIT连接数。 - 使用
ping和traceroute检查网络连通性。 - 使用
ethtool -S eth0查看网卡统计(如丢包、错误)。
解决方案:
调整网络参数: 启用
tcp_tw_reuse,增大somaxconn和tcp_max_syn_backlog。检查防火墙: 确认防火墙规则没有阻止或限制连接。
检查网卡驱动: 确保网卡驱动是最新的,支持多队列。
使用
tcpdump抓包分析: 定位网络问题。sudo tcpdump -i eth0 -w /tmp/network.pcap # 使用 Wireshark 分析
示例: 统计 TIME_WAIT 连接数。
ss -s | grep timewait
# 或者
netstat -an | grep TIME_WAIT | wc -l
7.5 问题:系统启动缓慢
症状: 系统启动时间过长,systemd-analyze 显示服务启动耗时。
排查步骤:
- 使用
systemd-analyze blame查看各服务启动时间。 - 使用
systemd-analyze critical-chain查看关键链。 - 检查是否有服务在等待网络或磁盘。
解决方案:
- 禁用不必要的服务: 使用
systemctl disable禁用耗时服务。 - 并行启动: 确保服务依赖关系正确,
systemd会自动并行启动。 - 优化服务配置: 例如,减少
sshd的 DNS 解析时间。 - 使用
systemd的TimeoutStartSec: 为服务设置启动超时时间。
示例: 分析启动时间。
systemd-analyze blame
systemd-analyze critical-chain
八、总结
提升 AlmaLinux 系统性能是一个持续的过程,需要结合监控、分析和优化。通过本文介绍的技巧和解决方案,您可以系统地识别和解决性能瓶颈。
核心要点:
- 监控先行: 使用
top、vmstat、iostat等工具了解系统状态。 - 内核调优: 调整虚拟内存、网络和 I/O 参数,使用
tuned自动优化。 - 服务管理: 禁用不必要的服务,使用
systemd和cgroups控制资源。 - 文件系统优化: 选择合适的文件系统,优化挂载选项,使用
tmpfs。 - 网络优化: 启用多队列,使用
irqbalance,调整网络栈参数。 - 应用优化: 针对数据库、Web 服务器等具体应用进行配置优化。
- 问题解决: 针对常见问题(CPU、内存、I/O、网络)有系统的排查和解决方法。
性能优化没有银弹,需要根据具体业务场景和硬件环境进行调整。建议在优化前做好备份和测试,逐步实施,持续监控,以确保系统的稳定性和性能提升。
