如何避免 Linux 上备份 Shell 脚本或程序磁盘 I/O 突然爆发
突然爆发的剧烈磁盘 I/O 活动可能会导致您的电子邮件或 Web 服务器瘫痪。通常,每月处理数百万页(请求)的 Web、mysql 或邮件服务器容易出现此类问题。备份活动也会增加当前系统负载。为避免此类突然爆发问题,请使用调度类和优先级运行脚本。Linux 附带各种实用程序来管理此类疯狂行为。
CFQ 调度器
您需要 Linux 内核 2.6.13+ 和 CFQ IO 调度程序。CFQ(完全公平队列)是 Linux 内核的 I/O 调度程序,在 2.6.18+ 内核中是默认的。RHEL 4/5 和 SuSE Linux 已将所有调度程序内置到内核中,因此无需重建内核。要找出您的调度程序名称,请输入:
# for d in /sys/block/sd[a-z]/queue/scheduler; do echo "$d => $(cat $d)" ; done
每个磁盘的示例输出:
/sys/block/sda/queue/scheduler => noop anticipatory deadline [cfq] /sys/block/sdb/queue/scheduler => noop anticipatory deadline [cfq] /sys/block/sdc/queue/scheduler => noop anticipatory deadline [cfq]
CFQ 是默认设置,为了获得良好的性能建议使用。
旧的好程序
您可以使用nice 命令(19 = 最不有利)来运行具有修改后的调度优先级的程序:
# nice -n19 /path/to/backup.sh
示例 cronjob:
@midnight /bin/nice -n19 /path/to/backup.sh
向 ionice 实用程序问好
与 nice 命令相比,ionice 命令对程序或脚本的 I/O 调度类和优先级提供了更好的控制。它支持以下三种调度类(引自手册页):
- 空闲:以空闲 io 优先级运行的程序只有在定义的宽限期内没有其他程序请求磁盘 io 时才会获得磁盘时间。空闲 io 进程对正常系统活动的影响应该为零。此调度类不接受优先级参数。
- 尽力而为:这是任何未请求特定 IO 优先级的进程的默认调度类。程序继承 IO 优先级的 CPU 良好设置。此类采用 0-7 的优先级参数,数字越小,优先级越高。以相同尽力而为优先级运行的程序以循环方式提供服务。这通常推荐用于大多数应用程序。
- 实时:无论系统中正在发生什么,RT 调度类都会首先访问磁盘。因此,使用 RT 类时需要小心,因为它可能会使其他进程无法获得资源。与尽力而为类一样,定义了 8 个优先级,表示给定进程在每个调度窗口上将获得多大的时间片。对于所有负载很重的系统,应避免这种情况。
句法
语法是:
ionice options PID ionice options -p PID ionice -c1 -n0 PID
如何在 Linux 上使用 ionice 命令?
Linux 使用以下数字系统和优先级来引用调度类:
调度类 | 数字 | 可能的优先事项 |
即时的 | 1 | 定义了 8 个优先级,表示给定进程在每个调度窗口上将获得多大的时间片 |
尽力而为 | 2 | 0-7,数字越小,优先级越高 |
闲置的 | 3 | 无(不采用优先级参数) |
示例
要显示正在运行的进程的类别和优先级,请输入:
示例输出:
# ionice -p {PID}
# ionice -p 1
none: prio 0
使用尽力调度(2)和 7 优先级转储完整的 Web 服务器磁盘/mysql 或 pgsql 数据库备份:
# /usr/bin/ionice -c2 -n7 /root/scripts/nas.backup.full
打开另一个终端并使用 atop/tip 或 top 或您最喜欢的监控工具查看磁盘 I/O 网络统计信息:
# atop
示例 cronjob:
@weekly /usr/bin/ionice -c2 -n7 /root/scripts/nas.backup.full >/dev/null 2>&1
您可以将 PID 为 1004 的进程设置为空闲 io 进程,输入:
# ionice -c3 -p 1004
将 rsync.sh 脚本作为具有最高优先级的尽力程序运行,输入:
# ionice -c2 -n0 /path/to/rsync.sh
键入以下命令以将“zsh”作为具有最高优先级的尽力程序运行。
# ionice -c 2 -n 0 zsh
最后,您可以将 nice 和 ionice 结合在一起:
# nice -n 19 ionice -c2 -n7 /path/to/shell.script
相关:chrt 命令用于设置/操作Linux 进程的实时属性和taskset 命令用于检索或设置进程的CPU 亲和性。
要查看有关选项类型的帮助:
$ ionice --help
示例输出:
Sets or gets the IO scheduling class and priority of processes. Usage: ionice [options] -p <pid>... ionice [options] -P <pgid>... ionice [options] -u <uid>... ionice [options] <command> Options: -c, --class <class> name or number of scheduling class, 0: none, 1: realtime, 2: best-effort, 3: idle -n, --classdata <num> priority (0..7) in the specified scheduling class, only for the realtime and best-effort classes -p, --pid <pid>... act on these already running processes -P, --pgid <pgrp>... act on already running processes in these groups -t, --ignore ignore failures -u, --uid <uid>... act on already running processes owned by these users -h, --help display this help and exit -V, --version output version information and exit
改进磁盘 I/O 的其他建议
- 使用硬件 RAID 控制器。
- 使用快速 SCSI/SA-SCSI/SAS 15k 速度磁盘。
- 使用基于快速 SSD 的存储(昂贵的选择)。
- 使用从属/被动服务器备份 MySQL
推荐阅读:
- 手册页 –