引言
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_rmem和tcp_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内存限制
使用 jstat 和 jmap 监控
# 查看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 # 网络统计
htop 和 glances
# 安装 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并发连接
优化步骤
内核调优
# 编辑 /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 = 1024Nginx 配置 “`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
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监控与验证 “`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
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
监控与验证 “`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 优化原则
- 测量优先:在优化前,先使用监控工具了解当前性能瓶颈。
- 逐步调整:每次只调整一个参数,观察效果后再继续。
- 备份配置:修改系统配置前,备份原始文件。
- 测试验证:在生产环境应用前,先在测试环境验证。
- 文档记录:记录所有优化步骤和效果,便于回滚和复盘。
7.2 常见误区
- 过度优化:不要为了优化而优化,确保优化措施真正解决性能问题。
- 忽略硬件限制:软件优化无法突破硬件瓶颈。
- 不考虑业务场景:不同业务场景需要不同的优化策略。
- 忽视安全:性能优化不应以牺牲安全性为代价。
7.3 持续优化
性能优化是一个持续的过程,需要定期:
- 监控系统性能指标
- 分析日志和报告
- 调整配置参数
- 升级硬件和软件
结语
AlmaLinux 性能优化是一个系统工程,需要从内核到应用层的全面考虑。通过本文提供的实战指南,您可以系统地优化 AlmaLinux 系统,提升应用性能。记住,优化是一个持续的过程,需要根据实际业务需求和监控数据不断调整。
在实际操作中,请务必在测试环境验证所有优化措施,并做好备份和回滚计划。祝您优化顺利!
