引言:AlmaLinux 性能优化的重要性

AlmaLinux 作为 CentOS 的稳定替代品,继承了企业级 Linux 的可靠性和安全性。然而,随着业务负载的增加,系统性能可能成为瓶颈。本文将深入探讨提升 AlmaLinux 系统性能的实用技巧,并针对常见问题提供详细的解决方案。

性能优化不仅仅是调整几个参数,而是一个系统工程,涉及硬件资源管理、内核调优、服务优化、监控分析等多个层面。通过合理的配置和优化,可以显著提升 AlmaLinux 的响应速度、吞吐量和稳定性,从而更好地支撑业务运行。

一、系统资源监控与分析

在进行任何优化之前,首先需要了解系统的当前状态。只有通过准确的监控和分析,才能找到性能瓶颈所在。

1.1 使用 tophtop 实时监控

top 是 Linux 系统自带的实时监控工具,可以显示系统中各个进程的资源占用情况。

# 安装 htop(如果未安装)
sudo dnf install htop -y

# 运行 top
top

# 运行 htop
htop

使用说明:

  • top 界面中,按 P 键按 CPU 使用率排序,按 M 键按内存使用率排序。
  • htop 提供了更友好的界面,支持鼠标操作,可以更直观地查看进程信息。

1.2 使用 vmstatiostat 分析系统瓶颈

vmstatiostatsysstat 包中的工具,用于监控虚拟内存、进程和 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.swappinessvm.vfs_cache_pressurevm.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,应使用 nonenoop 调度器;对于 HDD,可以使用 deadlinecfq

# 查看当前 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

说明:

  • nonenoop:适用于 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_maxnet.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-lruvolatile-lru
  • appendfsynceverysec 是性能和安全的平衡点。

七、常见问题解决方案

7.1 问题:CPU 使用率持续 100%

症状: 系统响应缓慢,top 显示 CPU 使用率接近 100%。

排查步骤:

  1. 使用 tophtop 找到占用 CPU 最高的进程。
  2. 如果是用户进程,使用 perf 分析其热点函数。
  3. 如果是内核进程,检查是否是中断或系统调用过多。

解决方案:

  • 如果是特定进程: 优化该进程的代码或配置,或使用 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 错误。

排查步骤:

  1. 使用 free -h 查看内存使用情况。
  2. 使用 smem -s rssps aux --sort=-%mem 查看内存占用最高的进程。
  3. 检查 /var/log/messagesdmesg 是否有 OOM 记录。

解决方案:

  • 释放缓存: 临时释放页面缓存、目录项和 inode 缓存(谨慎使用)。
    
    sudo sync; echo 3 > /proc/sys/vm/drop_caches
    
  • 调整 vm.swappiness 降低该值以减少交换。
  • 增加内存: 如果物理内存不足,考虑升级硬件。
  • 限制进程内存: 使用 systemdcgroups 限制内存占用高的进程。
  • 优化应用: 检查应用是否有内存泄漏,优化内存使用。

示例: 使用 smem 查看内存占用。

# 安装 smem
sudo dnf install smem -y

# 按 RSS(常驻内存集大小)排序
smem -s rss -r

7.3 问题:磁盘 I/O 瓶颈

症状: iostat 显示 %util 接近 100%,await 时间过长,系统响应慢。

排查步骤:

  1. 使用 iostat -x 1 持续监控 I/O 统计。
  2. 使用 iotop 查看哪些进程在进行大量 I/O。
  3. 检查磁盘健康状态(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_WAITSYN_RECV 状态。

排查步骤:

  1. 使用 ss -s 查看连接统计。
  2. 使用 netstat -an | grep TIME_WAIT | wc -l 统计 TIME_WAIT 连接数。
  3. 使用 pingtraceroute 检查网络连通性。
  4. 使用 ethtool -S eth0 查看网卡统计(如丢包、错误)。

解决方案:

  • 调整网络参数: 启用 tcp_tw_reuse,增大 somaxconntcp_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 显示服务启动耗时。

排查步骤:

  1. 使用 systemd-analyze blame 查看各服务启动时间。
  2. 使用 systemd-analyze critical-chain 查看关键链。
  3. 检查是否有服务在等待网络或磁盘。

解决方案:

  • 禁用不必要的服务: 使用 systemctl disable 禁用耗时服务。
  • 并行启动: 确保服务依赖关系正确,systemd 会自动并行启动。
  • 优化服务配置: 例如,减少 sshd 的 DNS 解析时间。
  • 使用 systemdTimeoutStartSec 为服务设置启动超时时间。

示例: 分析启动时间。

systemd-analyze blame
systemd-analyze critical-chain

八、总结

提升 AlmaLinux 系统性能是一个持续的过程,需要结合监控、分析和优化。通过本文介绍的技巧和解决方案,您可以系统地识别和解决性能瓶颈。

核心要点:

  1. 监控先行: 使用 topvmstatiostat 等工具了解系统状态。
  2. 内核调优: 调整虚拟内存、网络和 I/O 参数,使用 tuned 自动优化。
  3. 服务管理: 禁用不必要的服务,使用 systemdcgroups 控制资源。
  4. 文件系统优化: 选择合适的文件系统,优化挂载选项,使用 tmpfs
  5. 网络优化: 启用多队列,使用 irqbalance,调整网络栈参数。
  6. 应用优化: 针对数据库、Web 服务器等具体应用进行配置优化。
  7. 问题解决: 针对常见问题(CPU、内存、I/O、网络)有系统的排查和解决方法。

性能优化没有银弹,需要根据具体业务场景和硬件环境进行调整。建议在优化前做好备份和测试,逐步实施,持续监控,以确保系统的稳定性和性能提升。