下面是一个简单的 Linux 服务器性能优化案例:优化一个 Web 应用服务器,提升其内存使用效率和磁盘 I/O 性能。
场景描述
一台运行着 Nginx 和 MySQL 的 Web 应用服务器,用户反馈服务器在高并发时响应速度变慢,CPU 和内存利用率升高,磁盘 I/O 延迟显著。目标是通过内存管理和磁盘 I/O 调优提升服务器性能。
优化步骤
1. 问题诊断
检查内存使用情况 使用
free -m
和vmstat
命令查看内存使用情况。free -m vmstat 1 5
分析磁盘 I/O 使用
iostat
或iotop
检查磁盘 I/O 活跃度。iostat -x 1 5
查看系统负载 使用
top
和htop
找出消耗内存和 I/O 的进程。top
分析文件系统缓存与交换区
cat /proc/meminfo | grep -E "Buffers|Cached|Swap"
MySQL 慢查询日志 查看慢查询是否增加了磁盘压力。
2. 优化策略
2.1 优化内存管理
调整 Swappiness 减少交换分区的使用,避免频繁的 I/O 操作。
echo 10 > /proc/sys/vm/swappiness echo "vm.swappiness=10" >> /etc/sysctl.conf
调整缓存清理策略 优化缓存清理以避免过多的缓存耗尽内存。
echo 1 > /proc/sys/vm/drop_caches echo "vm.dirty_ratio=15" >> /etc/sysctl.conf echo "vm.dirty_background_ratio=5" >> /etc/sysctl.conf sysctl -p
调整 MySQL 缓存 增加 MySQL 的缓存分配,减少磁盘读写。 在 MySQL 配置文件
/etc/mysql/my.cnf
中:[mysqld] query_cache_size = 128M query_cache_type = 1 innodb_buffer_pool_size = 1G innodb_log_file_size = 256M
重启 MySQL:
[mysqld] query_cache_size = 128M query_cache_type = 1 innodb_buffer_pool_size = 1G innodb_log_file_size = 256M
2.2 优化磁盘 I/O
使用 SSD 将关键数据库文件迁移到 SSD。
调整文件系统挂载参数 对于常用的 ext4 文件系统,添加优化参数: 修改
/etc/fstab
:/dev/sda1 / ext4 defaults,noatime,nodiratime,barrier=0,data=writeback 0 1
重新挂载:
mount -o remount /
使用 I/O 调度器 切换为性能更优的调度器(如
deadline
或noop
)。echo deadline > /sys/block/sda/queue/scheduler
永久生效: 修改
/etc/default/grub
:GRUB_CMDLINE_LINUX="elevator=deadline"
更新 GRUB 配置并重启:
update-grub reboot
启用 RAID 或 LVM 使用 RAID 提升磁盘并发性能,或 LVM 执行快照备份。
使用异步 I/O 在应用代码中使用异步 I/O 减轻 I/O 阻塞。
2.3 网络优化(补充)
调整 Nginx 配置以支持高并发:
worker_processes auto; worker_connections 1024; keepalive_timeout 15; sendfile on; tcp_nopush on; tcp_nodelay on;
重启 Nginx:
systemctl restart nginx
3. 结果验证
压力测试 使用工具(如
ab
或wrk
)对服务器进行压力测试。ab -n 10000 -c 100 http://yourserver.com/
监控系统负载 观察负载、内存和 I/O 使用情况,确保优化有效。
最终代码脚本
以下脚本自动执行上述步骤:
#!/bin/bash # 调整 Swappiness echo "Setting swappiness to 10" echo 10 > /proc/sys/vm/swappiness echo "vm.swappiness=10" >> /etc/sysctl.conf # 调整缓存清理策略 echo "Optimizing cache settings" echo 1 > /proc/sys/vm/drop_caches echo "vm.dirty_ratio=15" >> /etc/sysctl.conf echo "vm.dirty_background_ratio=5" >> /etc/sysctl.conf sysctl -p # 优化 I/O 调度器 echo "Setting I/O scheduler to deadline" echo deadline > /sys/block/sda/queue/scheduler sed -i 's/GRUB_CMDLINE_LINUX=""/GRUB_CMDLINE_LINUX="elevator=deadline"/' /etc/default/grub update-grub # 优化文件系统挂载参数 echo "Optimizing file system mount options" sed -i 's/defaults/defaults,noatime,nodiratime,barrier=0,data=writeback/' /etc/fstab mount -o remount / # 重启服务 echo "Restarting services" systemctl restart mysql systemctl restart nginx echo "Optimization complete. Please monitor the system performance."
通过上述优化,可以有效提升服务器的内存管理效率和磁盘 I/O 性能。