文章目录
调整文件系统缓冲区大小的方法及步骤
调整文件系统缓冲区大小是 Linux 系统性能调优的一个重要方面,尤其是对于 I/O 密集型的应用程序来说。Linux 系统使用了大量的内核缓冲区来缓存文件系统读取和写入操作的数据,这对于提高 I/O 效率至关重要。下面是调整文件系统缓冲区大小的方法及步骤:
了解相关内核参数
在调整文件系统缓冲区大小之前,我们需要了解几个与缓冲区相关的内核参数:
-
dirty_background_ratio:当空闲内存低于这个比例时,内核将开始主动地将脏页(即已经被修改但尚未写入磁盘的页面)写回到磁盘上。默认值通常是 10(表示 10%)。
-
dirty_ratio:当空闲内存低于这个比例时,内核将更加积极地将脏页写回磁盘。默认值通常也是 10。
-
dirty_expire_centisecs:脏页在被强制写回磁盘前的最大存活时间,单位是百分之一秒。
-
dirty_writeback_centisecs:控制脏页写回磁盘的时间间隔。
-
vm.dirty_background_bytes 和 vm.dirty_bytes:这两个参数分别控制何时开始后台写入脏页和何时开始积极写入脏页的内存阈值。
查看当前设置
首先,查看当前的设置:
cat /proc/sys/vm/dirty_background_ratio
cat /proc/sys/vm/dirty_ratio
cat /proc/sys/vm/dirty_expire_centisecs
cat /proc/sys/vm/dirty_writeback_centisecs
cat /proc/sys/vm/vm.dirty_background_bytes
cat /proc/sys/vm/vm.dirty_bytes
调整参数
根据你的系统需求,你可以调整上述参数。例如,如果你的系统有大量的空闲内存,并且 I/O 操作非常频繁,你可能希望降低 dirty_background_ratio
和 dirty_ratio
的值,以便更早地开始写回脏页,避免在内存紧张时出现大量的 I/O 操作。
修改参数
修改参数可以直接通过 sysctl
命令:
sudo sysctl vm.dirty_background_ratio=5
sudo sysctl vm.dirty_ratio=10
sudo sysctl vm.dirty_expire_centisecs=30000
sudo sysctl vm.dirty_writeback_centisecs=5000
sudo sysctl vm.dirty_background_bytes=$(( $(grep MemTotal /proc/meminfo | awk '{print $2}') * 5 / 100 ))
sudo sysctl vm.dirty_bytes=$(( $(grep MemTotal /proc/meminfo | awk '{print $2}') * 10 / 100 ))
将更改持久化
为了让这些更改在系统重启后仍然生效,你需要将它们写入到 /etc/sysctl.conf
文件中:
echo "vm.dirty_background_ratio = 5" >> /etc/sysctl.conf
echo "vm.dirty_ratio = 10" >> /etc/sysctl.conf
echo "vm.dirty_expire_centisecs = 30000" >> /etc/sysctl.conf
echo "vm.dirty_writeback_centisecs = 5000" >> /etc/sysctl.conf
echo "vm.dirty_background_bytes = $(( $(grep MemTotal /proc/meminfo | awk '{print $2}') * 5 / 100 ))" >> /etc/sysctl.conf
echo "vm.dirty_bytes = $(( $(grep MemTotal /proc/meminfo | awk '{print $2}') * 10 / 100 ))" >> /etc/sysctl.conf
注意,vm.dirty_background_bytes
和 vm.dirty_bytes
参数的值是动态计算的,这里给出了一个示例计算方法。你可以根据实际情况调整这些值。
验证效果
调整后,你需要监控系统的性能表现,特别是 I/O 操作的速度和内存使用情况。可以使用工具如 iostat
, vmstat
, top
等来监视系统状态,并根据需要进一步调整。
注意事项
- 在调整这些参数之前,请确保了解它们的作用,并在非生产环境中测试这些更改,以避免潜在的风险。
- 不同的系统和应用可能需要不同的参数设置,因此最好根据具体的使用场景来进行调整。
- 监控系统性能,并随时准备恢复到默认设置,如果发现性能下降或其他问题。
深入优化
接下来,继续深入探讨如何调整文件系统缓冲区大小,并确保这些调整能够有效提升系统性能。
持久化配置
除了将配置添加到 /etc/sysctl.conf
中,还可以考虑在 /etc/rc.local
或类似的启动脚本中添加必要的 sysctl
命令,确保在系统启动时应用这些设置。不过,随着现代 Linux 发行版越来越多地采用 systemd,推荐的做法是创建 systemd 服务单元文件来管理这些设置。
创建 systemd 单元文件
-
创建单元文件:
在
/etc/systemd/system
目录下创建一个名为adjust-dirty-settings.service
的文件:sudo nano /etc/systemd/system/adjust-dirty-settings.service
-
编辑单元文件:
在文件中添加以下内容:
[Unit] Description=Adjust dirty settings for filesystem caching [Service] Type=oneshot ExecStart=/bin/bash -c 'sysctl vm.dirty_background_ratio=5; sysctl vm.dirty_ratio=10; sysctl vm.dirty_expire_centisecs=30000; sysctl vm.dirty_writeback_centisecs=5000; sysctl vm.dirty_background_bytes=$(( $(grep MemTotal /proc/meminfo | awk "{print \$2}") * 5 / 100 )); sysctl vm.dirty_bytes=$(( $(grep MemTotal /proc/meminfo | awk "{print \$2}") * 10 / 100 ))' RemainAfterExit=yes [Install] WantedBy=multi-user.target
-
使服务生效:
加载新的服务文件并设置开机启动:
sudo systemctl daemon-reload sudo systemctl enable adjust-dirty-settings.service
-
启动服务并检查状态:
启动服务并检查是否正确应用了设置:
sudo systemctl start adjust-dirty-settings.service sudo systemctl status adjust-dirty-settings.service
监控和调试
使用 sysctl
检查设置
你可以使用 sysctl
命令来检查当前的设置是否已经应用:
sudo sysctl vm.dirty_background_ratio
sudo sysctl vm.dirty_ratio
sudo sysctl vm.dirty_expire_centisecs
sudo sysctl vm.dirty_writeback_centisecs
sudo sysctl vm.dirty_background_bytes
sudo sysctl vm.dirty_bytes
使用 dmesg
监控内核消息
dmesg
命令可以用来查看内核产生的消息,这些消息有时可以帮助诊断为什么某些设置没有按预期工作:
sudo dmesg | grep dirty
使用 iotop
监控 I/O 活动
iotop
类似于 top
命令,但是专注于 I/O 活动,可以帮助你识别哪些进程产生了最多的 I/O 活动:
sudo apt-get install iotop
iotop
进一步优化
调整文件系统缓冲区大小只是系统性能调优的一部分。你还可以考虑以下措施来进一步优化系统:
- 调整交换分区:确保交换分区大小适中,并且只有在真正需要的时候才使用交换空间。
- 调整文件系统类型:根据工作负载的特点选择最适合的文件系统类型,例如 ext4 或 XFS。
- 调整 I/O 调度器:选择最适合工作负载的 I/O 调度算法,如
cfq
(默认)、deadline
或noop
。 - 使用 SSD 存储:如果可能,使用固态硬盘(SSD)代替机械硬盘(HDD),因为 SSD 提供更高的 I/O 速度和更低的延迟。
结论
通过上述步骤,你可以有效地调整 Linux 系统的文件系统缓冲区大小,并确保这些设置在系统重启后依然有效。不过,性能调优是一个持续的过程,需要不断地监控和调整。建议你在实施任何重大变更之前,先在测试环境中验证其效果,并始终保留恢复原状的能力。
案例演示
让我们通过一个具体的综合性案例来展示如何进行 Linux 系统的性能调优,特别是在调整文件系统缓冲区大小方面。我们将以一个典型的 Web 服务器为例,该服务器承担着大量并发请求的任务,并且需要高效地处理文件读写操作。
案例背景
假设你有一台 Ubuntu 服务器,主要用于托管一个高流量的网站。这台服务器配置如下:
- CPU: Intel Xeon E5-2620 v4 (2.10GHz, 6 cores)
- 内存: 32GB DDR4 RAM
- 存储: 500GB NVMe SSD
- 操作系统: Ubuntu 20.04 LTS
这台服务器运行 Apache HTTP Server 和 MySQL 数据库,并且经常承受高并发访问的压力。由于大量并发请求导致 I/O 压力较大,你决定调整文件系统缓冲区大小来优化 I/O 性能。
步骤 1: 初始监控与评估
首先,我们需要监控当前系统的性能状态,以便了解调整前后的差异。
使用 vmstat
监控系统状态
vmstat 5
使用 iostat
监控磁盘 I/O
iostat -x 5
使用 top
或 htop
监控 CPU 和内存使用情况
htop
步骤 2: 分析当前设置
检查当前内核参数设置:
cat /proc/sys/vm/dirty_background_ratio
cat /proc/sys/vm/dirty_ratio
cat /proc/sys/vm/dirty_expire_centisecs
cat /proc/sys/vm/dirty_writeback_centisecs
假设当前设置如下:
vm.dirty_background_ratio = 10
vm.dirty_ratio = 20
vm.dirty_expire_centisecs = 30000
vm.dirty_writeback_centisecs = 1000
步骤 3: 调整内核参数
根据服务器的实际需求,我们将调整参数以加快脏页的写回速度,并确保有足够的内存用于缓存。
临时调整参数
首先临时调整参数,以便立即生效:
sudo sysctl vm.dirty_background_ratio=5
sudo sysctl vm.dirty_ratio=10
sudo sysctl vm.dirty_expire_centisecs=20000
sudo sysctl vm.dirty_writeback_centisecs=5000
计算动态参数值
计算 vm.dirty_background_bytes
和 vm.dirty_bytes
的动态值:
MEM_TOTAL=$(grep MemTotal /proc/meminfo | awk '{print $2}')
sudo sysctl vm.dirty_background_bytes=$(( $MEM_TOTAL * 5 / 100 ))
sudo sysctl vm.dirty_bytes=$(( $MEM_TOTAL * 10 / 100 ))
步骤 4: 验证调整效果
重新运行监控工具,观察调整后的性能变化:
vmstat 5
iostat -x 5
检查是否有明显的性能提升,如 CPU 使用率降低、I/O 等待时间减少等。
步骤 5: 将调整永久化
为了确保这些设置在系统重启后依然有效,我们需要将它们写入 /etc/sysctl.conf
文件中:
sudo nano /etc/sysctl.conf
# 在文件末尾添加以下内容
vm.dirty_background_ratio = 5
vm.dirty_ratio = 10
vm.dirty_expire_centisecs = 20000
vm.dirty_writeback_centisecs = 5000
vm.dirty_background_bytes = $(( $(grep MemTotal /proc/meminfo | awk "{print \$2}") * 5 / 100 ))
vm.dirty_bytes = $(( $(grep MemTotal /proc/meminfo | awk "{print \$2}") * 10 / 100 ))
保存文件后,使新设置立即生效:
sudo sysctl --system
步骤 6: 创建 systemd 单元文件
为了确保每次启动时自动应用这些设置,可以创建一个 systemd 单元文件:
-
创建单元文件:
sudo nano /etc/systemd/system/adjust-dirty-settings.service
-
编辑单元文件:
[Unit] Description=Adjust dirty settings for filesystem caching [Service] Type=oneshot ExecStart=/bin/bash -c 'sysctl vm.dirty_background_ratio=5; sysctl vm.dirty_ratio=10; sysctl vm.dirty_expire_centisecs=20000; sysctl vm.dirty_writeback_centisecs=5000; sysctl vm.dirty_background_bytes=$(( $(grep MemTotal /proc/meminfo | awk "{print \$2}") * 5 / 100 )); sysctl vm.dirty_bytes=$(( $(grep MemTotal /proc/meminfo | awk "{print \$2}") * 10 / 100 ))' RemainAfterExit=yes [Install] WantedBy=multi-user.target
-
使服务生效:
sudo systemctl daemon-reload sudo systemctl enable adjust-dirty-settings.service sudo systemctl start adjust-dirty-settings.service
步骤 7: 持续监控
在调整参数后,持续监控系统的性能,确保调整后的设置带来了预期的性能提升。可以定期运行基准测试工具如 sysbench
来量化性能变化:
sudo apt-get install sysbench
sysbench --test=fileio --file-total-size=1G prepare
sysbench --test=fileio --file-total-size=1G run
结论
通过上述步骤,你已经完成了对 Linux 系统文件系统缓冲区大小的调整,并将其设置为持久化的配置。这种调整有助于优化 I/O 性能,特别是在 I/O 密集型应用中。记得持续监控系统性能,并根据实际需求进一步调整配置。
接下来,进一步探讨如何全面地优化系统性能,特别是在文件系统缓冲区调整之外的其他方面。
案例继续:进一步优化
1. 调整 I/O 调度器
不同的 I/O 调度器适用于不同的工作负载。常见的 I/O 调度器有 cfq
(默认)、deadline
和 noop
。对于 I/O 密集型的应用,可以选择最适合的调度器来优化性能。
查看当前 I/O 调度器
cat /sys/block/sda/queue/scheduler
设置 I/O 调度器
假设我们选择 deadline
调度器:
echo deadline > /sys/block/sda/queue/scheduler
为了使设置在重启后依然有效,可以将设置写入 /etc/rc.local
文件:
sudo nano /etc/rc.local
在文件末尾添加:
echo deadline > /sys/block/sda/queue/scheduler
确保文件最后有一行 exit 0
,然后使文件可执行:
sudo chmod +x /etc/rc.local
2. 优化文件系统参数
对于不同的文件系统,可以调整一些特定的参数来优化性能。
以 Ext4 文件系统为例
sudo tune2fs -o journal_data_writeback /dev/sda1
这将改变 Ext4 文件系统的日志模式,从默认的 ordered
改为 journal_data_writeback
,这可以减少写操作时的同步次数,从而提高写入性能。
3. 调整 swap 使用策略
尽管在高负载情况下,尽量避免使用 swap,但在极端情况下,合理的 swap 使用策略也可以帮助系统更好地应对突发性内存压力。
查看当前 swap 使用情况
free -m
设置 swap 使用策略
调整 swappiness
参数,使得系统在内存使用接近极限时才开始使用 swap:
sudo sysctl vm.swappiness=10
将设置写入 /etc/sysctl.conf
文件:
echo "vm.swappiness = 10" >> /etc/sysctl.conf
4. 调整网络参数
对于高并发的 Web 服务器,调整网络参数可以显著提高网络性能。
增加监听队列长度
sudo sysctl net.core.somaxconn=4096
将设置写入 /etc/sysctl.conf
文件:
echo "net.core.somaxconn = 4096" >> /etc/sysctl.conf
调整 TCP 参数
sudo sysctl net.ipv4.tcp_tw_reuse=1
sudo sysctl net.ipv4.tcp_fin_timeout=30
将设置写入 /etc/sysctl.conf
文件:
echo "net.ipv4.tcp_tw_reuse = 1" >> /etc/sysctl.conf
echo "net.ipv4.tcp_fin_timeout = 30" >> /etc/sysctl.conf
5. 优化数据库配置
对于运行数据库(如 MySQL)的服务器,调整数据库配置可以显著提高性能。
查看当前 MySQL 配置
sudo cat /etc/mysql/mysql.conf.d/mysqld.cnf
调整 MySQL 缓冲池大小
[mysqld]
innodb_buffer_pool_size = 16G
将配置保存在 /etc/mysql/mysql.conf.d/mysqld.cnf
文件中,并重启 MySQL 服务:
sudo systemctl restart mysql
6. 使用基准测试工具验证性能
使用 sysbench
或 iperf
等工具来验证性能改进的效果。
运行 Sysbench CPU 基准测试
sysbench --test=cpu --cpu-max-prime=20000 run
运行 Sysbench 文件 I/O 基准测试
sysbench --test=fileio --file-total-size=1G prepare
sysbench --test=fileio --file-total-size=1G run
7. 监控系统性能
使用 munin
或 grafana
等工具来持续监控系统性能,确保各项调整达到了预期效果。
安装 Munin
sudo apt update
sudo apt install munin
配置 Munin
编辑 /etc/munin/munin.conf
文件,添加监控节点:
[localhost]
address localhost
use_node_name yes
启动 Munin 服务并设置开机启动:
sudo systemctl start munin
sudo systemctl enable munin
结论
通过上述步骤,你已经全面地优化了 Linux 系统的性能,特别是在调整文件系统缓冲区大小方面。除此之外,你还调整了 I/O 调度器、网络参数、数据库配置,并使用基准测试工具验证了性能改进的效果。这些综合性的优化措施有助于确保你的服务器能够在高负载环境下保持良好的性能。
记得持续监控系统性能,并根据实际需求进一步调整配置。性能优化是一个不断迭代的过程,随着业务的发展和技术的进步,需要不断调整以适应新的挑战。
————————————————
最后我们放松一下眼睛