一个简单的Linux 服务器性能优化案例

下面是一个简单的 Linux 服务器性能优化案例:优化一个 Web 应用服务器,提升其内存使用效率和磁盘 I/O 性能。

场景描述

一台运行着 Nginx 和 MySQL 的 Web 应用服务器,用户反馈服务器在高并发时响应速度变慢,CPU 和内存利用率升高,磁盘 I/O 延迟显著。目标是通过内存管理和磁盘 I/O 调优提升服务器性能。


优化步骤

1. 问题诊断

  1. 检查内存使用情况 使用 free -mvmstat 命令查看内存使用情况。

    bash 复制代码
    free -m
    vmstat 1 5
  2. 分析磁盘 I/O 使用 iostatiotop 检查磁盘 I/O 活跃度。

    bash 复制代码
    iostat -x 1 5
  3. 查看系统负载 使用 tophtop 找出消耗内存和 I/O 的进程。

    bash 复制代码
    top
  4. 分析文件系统缓存与交换区

    bash 复制代码
    cat /proc/meminfo | grep -E "Buffers|Cached|Swap"
  5. MySQL 慢查询日志 查看慢查询是否增加了磁盘压力。


2. 优化策略

2.1 优化内存管理

  1. 调整 Swappiness 减少交换分区的使用,避免频繁的 I/O 操作。

    bash 复制代码
    echo 10 > /proc/sys/vm/swappiness
    echo "vm.swappiness=10" >> /etc/sysctl.conf
  2. 调整缓存清理策略 优化缓存清理以避免过多的缓存耗尽内存。

    bash 复制代码
    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
  3. 调整 MySQL 缓存 增加 MySQL 的缓存分配,减少磁盘读写。 在 MySQL 配置文件 /etc/mysql/my.cnf 中:

    ini 复制代码
    [mysqld]
    query_cache_size = 128M
    query_cache_type = 1
    innodb_buffer_pool_size = 1G
    innodb_log_file_size = 256M

    重启 MySQL:

    bash 复制代码
    systemctl restart mysql

2.2 优化磁盘 I/O

  1. 使用 SSD 将关键数据库文件迁移到 SSD。

  2. 调整文件系统挂载参数 对于常用的 ext4 文件系统,添加优化参数: 修改 /etc/fstab

    bash 复制代码
    /dev/sda1 / ext4 defaults,noatime,nodiratime,barrier=0,data=writeback 0 1

    重新挂载:

    bash 复制代码
    mount -o remount /
  3. 使用 I/O 调度器 切换为性能更优的调度器(如 deadlinenoop)。

    bash 复制代码
    echo deadline > /sys/block/sda/queue/scheduler

    永久生效: 修改 /etc/default/grub

    bash 复制代码
    GRUB_CMDLINE_LINUX="elevator=deadline"

    更新 GRUB 配置并重启:

    bash 复制代码
    update-grub
    reboot
  4. 启用 RAID 或 LVM 使用 RAID 提升磁盘并发性能,或 LVM 执行快照备份。

  5. 使用异步 I/O 在应用代码中使用异步 I/O 减轻 I/O 阻塞。


2.3 网络优化(补充)

调整 Nginx 配置以支持高并发:

nginx 复制代码
worker_processes auto;
worker_connections 1024;
keepalive_timeout 15;
sendfile on;
tcp_nopush on;
tcp_nodelay on;

重启 Nginx:

bash 复制代码
systemctl restart nginx

3. 结果验证

  1. 压力测试 使用工具(如 abwrk)对服务器进行压力测试。

    bash 复制代码
    ab -n 10000 -c 100 http://yourserver.com/
  2. 监控系统负载 观察负载、内存和 I/O 使用情况,确保优化有效。


最终代码脚本

以下脚本自动执行上述步骤:

bash 复制代码
#!/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 性能。

相关推荐
存在的五月雨2 分钟前
Mysql 事务和锁的一些概念和理解
数据库·mysql
计算机学姐11 分钟前
基于SpringBoot的在线骑行网站系统
java·vue.js·spring boot·后端·mysql·spring·tomcat
Calebbbbb12 分钟前
Windows 向 Vmware Ubuntu 传大文件校验不一致问题完整排查记录
linux·windows·ubuntu
被遗忘的旋律.17 分钟前
Linux驱动开发笔记(二十四)——(下)IIO + MPU6050驱动
linux·驱动开发·笔记
optimistic_chen29 分钟前
【Redis系列】Redis缓存
linux·数据库·redis·mysql·缓存·火山引擎
我想发发发37 分钟前
.deb格式软件包安装方式(Ubuntu 22.04为例)
linux·运维·ubuntu
cyber_两只龙宝38 分钟前
LVS-NAT模式实验配置以及详解
linux·运维·云原生·lvs
海涛高软42 分钟前
vmware虚拟机 ubuntu20.4手动设置静态IP
linux·运维·服务器
学嵌入式的小杨同学1 小时前
【嵌入式 C 语言实战】栈、队列、二叉树核心解析:存储原理 + 应用场景 + 实现思路
linux·c语言·网络·数据结构·数据库·后端·spring
VekiSon1 小时前
ARM架构——时钟系统与定时器详解
linux·c语言·arm开发·嵌入式硬件·架构