引言

AlmaLinux 作为 CentOS 的继任者,继承了 RHEL 的稳定性和企业级特性。在生产环境中,性能优化是确保系统高效运行的关键。本文将从内核调优、系统资源管理、应用层加速等多个维度,提供一套完整的性能优化实战指南。

一、内核调优

1.1 内核参数调整

内核参数直接影响系统性能。通过调整 /etc/sysctl.conf 文件,可以优化网络、内存、文件系统等关键参数。

示例:网络性能优化

# 编辑 sysctl.conf
sudo vi /etc/sysctl.conf

# 添加以下内容
# 增加TCP连接队列大小
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535

# 优化TCP缓冲区
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216

# 启用TCP快速回收和重用
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1

# 减少TIME_WAIT状态连接
net.ipv4.tcp_fin_timeout = 30

# 应用配置
sudo sysctl -p

参数说明:

  • somaxconn:定义了系统中每一个端口最大的TCP监听队列的长度。
  • tcp_max_syn_backlog:用于保存那些尚未收到客户端ACK信息的半连接队列。
  • tcp_rmemtcp_wmem:定义了TCP接收和发送缓冲区的大小。

1.2 内核调度器优化

AlmaLinux 默认使用 CFS(完全公平调度器),对于特定工作负载,可以调整调度策略。

# 查看当前调度器
cat /sys/kernel/debug/sched/debug

# 为特定进程设置调度策略(例如,将nginx进程设置为实时调度)
sudo chrt -f -p 99 $(pgrep nginx)

# 或者通过cgroup进行管理
# 创建cgroup
sudo mkdir /sys/fs/cgroup/cpu/myapp
echo 100000 > /sys/fs/cgroup/cpu/myapp/cpu.cfs_quota_us
echo 200000 > /sys/fs/cgroup/cpu/myapp/cpu.cfs_period_us

1.3 内存管理优化

大页内存(Huge Pages)

对于内存密集型应用(如数据库),使用大页内存可以减少TLB缺失,提高性能。

# 检查当前大页配置
cat /proc/meminfo | grep Huge

# 配置大页(例如,分配1024个2MB大页)
echo 1024 > /proc/sys/vm/nr_hugepages

# 永久配置
echo "vm.nr_hugepages = 1024" >> /etc/sysctl.conf

# 在应用中使用大页(以MySQL为例)
# 在my.cnf中添加
[mysqld]
large-pages

内存回收策略

调整 vm.swappiness 参数,控制内核使用交换分区的倾向。

# 查看当前值
cat /proc/sys/vm/swappiness

# 设置为10(减少交换)
echo 10 > /proc/sys/vm/swappiness

# 永久配置
echo "vm.swappiness = 10" >> /etc/sysctl.conf

二、系统资源管理

2.1 CPU 优化

使用 cpufreq 调整 CPU 频率

# 安装 cpufrequtils
sudo dnf install cpufrequtils

# 查看当前策略
cpufreq-info

# 设置为性能模式(最大性能)
sudo cpufreq-set -g performance

# 永久设置
echo 'GOVERNOR="performance"' > /etc/sysconfig/cpufreq

使用 tuned 进行系统调优

tuned 是一个动态调优工具,提供多种预设配置文件。

# 安装 tuned
sudo dnf install tuned

# 启动并启用 tuned
sudo systemctl enable --now tuned

# 查看可用配置文件
tuned-adm list

# 应用配置文件(例如,虚拟主机优化)
sudo tuned-adm profile virtual-host

# 自定义配置文件
sudo mkdir -p /etc/tuned/custom-profile
sudo cp /usr/lib/tuned/virtual-host/tuned.conf /etc/tuned/custom-profile/
sudo vi /etc/tuned/custom-profile/tuned.conf
# 修改参数,例如:
# [cpu]
# governor=performance
# [vm]
# swappiness=10
sudo tuned-adm profile custom-profile

2.2 磁盘 I/O 优化

文件系统优化

# 查看文件系统类型
df -T

# 对于 ext4 文件系统,可以调整挂载选项
# 编辑 /etc/fstab
UUID=xxx /data ext4 defaults,noatime,nodiratime,barrier=0 0 0

# 对于 XFS 文件系统
# 编辑 /etc/fstab
UUID=xxx /data xfs defaults,noatime,nodiratime 0 0

I/O 调度器选择

# 查看当前 I/O 调度器
cat /sys/block/sda/queue/scheduler

# 设置为 deadline(适合数据库)
echo deadline > /sys/block/sda/queue/scheduler

# 永久设置(通过 udev 规则)
sudo vi /etc/udev/rules.d/60-scheduler.rules
# 添加:
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/scheduler}="deadline"

使用 fstrim 优化 SSD

# 安装 fstrim(通常已安装)
# 手动执行 trim
sudo fstrim -v /

# 设置定时任务
sudo crontab -e
# 添加:
0 2 * * * /usr/sbin/fstrim -v /

2.3 网络优化

网卡队列和 RSS

# 查看网卡信息
ethtool -i eth0

# 启用多队列(如果支持)
sudo ethtool -L eth0 combined 8

# 设置 RSS(接收端缩放)
sudo ethtool -K eth0 rxhash on

# 调整队列长度
sudo ethtool -G eth0 rx 4096 tx 4096

使用 tc 进行流量控制

# 安装 iproute2(通常已安装)
# 创建队列规则
sudo tc qdisc add dev eth0 root handle 1: htb default 30

# 添加类
sudo tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit
sudo tc class add dev eth0 parent 1:1 classid 1:10 htb rate 20mbit ceil 50mbit
sudo tc class add dev eth0 parent 1:1 classid 1:20 htb rate 30mbit ceil 80mbit

# 添加过滤器
sudo tc filter add dev eth0 parent 1: protocol ip prio 1 u32 match ip dst 192.168.1.100/32 flowid 1:10

三、应用层加速

3.1 Web 服务器优化(以 Nginx 为例)

Nginx 配置优化

# /etc/nginx/nginx.conf
worker_processes auto;  # 自动设置为CPU核心数
worker_rlimit_nofile 65535;  # 每个worker进程能打开的最大文件数

events {
    worker_connections 65535;  # 每个worker进程的最大连接数
    use epoll;  # 使用epoll事件模型
    multi_accept on;  # 一次接受多个连接
}

http {
    # 缓冲区优化
    client_body_buffer_size 128k;
    client_max_body_size 10m;
    client_header_buffer_size 1k;
    large_client_header_buffers 4 8k;
    
    # 超时设置
    client_header_timeout 30s;
    client_body_timeout 30s;
    send_timeout 30s;
    
    # Gzip压缩
    gzip on;
    gzip_vary on;
    gzip_min_length 1024;
    gzip_comp_level 6;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
    
    # 缓存配置
    open_file_cache max=1000 inactive=20s;
    open_file_cache_valid 30s;
    open_file_cache_min_uses 2;
    open_file_cache_errors on;
    
    # 连接复用
    keepalive_timeout 65;
    keepalive_requests 100;
    
    # TCP优化
    tcp_nopush on;
    tcp_nodelay on;
    
    # 静态文件缓存
    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
    }
}

使用 ngx_http_proxy_module 进行反向代理优化

# 在server块中
location /api/ {
    proxy_pass http://backend;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    
    # 超时设置
    proxy_connect_timeout 60s;
    proxy_send_timeout 60s;
    proxy_read_timeout 60s;
    
    # 缓冲区
    proxy_buffering on;
    proxy_buffer_size 4k;
    proxy_buffers 8 4k;
    proxy_busy_buffers_size 8k;
    
    # 启用缓存
    proxy_cache my_cache;
    proxy_cache_key "$scheme$request_method$host$request_uri";
    proxy_cache_valid 200 302 10m;
    proxy_cache_valid 404 1m;
}

3.2 数据库优化(以 MySQL 为例)

MySQL 配置优化

# /etc/my.cnf.d/mysql-server.cnf
[mysqld]
# 内存配置
innodb_buffer_pool_size = 70% of total RAM  # 例如,16GB内存的服务器设置为11G
innodb_log_file_size = 2G
innodb_log_buffer_size = 16M
innodb_flush_log_at_trx_commit = 2  # 平衡性能和数据安全

# 连接配置
max_connections = 500
thread_cache_size = 50
table_open_cache = 2000

# 查询缓存(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

# 其他优化
innodb_flush_method = O_DIRECT
innodb_file_per_table = 1
innodb_read_io_threads = 8
innodb_write_io_threads = 8

使用 pt-query-digest 分析慢查询

# 安装 Percona Toolkit
sudo dnf install percona-toolkit

# 分析慢查询日志
sudo pt-query-digest /var/log/mysql/slow.log > slow_report.txt

# 查看报告
cat slow_report.txt

3.3 应用程序优化(以 Java 应用为例)

JVM 调优

# 启动参数示例
java -Xms4G -Xmx4G -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -jar myapp.jar

# 参数说明:
# -Xms4G -Xmx4G:初始和最大堆内存设置为4GB
# -XX:+UseG1GC:使用G1垃圾收集器
# -XX:MaxGCPauseMillis=200:目标最大GC暂停时间为200ms
# -XX:+UnlockExperimentalVMOptions:解锁实验性选项
# -XX:+UseCGroupMemoryLimitForHeap:在容器环境中使用cgroup内存限制

使用 jstatjmap 监控

# 查看GC统计
jstat -gcutil <pid> 1000

# 生成堆转储
jmap -dump:format=b,file=heapdump.hprof <pid>

# 分析堆转储
# 使用 Eclipse MAT 或 VisualVM

3.4 缓存优化

Redis 优化

# Redis 配置文件 /etc/redis.conf
# 内存配置
maxmemory 4gb
maxmemory-policy allkeys-lru

# 持久化优化
save 900 1
save 300 10
save 60 10000
appendonly yes
appendfsync everysec

# 网络优化
tcp-keepalive 300
timeout 0

# 其他优化
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

Memcached 优化

# 启动参数
-m 4096  # 内存限制为4GB
-c 1024  # 最大连接数
-t 8     # 线程数(根据CPU核心数调整)
-I 1M    # 最大对象大小

四、监控与分析

4.1 系统监控工具

sar(系统活动报告)

# 安装 sysstat
sudo dnf install sysstat

# 启用 sar
sudo systemctl enable --now sysstat

# 查看历史数据
sar -u  # CPU使用率
sar -r  # 内存使用
sar -b  # I/O统计
sar -n DEV  # 网络统计

htopglances

# 安装 htop
sudo dnf install htop

# 安装 glances
sudo dnf install glances

# 运行 glances(支持Web界面)
glances -w

4.2 应用性能监控

使用 perf 进行性能分析

# 安装 perf
sudo dnf install perf

# 记录性能数据
sudo perf record -g -p <pid>

# 生成报告
sudo perf report

# 分析特定事件
sudo perf stat -e cycles,instructions,cache-misses -p <pid>

使用 strace 调试系统调用

# 跟踪进程的系统调用
sudo strace -p <pid> -c

# 跟踪特定系统调用
sudo strace -e trace=read,write -p <pid>

4.3 日志分析

使用 logwatch 分析日志

# 安装 logwatch
sudo dnf install logwatch

# 配置 logwatch
sudo vi /etc/logwatch/conf/logwatch.conf

# 手动运行
sudo logwatch --output mail --mailto admin@example.com --detail high

使用 journalctl 分析系统日志

# 查看最近的系统日志
sudo journalctl -xe

# 查看特定服务的日志
sudo journalctl -u nginx

# 查看特定时间范围的日志
sudo journalctl --since "2024-01-01 00:00:00" --until "2024-01-01 23:59:59"

五、实战案例

5.1 高并发 Web 服务器优化

场景描述

  • 服务器配置:16核CPU,32GB内存,SSD硬盘
  • 应用:Nginx + PHP-FPM + MySQL
  • 目标:支持10,000并发连接

优化步骤

  1. 内核调优

    # 编辑 /etc/sysctl.conf
    net.core.somaxconn = 65535
    net.ipv4.tcp_max_syn_backlog = 65535
    net.core.rmem_max = 16777216
    net.core.wmem_max = 16777216
    net.ipv4.tcp_rmem = 4096 87380 16777216
    net.ipv4.tcp_wmem = 4096 65536 16777216
    net.ipv4.tcp_tw_reuse = 1
    net.ipv4.tcp_fin_timeout = 30
    vm.swappiness = 10
    vm.nr_hugepages = 1024
    
  2. Nginx 配置 “`nginx worker_processes auto; worker_rlimit_nofile 65535;

events {

   worker_connections 65535;
   use epoll;
   multi_accept on;

}

http {

   # 缓冲区优化
   client_body_buffer_size 128k;
   client_max_body_size 10m;

   # Gzip压缩
   gzip on;
   gzip_comp_level 6;

   # 连接复用
   keepalive_timeout 65;
   keepalive_requests 100;

   # 静态文件缓存
   location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
       expires 1y;
       add_header Cache-Control "public, immutable";
   }

}


3. **PHP-FPM 配置**
   ```ini
   # /etc/php-fpm.d/www.conf
   pm = dynamic
   pm.max_children = 500
   pm.start_servers = 100
   pm.min_spare_servers = 50
   pm.max_spare_servers = 200
   pm.max_requests = 5000
  1. MySQL 配置

    # /etc/my.cnf.d/mysql-server.cnf
    [mysqld]
    innodb_buffer_pool_size = 20G
    innodb_log_file_size = 2G
    innodb_flush_log_at_trx_commit = 2
    max_connections = 1000
    thread_cache_size = 100
    table_open_cache = 4000
    
  2. 监控与验证 “`bash

    使用 ab 进行压力测试

    ab -n 100000 -c 10000 http://your-server/

# 使用 htop 监控资源 htop

# 使用 sar 记录性能数据 sar -u 1 100


### 5.2 数据库服务器优化

#### 场景描述
- 服务器配置:32核CPU,64GB内存,NVMe SSD
- 应用:MySQL 8.0
- 目标:支持高并发读写,低延迟查询

#### 优化步骤

1. **内核调优**
   ```bash
   # 编辑 /etc/sysctl.conf
   vm.swappiness = 1
   vm.dirty_ratio = 10
   vm.dirty_background_ratio = 5
   vm.vfs_cache_pressure = 50
   net.core.somaxconn = 65535
   net.ipv4.tcp_max_syn_backlog = 65535
  1. MySQL 配置 “`ini

    /etc/my.cnf.d/mysql-server.cnf

    [mysqld]

    内存配置

    innodb_buffer_pool_size = 48G innodb_log_file_size = 4G innodb_log_buffer_size = 64M innodb_flush_log_at_trx_commit = 2 innodb_flush_method = O_DIRECT innodb_file_per_table = 1

# 连接配置 max_connections = 2000 thread_cache_size = 200 table_open_cache = 8000 thread_stack = 256K

# 查询优化 query_cache_type = 0 # MySQL 8.0默认关闭 join_buffer_size = 256K sort_buffer_size = 256K read_buffer_size = 256K read_rnd_buffer_size = 256K

# 日志优化 slow_query_log = 1 slow_query_log_file = /var/log/mysql/slow.log long_query_time = 1 log_queries_not_using_indexes = 1

# 其他优化 innodb_read_io_threads = 16 innodb_write_io_threads = 16 innodb_io_capacity = 2000 innodb_io_capacity_max = 4000


3. **使用 Percona Toolkit 优化**
   ```bash
   # 安装 Percona Toolkit
   sudo dnf install percona-toolkit
   
   # 分析慢查询
   sudo pt-query-digest /var/log/mysql/slow.log > slow_report.txt
   
   # 优化表
   sudo pt-online-schema-change --alter "ENGINE=InnoDB" D=your_database,t=your_table --execute
   
   # 检查索引使用情况
   sudo pt-index-usage --host localhost --user root --password your_password /var/log/mysql/slow.log
  1. 监控与验证 “`bash

    使用 mysqladmin 查看状态

    mysqladmin -u root -p extended-status

# 使用 SHOW PROCESSLIST 查看当前连接 mysql -u root -p -e “SHOW PROCESSLIST”

# 使用 SHOW ENGINE INNODB STATUS 查看 InnoDB 状态 mysql -u root -p -e “SHOW ENGINE INNODB STATUS\G”

# 使用 pt-mysql-summary 生成报告 sudo pt-mysql-summary –user root –password your_password


## 六、自动化优化

### 6.1 使用 Ansible 进行批量优化

```yaml
# playbook.yml
---
- name: AlmaLinux 性能优化
  hosts: all
  become: yes
  tasks:
    - name: 安装必要工具
      dnf:
        name:
          - tuned
          - sysstat
          - htop
          - perf
        state: present
    
    - name: 配置 sysctl
      sysctl:
        name: "{{ item.key }}"
        value: "{{ item.value }}"
        state: present
        reload: yes
      with_dict:
        net.core.somaxconn: 65535
        net.ipv4.tcp_max_syn_backlog: 65535
        net.core.rmem_max: 16777216
        net.core.wmem_max: 16777216
        net.ipv4.tcp_rmem: "4096 87380 16777216"
        net.ipv4.tcp_wmem: "4096 65536 16777216"
        net.ipv4.tcp_tw_reuse: 1
        net.ipv4.tcp_fin_timeout: 30
        vm.swappiness: 10
    
    - name: 配置 tuned
      copy:
        src: custom-tuned.conf
        dest: /etc/tuned/custom-profile/tuned.conf
      notify: restart tuned
    
    - name: 启用 tuned
      systemd:
        name: tuned
        enabled: yes
        state: started
    
    - name: 应用 tuned 配置
      command: tuned-adm profile custom-profile
    
  handlers:
    - name: restart tuned
      systemd:
        name: tuned
        state: restarted

6.2 使用 systemd 服务优化

# 创建自定义服务文件
sudo vi /etc/systemd/system/optimized-nginx.service

# 添加以下内容
[Unit]
Description=Optimized Nginx Server
After=network.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
LimitNOFILE=65535
LimitNPROC=65535

[Install]
WantedBy=multi-user.target

# 重新加载 systemd
sudo systemctl daemon-reload

# 启用服务
sudo systemctl enable optimized-nginx

七、最佳实践总结

7.1 优化原则

  1. 测量优先:在优化前,先使用监控工具了解当前性能瓶颈。
  2. 逐步调整:每次只调整一个参数,观察效果后再继续。
  3. 备份配置:修改系统配置前,备份原始文件。
  4. 测试验证:在生产环境应用前,先在测试环境验证。
  5. 文档记录:记录所有优化步骤和效果,便于回滚和复盘。

7.2 常见误区

  1. 过度优化:不要为了优化而优化,确保优化措施真正解决性能问题。
  2. 忽略硬件限制:软件优化无法突破硬件瓶颈。
  3. 不考虑业务场景:不同业务场景需要不同的优化策略。
  4. 忽视安全:性能优化不应以牺牲安全性为代价。

7.3 持续优化

性能优化是一个持续的过程,需要定期:

  • 监控系统性能指标
  • 分析日志和报告
  • 调整配置参数
  • 升级硬件和软件

结语

AlmaLinux 性能优化是一个系统工程,需要从内核到应用层的全面考虑。通过本文提供的实战指南,您可以系统地优化 AlmaLinux 系统,提升应用性能。记住,优化是一个持续的过程,需要根据实际业务需求和监控数据不断调整。

在实际操作中,请务必在测试环境验证所有优化措施,并做好备份和回滚计划。祝您优化顺利!