引言:为什么需要对AlmaLinux进行性能优化
AlmaLinux作为一个企业级Linux发行版,继承了RHEL的稳定性和安全性,但在实际生产环境中,默认配置往往无法充分发挥硬件的全部潜力。性能优化是一个系统性的工程,涉及内核参数调整、资源调度策略、文件系统优化等多个层面。通过合理的优化,我们可以显著提升系统吞吐量、降低延迟、提高资源利用率,从而更好地支撑业务需求。
一、内核参数调优:sysctl.conf的深度优化
1.1 网络性能优化
网络性能是服务器的关键指标之一。通过调整内核网络栈参数,可以显著提升网络吞吐量和连接处理能力。
核心参数调整示例:
# 编辑 /etc/sysctl.conf 文件,添加以下内容
# 增加TCP最大连接队列
net.core.somaxconn = 65535
# 增加网络设备队列长度
net.core.netdev_max_backlog = 65535
# 增加TCP接收缓冲区
net.ipv4.tcp_rmem = 4096 87380 6291456
# 增加TCP发送缓冲区
net.ipv4.tcp_wmem = 4096 65536 6291456
# 启用TCP快速打开
net.ipv4.tcp_fastopen = 3
# 增加TIME_WAIT状态套接字的最大数量
net.ipv4.tcp_max_tw_buckets = 2000000
# 启用TIME_WAIT套接字重用
net.ipv4.tcp_tw_reuse = 1
# 减少FIN超时时间
net.ipv4.tcp_fin_timeout = 15
# 增加可用端口范围
net.ipv4.ip_local_port_range = 1024 65535
# 增加最大文件描述符数量
fs.file-max = 2097152
# 增加套接字缓冲区最大值
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
应用配置:
# 使配置立即生效
sysctl -p /etc/sysctl.conf
参数详解:
somaxconn:定义了每个监听端口的连接队列最大长度。在高并发场景下,如果队列过小会导致连接被丢弃。tcp_rmem/wmem:定义了TCP缓冲区的最小、默认和最大值。适当增大可以提高网络吞吐量,但会占用更多内存。tcp_fastopen:启用TFO可以减少TCP三次握手的延迟,特别适合短连接场景。
1.2 内存管理优化
内存管理参数直接影响系统的内存分配策略和交换行为。
关键参数配置:
# /etc/sysctl.conf
# 降低交换倾向,优先使用物理内存
vm.swappiness = 10
# 增加内存分配策略的积极程度
vm.overcommit_memory = 1
# 设置内存过量使用的允许上限(百分比)
vm.overcommit_ratio = 80
# 增加脏页比例上限
vm.dirty_ratio = 40
# 增加脏页背景写回比例
vm.dirty_background_ratio = 10
# 增加PDflush进程数量
vm.dirty_writeback_centisecs = 500
# 增加内存回收的积极程度
vm.vfs_cache_pressure = 100
# 增加内存映射区域限制
vm.max_map_count = 262144
参数说明:
swappiness:控制内核使用交换分区的倾向。值越低,越倾向于使用物理内存。对于数据库服务器,建议设置为1-10。overcommit_memory:设置为1表示总是允许过量使用内存,适合内存需求较大的应用。dirty_ratio:当脏页占内存比例达到此值时,系统会阻塞所有写操作直到脏页被写回。适当增大可以减少I/O频率,但会增加数据丢失风险。
1.3 CPU调度优化
CPU调度策略直接影响系统的响应速度和处理能力。
配置示例:
# /etc/sysctl.conf
# 设置进程调度器的调度周期(毫秒)
kernel.sched_latency_ns = 10000000
# 设置最小粒度时间
kernel.sched_min_granularity_ns = 1000000
# 设置唤醒新任务的开销
kernel.sched_wakeup_granularity_ns = 1500000
# 设置CPU负载均衡的开销
kernel.sched_migration_cost_ns = 500000
# 设置RT任务的带宽限制
kernel.sched_rt_runtime_us = 950000
# 设置RT任务的周期
kernel.sched_rt_period_us = 1000000
二、文件系统优化策略
2.1 XFS文件系统优化
XFS是AlmaLinux默认的文件系统,特别适合大文件和高并发场景。
挂载选项优化:
# 编辑 /etc/fstab
# 原有行示例:
# /dev/mapper/centos-root / xfs defaults 0 0
# 优化后:
/dev/mapper/centos-root / xfs defaults,noatime,nodiratime,logbufs=8,logbsize=256k,largeio,inode64,swalloc 0 0
选项说明:
noatime:禁止更新访问时间戳,减少写操作nodiratime:禁止更新目录访问时间戳logbufs=8:增加日志缓冲区数量logbsize=256k:增大日志缓冲区大小largeio:启用大I/O支持inode64:支持64位inode,适合大文件系统swalloc:根据文件系统边界对齐分配
XFS性能调优工具:
# 查看XFS文件系统统计信息
xfs_info /dev/mapper/centos-root
# 调整XFS分配器参数
xfs_io -c "allocsize 1g" /path/to/file
# 启用XFS延迟分配
xfs_io -c "setxattr user.delayed 1" /path/to/directory
2.2 EXT4文件系统优化(如果使用)
# /etc/fstab 挂载选项
/dev/sda1 /data ext4 defaults,noatime,nodiratime,data=writeback,barrier=0,delalloc 0 0
选项说明:
data=writeback:启用回写模式,提高写性能(但降低数据安全性)barrier=0:禁用写屏障(仅在UPS保护环境下使用)delalloc:延迟分配,减少碎片
2.3 I/O调度器优化
查看当前调度器:
cat /sys/block/sda/queue/scheduler
# 输出示例:noop [deadline] cfq
修改调度器:
# 临时修改
echo deadline > /sys/block/sda/queue/scheduler
# 永久修改(创建udev规则)
cat > /etc/udev/rules.d/60-ioscheduler.rules << 'EOF'
# 为所有SATA设备设置deadline调度器
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="deadline"
# 为所有NVMe设备设置none调度器
ACTION=="add|change", KERNEL=="nvme[0-9]*", ATTR{queue/scheduler}="none"
EOF
调度器选择建议:
- deadline:适合数据库等对延迟敏感的应用
- cfq:适合桌面环境,提供公平的I/O分配
- noop:适合虚拟化环境或SSD,因为SSD不需要复杂的调度
- kyber:适合高速SSD,提供更好的QoS
- bfq:适合桌面和交互式应用
三、系统资源管理与控制
3.1 cgroups v2配置与使用
cgroups是Linux内核功能,用于限制和隔离进程的资源使用。
启用cgroups v2:
# 检查是否已启用
stat -fc %T /sys/fs/cgroup/
# 如果是cgroup v1,需要挂载v2
# 编辑 /etc/fstab
cgroup2 /sys/fs/cgroup/cgroup2 cgroup2 defaults 0 0
# 重新挂载
mount -a
创建资源控制组示例:
# 创建cgroup目录
mkdir -p /sys/fs/cgroup/system.slice/webserver.slice
# 设置CPU限制(限制为2个CPU核心)
echo "200000" > /sys/fs/cgroup/system.slice/webserver.slice/cpu.max
# 设置内存限制(4GB)
echo "4G" > /sys/fs/cgroup/system.slice/webserver.slice/memory.max
# 设置I/O限制(限制为100MB/s)
echo "104857600" > /sys/fs/cgroup/system.slice/webserver.slice/io.max
# 将进程添加到cgroup
echo <PID> > /sys/fs/cgroup/system.slice/webserver.slice/cgroup.procs
使用systemd集成cgroups:
# 创建systemd服务单元
cat > /etc/systemd/system/webserver.service << 'EOF'
[Unit]
Description=Web Server
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/python3 -m http.server 8000
# CPU限制:最多使用2个核心
CPUQuota=200%
# 内存限制:4GB
MemoryLimit=4G
# 重启策略
Restart=always
[Install]
WantedBy=multi-user.target
EOF
# 重新加载并启动
systemctl daemon-reload
systemctl start webserver.service
3.2 Systemd资源控制
使用systemd-run临时限制资源:
# 运行一个CPU密集型任务,限制为1个CPU核心
systemd-run --unit=cpu-intensive-task --scope -p CPUQuota=100% stress --cpu 4
# 运行一个内存密集型任务,限制为2GB
systemd-run --unit=mem-intensive-task --scope -p MemoryLimit=2G stress --vm 2 --vm-bytes 1G
# 运行一个I/O密集型任务,限制为50MB/s
systemd-run --unit=io-intensive-task --scope -p IOReadBandwidthMax=/dev/sda:50M stress --io 2 --timeout 60s
查看资源使用情况:
# 查看cgroup信息
systemctl status webserver.service
# 输出会显示CPU、内存等资源使用情况
# 使用systemd-cgtop实时查看
systemd-cgtop
# 使用systemd-cgls查看层次结构
systemd-cgls
3.3 进程优先级调整
nice和renice命令:
# 启动时设置优先级(范围-20到19,值越低优先级越高)
nice -n -10 /usr/bin/critical-app
# 调整运行中进程的优先级
renice -n -10 -p <PID>
# 查看进程优先级
ps -o pid,ni,cmd -p <PID>
实时调度策略(适用于实时任务):
# 设置为SCHED_FIFO策略(需要root权限)
chrt -f -p 99 <PID>
# 设置为SCHED_RR策略
chrt -r -p 99 <PID>
# 启动时设置
chrt -f 99 /usr/bin/realtime-task
四、性能监控与分析工具
4.1 系统级监控工具
htop(增强版top):
# 安装
dnf install htop
# 使用技巧:
# F6:排序方式
# F4:过滤进程
# F9:发送信号
# F10:退出
# 空格:标记进程
# a:绑定到特定CPU
# i:设置I/O优先级
vmstat(虚拟内存统计):
# 每秒刷新一次,共10次
vmstat 1 10
# 输出详解:
# procs: r(运行队列), b(阻塞)
# memory: swpd(交换使用), free(空闲), buff(缓冲), cache(缓存)
# swap: si(换入), so(换出)
# io: bi(块输入), bo(块输出)
# system: in(中断), cs(上下文切换)
# cpu: us(user), sy(system), id(idle), wa(wait), st(steal)
iostat(I/O统计):
# 安装
dnf install sysstat
# 查看I/O统计
iostat -x 1 10
# 输出详解:
# rrqm/s: 每秒合并读请求数
# wrqm/s: 每秒合并写请求数
# r/s: 每秒读请求数
# w/s: 每秒写请求数
# rMB/s: 每秒读取MB数
# wMB/s: 每秒写入MB数
# avgqu-sz: 平均队列长度
# await: 平均I/O等待时间(ms)
# %util: I/O利用率百分比
mpstat(多核CPU统计):
# 每个CPU核心的详细统计
mpstat -P ALL 1 10
4.2 高级性能分析工具
perf(Linux性能计数器):
# 安装
dnf install perf
# 记录系统级性能数据(60秒)
perf record -a -g -F 997 -e cycles,instructions,cache-misses -- sleep 60
# 查看报告
perf report
# 分析特定进程
perf record -p <PID> -g -- sleep 30
perf report
bpftrace(动态追踪):
# 安装
dnf install bpftrace
# 示例:追踪所有文件系统操作
bpftrace -e 'tracepoint:syscalls:sys_enter_open { printf("%s %s\n", comm, str(args->filename)); }'
# 追踪特定进程的系统调用
bpftrace -e 'tracepoint:raw_syscalls:sys_enter /pid == 1234/ { @syscalls[comm] = count(); }'
strace(系统调用追踪):
# 追踪进程的所有系统调用
strace -p <PID>
# 只追踪特定系统调用
strace -e trace=open,read,write -p <PID>
# 统计系统调用耗时
strace -c -p <PID>
# 追踪并输出到文件
strace -o /tmp/trace.log -p <PID>
五、网络性能深度优化
5.1 TCP协议栈调优
内核参数补充:
# /etc/sysctl.conf
# 启用TCP BBR拥塞控制算法(推荐)
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
# TCP连接追踪优化
net.netfilter.nf_conntrack_max = 2000000
net.netfilter.nf_conntrack_tcp_timeout_established = 86400
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 45
# TCP重传和超时优化
net.ipv4.tcp_retries2 = 8
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_synack_retries = 2
# TCP时间戳
net.ipv4.tcp_timestamps = 1
# TCP SACK(选择性确认)
net.ipv4.tcp_sack = 1
# TCP窗口缩放
net.ipv4.tcp_window_scaling = 1
BBR拥塞控制算法说明: BBR(Bottleneck Bandwidth and RTT)是Google开发的拥塞控制算法,相比传统的Reno、CUBIC算法,能显著提高高延迟、高带宽网络的吞吐量。
5.2 网络接口优化
ethtool参数调整:
# 查看网卡当前设置
ethtool eth0
# 关闭网卡节能模式(提高性能)
ethtool -s eth0 wol d
ethtool -s eth0 autoneg off
# 设置固定速度和双工模式(根据网络环境)
ethtool -s eth0 speed 10000 duplex full
# 增加环形缓冲区大小
ethtool -G eth0 rx 4096 tx 4096
# 启用接收端缩放(RSS)
ethtool -K eth0 rxhash on
# 查看和设置中断亲和性
cat /proc/interrupts | grep eth0
# 将中断分配到特定CPU
echo 2 > /proc/irq/<IRQ_NUMBER>/smp_affinity
网络接口队列配置:
# 查看当前队列数
cat /sys/class/net/eth0/queues/rx-0/rps_cpus
# 设置接收队列的CPU亲和性(多队列网卡)
# 将队列0绑定到CPU0-3
echo f > /sys/class/net/eth0/queues/rx-0/rps_cpus
# 设置发送队列
echo f > /sys/class/net/eth0/queues/tx-0/xps_cpus
# 调整队列长度
echo 2048 > /sys/class/net/eth0/queues/rx-0/rps_flow_cnt
5.3 网络性能测试工具
iperf3(网络带宽测试):
# 服务端
iperf3 -s -p 5201
# 客户端
iperf3 -c <SERVER_IP> -p 5201 -t 60 -i 1 -P 4
# 测试UDP
iperf3 -c <SERVER_IP> -u -b 10G -t 60
ping和traceroute优化:
# 使用大包测试MTU和延迟
ping -s 1472 -M do <HOST>
# TCP traceroute
traceroute -T <HOST>
# 使用mtr进行持续监控
mtr -r -c 100 <HOST>
六、存储性能优化
6.1 磁盘I/O优化
I/O调度器深度调优:
# 查看deadline调度器参数
cat /sys/block/sda/queue/iosched/*
# 调整deadline参数
# 读请求超时(毫秒)
echo 500 > /sys/block/sda/queue/iosched/read_expire
# 写请求超时(毫秒)
echo 5000 > /sys/block/sda/queue/iosched/write_expire
# 写请求合并
echo 16 > /sys/block/sda/queue/iosched/writes_starved
预读和缓存优化:
# 查看当前预读大小(单位:KB)
blockdev --getra /dev/sda
# 设置预读大小(建议为1024-8192KB)
blockdev --setra 8192 /dev/sda
# 禁用预读(对于随机访问场景)
blockdev --setra 0 /dev/sda
# 清空缓存(测试时使用)
echo 3 > /proc/sys/vm/drop_caches
LVM性能优化:
# 查看LVM卷信息
lvs -o +segtype
# 调整LVM条带化(提高并行性)
lvcreate -L 1T -i 4 -I 64 -n striped_vol vg0 /dev/sdb /dev/sdc /dev/sdd /dev/sde
# 调整LVM缓存
lvconvert --type cache --cachepool data_pool vg0/lv_data
lvchange --cachemode writeback vg0/lv_data
6.2 文件系统性能监控
使用ioping测试磁盘延迟:
# 安装
dnf install ioping
# 测试随机读延迟
ioping -c 1000 -i 0 -R /dev/sda
# 测试顺序读
ioping -c 1000 -i 0 -L /dev/sda
使用fio进行综合测试:
# 安装
dnf install fio
# 随机读测试
fio --name=randread --ioengine=libaio --iodepth=64 --rw=randread --bs=4k --size=1G --numjobs=8 --runtime=300 --group_reporting
# 随机写测试
fio --name=randwrite --ioengine=libaio --iodepth=64 --rw=randwrite --bs=4k --size=1G --numjobs=8 --runtime=300 --group_reporting
# 混合读写测试(70%读,30%写)
fio --name=mixed --ioengine=libaio --iodepth=64 --rw=randrw --rwmixread=70 --bs=4k --size=1G --numjobs=8 --runtime=300 --group_reporting
七、应用层优化策略
7.1 数据库服务器优化
PostgreSQL优化示例:
# 编辑 postgresql.conf
# 内存相关
shared_buffers = 8GB # 通常设置为内存的25%
effective_cache_size = 24GB # 设置为内存的75%
work_mem = 256MB # 每个查询的内存
maintenance_work_mem = 2GB # 维护操作内存
# WAL相关
wal_buffers = 16MB
checkpoint_timeout = 15min
max_wal_size = 4GB
min_wal_size = 1GB
# 查询规划器
random_page_cost = 1.1 # SSD优化
effective_io_concurrency = 200 # SSD优化
# 日志相关
log_min_duration_statement = 1000 # 记录慢查询
log_checkpoints = on
log_connections = on
log_disconnections = on
MySQL优化示例:
# 编辑 my.cnf
[mysqld]
# 内存相关
innodb_buffer_pool_size = 12G # 通常为内存的50-70%
innodb_log_file_size = 2G
innodb_log_buffer_size = 64M
key_buffer_size = 256M
# I/O相关
innodb_flush_method = O_DIRECT
innodb_flush_log_at_trx_commit = 2 # 性能优先
innodb_io_capacity = 2000 # SSD优化
innodb_io_capacity_max = 4000
# 连接相关
max_connections = 500
thread_cache_size = 50
table_open_cache = 2000
# 查询缓存(MySQL 8.0已移除)
# query_cache_type = 0
# query_cache_size = 0
7.2 Web服务器优化
Nginx优化配置:
# /etc/nginx/nginx.conf
worker_processes auto; # 自动设置为CPU核心数
worker_rlimit_nofile 65535; # 工作进程文件描述符限制
events {
worker_connections 4096; # 每个工作进程的连接数
use epoll; # 使用epoll事件模型
multi_accept on; # 一次性接受多个连接
}
http {
# 连接相关
keepalive_timeout 65;
keepalive_requests 1000;
# 缓冲相关
client_body_buffer_size 128k;
client_max_body_size 10m;
client_header_buffer_size 1k;
large_client_header_buffers 4 4k;
# 文件缓存
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_comp_level 6;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
# 隐藏版本号
server_tokens off;
}
Apache优化配置:
# /etc/httpd/conf/httpd.conf
# MPM Event配置
StartServers 8
MinSpareServers 8
MaxSpareServers 16
ServerLimit 256
MaxRequestWorkers 256
MaxConnectionsPerChild 2000
# 保持连接
KeepAlive On
KeepAliveTimeout 5
MaxKeepAliveRequests 100
# 模块优化
# 禁用不需要的模块
# LoadModule rewrite_module modules/mod_rewrite.so # 如果不需要,注释掉
# 缓存配置
LoadModule cache_module modules/mod_cache.so
LoadModule cache_disk_module modules/mod_cache_disk.so
CacheRoot /var/cache/httpd
CacheEnable disk /
CacheDirLevels 2
CacheDirLength 1
7.3 应用程序性能分析
使用perf分析应用性能:
# 分析CPU热点
perf record -g -p <PID> -- sleep 30
perf report
# 分析系统调用
perf trace -p <PID>
# 分析内存分配
perf record -e kmem:kmalloc -p <PID> -- sleep 10
perf report
使用valgrind检测内存问题:
# 安装
dnf install valgrind
# 检测内存泄漏
valgrind --leak-check=full --show-leak-kinds=all ./myapp
# 检测性能问题
valgrind --tool=callgrind ./myapp
kcachegrind callgrind.out.<PID>
八、虚拟化环境优化
8.1 KVM虚拟化优化
宿主机优化:
# 编辑 /etc/sysctl.conf
# 增加虚拟内存映射区域
vm.max_map_count = 262144
# 优化内存回收
vm.swappiness = 10
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
# 增加文件描述符
fs.file-max = 2097152
# CPU亲和性优化
# 将虚拟机进程绑定到特定CPU核心
virsh vcpupin <vm-name> 0 0
virsh vcpupin <vm-name> 1 1
虚拟机配置优化:
<!-- 编辑虚拟机XML配置 -->
<domain type='kvm'>
<memory unit='GiB'>16</memory>
<currentMemory unit='GiB'>16</currentMemory>
<vcpu placement='static'>8</vcpu>
<!-- CPU模式 -->
<cpu mode='host-passthrough'>
<topology sockets='1' cores='4' threads='2'/>
</cpu>
<!-- 内存大页 -->
<memoryBacking>
<hugepages/>
</memoryBacking>
<!-- I/O模式 -->
<devices>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2' cache='none' io='native'/>
<!-- 其他配置 -->
</disk>
<!-- 网络 -->
<interface type='bridge'>
<model type='virtio'/>
<driver name='vhost' txmode='iothread' ioeventfd='on' event_idx='off'/>
</interface>
</devices>
</domain>
8.2 容器环境优化
Docker优化:
# 编辑 /etc/docker/daemon.json
{
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"default-ulimits": {
"nofile": {
"Name": "nofile",
"Hard": 65536,
"Soft": 65536
}
},
"exec-opts": ["native.cgroupdriver=cgroupfs"]
}
# 重启Docker
systemctl restart docker
容器资源限制:
# 运行容器时限制资源
docker run -d \
--name myapp \
--cpus="2" \
--memory="4g" \
--memory-swap="4g" \
--pids-limit=1000 \
--ulimit nofile=65536:65536 \
myimage
九、性能优化实战案例
9.1 高并发Web服务器优化案例
场景描述: 一台运行Nginx的AlmaLinux服务器,面临高并发连接时出现响应延迟和连接丢弃问题。
诊断过程:
# 1. 查看系统负载
uptime
# 15:30:01 up 10 days, 3:45, 2 users, load average: 12.50, 8.30, 5.20
# 2. 查看网络连接状态
ss -s
# Total: 25000 (est 24000)
# 3. 查看TCP重传率
cat /proc/net/netstat | grep TcpExt | awk '{print $21, $22}'
# RetransSegs 125000
# 4. 使用perf分析CPU使用
perf top -p $(pgrep nginx)
# 发现大量时间花费在软中断处理上
优化措施:
# 1. 网络参数优化
cat >> /etc/sysctl.conf << 'EOF'
# 高并发优化
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fastopen = 3
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 6291456
net.ipv4.tcp_wmem = 4096 65536 6291456
EOF
sysctl -p
# 2. Nginx配置优化
cat > /etc/nginx/conf.d/high-conn.conf << 'EOF'
worker_processes auto;
worker_rlimit_nofile 65535;
events {
worker_connections 4096;
use epoll;
multi_accept on;
}
http {
keepalive_timeout 65;
keepalive_requests 1000;
client_body_buffer_size 128k;
client_max_body_size 10m;
open_file_cache max=200000 inactive=20s;
}
EOF
# 3. 系统资源限制
echo "* soft nofile 65536" >> /etc/security/limits.conf
echo "* hard nofile 65536" >> /etc/security/limits.conf
# 4. 网络接口优化
ethtool -G eth0 rx 4096 tx 4096
ethtool -C eth0 rx-usecs 100 tx-usecs 100
# 5. CPU亲和性优化
# 将Nginx worker绑定到不同CPU
cat > /etc/nginx/nginx.conf << 'EOF'
worker_processes 8;
worker_cpu_affinity auto;
...
EOF
# 6. 使用cgroups限制日志进程
mkdir -p /sys/fs/cgroup/system.slice/nginx-log.slice
echo "500000" > /sys/fs/cgroup/system.slice/nginx-log.slice/cpu.max
echo "1G" > /sys/fs/cgroup/system.slice/nginx-log.slice/memory.max
优化效果:
- 并发连接数从25000提升到80000
- 平均响应时间从150ms降低到30ms
- TCP重传率从8%降低到0.5%
9.2 数据库服务器内存优化案例
场景描述: PostgreSQL数据库服务器在高负载时出现OOM(内存不足)导致进程被杀死。
诊断过程:
# 1. 查看内存使用情况
free -h
# total used free shared buff/cache available
# Mem: 62G 45G 2.5G 1.2G 15G 15G
# 2. 查看OOM日志
dmesg | grep -i oom
# Out of memory: Kill process 1234 (postgres) score 850 or sacrifice child
# 3. 查看PostgreSQL内存配置
psql -c "SHOW shared_buffers;"
psql -c "SHOW work_mem;"
psql -c "SHOW effective_cache_size;"
# 4. 使用smem分析内存分布
smem -t -k -P postgres
优化措施:
# 1. 调整PostgreSQL配置
cat >> /var/lib/pgsql/15/data/postgresql.conf << 'EOF'
# 内存优化(总内存64GB)
shared_buffers = 16GB # 25% of RAM
effective_cache_size = 48GB # 75% of RAM
work_mem = 64MB # 每个查询操作
maintenance_work_mem = 2GB # 维护操作
max_connections = 200 # 限制连接数
shared_memory_type = mmap # 使用mmap
dynamic_shared_memory_type = mmap # 动态共享内存
EOF
# 2. 系统内核参数优化
cat >> /etc/sysctl.conf << 'EOF'
# 内存管理
vm.swappiness = 1
vm.overcommit_memory = 2
vm.overcommit_ratio = 75
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
vm.vfs_cache_pressure = 50
EOF
sysctl -p
# 3. 使用cgroups限制PostgreSQL资源
mkdir -p /sys/fs/cgroup/system.slice/postgresql.slice
echo "50000000" > /sys/fs/cgroup/system.slice/postgresql.slice/memory.max
echo "400000" > /sys/fs/cgroup/system.slice/postgresql.slice/cpu.max
# 4. 配置systemd服务
cat > /etc/systemd/system/postgresql-15.service.d/override.conf << 'EOF'
[Service]
# 限制内存使用
MemoryLimit=50G
CPUQuota=400%
# 重启策略
Restart=always
RestartSec=10
EOF
systemctl daemon-reload
systemctl restart postgresql-15
# 5. 监控配置
# 安装并配置prometheus-postgres-exporter
dnf install prometheus-postgres-exporter
cat > /etc/prometheus/postgres_exporter.conf << 'EOF'
DATA_SOURCE_NAME="postgresql://exporter:password@localhost:5432/postgres?sslmode=disable"
EOF
systemctl enable --now prometheus-postgres-exporter
优化效果:
- 系统稳定性提升,OOM不再发生
- 查询性能提升30%
- 内存使用率从95%降低到70%
- 缓存命中率从85%提升到98%
十、持续性能监控与调优
10.1 监控体系搭建
Prometheus + Grafana监控栈:
# 安装Prometheus
dnf install prometheus
# 配置Prometheus
cat > /etc/prometheus/prometheus.yml << 'EOF'
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'node'
static_configs:
- targets: ['localhost:9100']
- job_name: 'postgres'
static_configs:
- targets: ['localhost:9187']
- job_name: 'nginx'
static_configs:
- targets: ['localhost:9113']
EOF
# 安装node_exporter
dnf install node_exporter
systemctl enable --now node_exporter
# 安装Grafana
dnf install grafana
systemctl enable --now grafana-server
自定义监控脚本:
#!/bin/bash
# /usr/local/bin/performance-monitor.sh
# 获取系统关键指标
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
MEM_USAGE=$(free | grep Mem | awk '{printf("%.2f", $3/$2 * 100.0)}')
DISK_IO=$(iostat -x 1 2 | tail -n +4 | awk '{sum+=$12} END {print sum/NR}')
NETWORK=$(cat /proc/net/dev | grep eth0 | awk '{print $2 + $10}')
# 输出到Prometheus格式
echo "# HELP system_cpu_usage CPU usage percentage"
echo "# TYPE system_cpu_usage gauge"
echo "system_cpu_usage $CPU_USAGE"
echo "# HELP system_memory_usage Memory usage percentage"
echo "# TYPE system_memory_usage gauge"
echo "system_memory_usage $MEM_USAGE"
echo "# HELP disk_io_utilization Disk I/O utilization"
echo "# TYPE disk_io_utilization gauge"
echo "disk_io_utilization $DISK_IO"
echo "# HELP network_bytes_total Network bytes"
echo "# TYPE network_bytes_total counter"
echo "network_bytes_total $NETWORK"
10.2 自动化调优工具
使用tuned进行动态调优:
# 安装tuned
dnf install tuned
# 查看可用配置文件
tuned-adm list
# 应用优化配置
tuned-adm profile throughput-performance
# 自定义配置
mkdir -p /etc/tuned/custom-profile
cat > /etc/tuned/custom-profile/tuned.conf << 'EOF'
[main]
include=throughput-performance
[cpu]
governor=performance
energy_perf_bias=performance
[vm]
swappiness=10
dirty_ratio=15
dirty_background_ratio=5
[sysctl]
net.core.somaxconn=65535
net.ipv4.tcp_fastopen=3
EOF
tuned-adm profile custom-profile
使用sysctl-tuning工具:
# 安装
pip3 install sysctl-tuning
# 生成优化配置
sysctl-tuning --profile web-server > /etc/sysctl.d/99-web-server.conf
# 应用配置
sysctl -p /etc/sysctl.d/99-web-server.conf
十一、最佳实践总结
11.1 优化原则
- 测量优先:在优化前必须建立基准,使用工具测量当前性能
- 渐进式调整:每次只调整一个参数,观察效果后再继续
- 理解业务:优化必须基于实际业务场景,避免盲目调整
- 监控持续:优化后需要持续监控,确保效果稳定
- 文档记录:所有优化操作必须记录,便于回滚和审计
11.2 常见优化陷阱
- 过度优化:过早优化是万恶之源,只在性能成为瓶颈时优化
- 参数冲突:某些参数组合可能导致系统不稳定
- 忽略硬件:软件优化无法弥补硬件瓶颈
- 单点优化:系统性能是整体表现,需要全面考虑
- 忽视安全:某些优化可能降低系统安全性
11.3 性能优化检查清单
#!/bin/bash
# AlmaLinux性能优化检查清单
echo "=== AlmaLinux性能优化检查清单 ==="
# 1. 内核参数检查
echo "1. 检查内核参数..."
if grep -q "net.core.somaxconn" /etc/sysctl.conf; then
echo "✓ TCP连接队列已优化"
else
echo "✗ TCP连接队列未优化"
fi
# 2. 文件系统检查
echo "2. 检查文件系统挂载选项..."
mount | grep "xfs" | grep -q "noatime" && echo "✓ noatime已启用" || echo "✗ noatime未启用"
# 3. I/O调度器检查
echo "3. 检查I/O调度器..."
for disk in /sys/block/sd*/queue/scheduler; do
scheduler=$(cat $disk | grep -o '\[.*\]' | tr -d '[]')
echo " $(basename $(dirname $disk)): $scheduler"
done
# 4. 资源限制检查
echo "4. 检查资源限制..."
ulimit -n
echo " 文件描述符限制: $(ulimit -n)"
# 5. 监控工具检查
echo "5. 检查监控工具..."
which vmstat iostat mpstat perf &>/dev/null && echo "✓ 监控工具已安装" || echo "✗ 监控工具未安装"
# 6. 优化配置文件检查
echo "6. 检查优化配置文件..."
if [ -f /etc/sysctl.d/99-optimized.conf ]; then
echo "✓ 优化配置文件存在"
else
echo "✗ 优化配置文件不存在"
fi
echo "=== 检查完成 ==="
结论
AlmaLinux性能优化是一个持续的过程,需要结合业务需求、硬件环境和系统特性进行系统性调整。通过本文介绍的内核调优、文件系统优化、资源管理、监控分析等策略,可以显著提升系统性能。
关键要点:
- 内核参数:根据业务场景调整网络、内存、CPU参数
- 文件系统:选择合适的挂载选项和I/O调度器
- 资源管理:使用cgroups和systemd进行资源隔离和限制
- 监控分析:建立完善的监控体系,使用perf、bpftrace等工具深入分析
- 持续优化:性能优化是持续过程,需要不断测量、调整、验证
记住,优化不是一蹴而就的,需要在生产环境中谨慎实施,并做好回滚准备。建议先在测试环境验证优化效果,再逐步应用到生产环境。
