为了避免 rsync 使我们ionice
在启动 rsync 和设置--bwlimit
参数时使用的系统和网络饿死。例如:
ionice -c2 -n7 rsync -aH --bwlimit=30000 /foo root@dest.com:/
Run Code Online (Sandbox Code Playgroud)
这确实有助于确保源服务器保持响应。但是,由于磁盘 io 为 100%(如atop
实用程序所见),目标服务器变得非常慢。
是否也可以ionice
在目标服务器上以某种方式使用?也许通过 rsync-e
选项?如果可能,我不想运行 rsync 守护进程。
Linux 进程可以有不同的 CPU 和 IO 优先级(nice 和 ionice)。
为什么需要有不同的 CPU 和 IO 优先级?
让它们不同是否有任何现实世界的用法?
您发现哪些实际用例需要不同的 CPU 和 IO 优先级?例如高于正常 CPU 优先级但低于正常 IO 优先级,反之亦然。
我们有一个非常大(多 GB)的 Nginx 缓存目录用于繁忙的站点,我们偶尔需要一次清除所有目录。我过去解决了这个问题,方法是将缓存文件夹移动到新路径,在旧路径上创建一个新的缓存文件夹,然后rm -rf
ing 旧的缓存文件夹。
然而,最近,当我在忙碌的早晨需要清除缓存时,来自的 I/Orm -rf
使我的服务器进程无法访问磁盘,因为 Nginx 及其面向的服务器都是读取密集型的。当 CPU 处于空闲状态并rm -rf
占用iotop
.
我ionice -c 3
在调用 时尝试过rm
,但它似乎对观察到的行为没有明显影响。
有没有办法驯服rm -rf
更多地共享磁盘?我是否需要使用不同的技术来获取线索ionice
?
更新:
有问题的文件系统是 AWS EC2 实例存储(主磁盘是 EBS)。该/etc/fstab
条目如下所示:
/dev/xvdb /mnt auto defaults,nobootwait,comment=cloudconfig 0 2
Run Code Online (Sandbox Code Playgroud) 我们有一个 4 核 CPU 生产系统,它执行大量 cronjobs,具有恒定的 proc 队列和~1.5 的通常负载。
在夜间,我们用 postgres 做一些 IO 密集型的事情。我们生成一个图表,显示负载/内存使用情况 (rrd-updates.sh) 这有时会在高 IO 负载情况下“失败”。几乎每晚都会发生这种情况,但并非在所有高 IO 情况下都会发生。
我的“正常”解决方案是对 postgres 内容进行优化和离子化,并增加图形生成的优先级。然而这仍然失败。图生成是使用 flock 进行半线程证明的。我确实记录了执行时间,并且在高 IO 负载期间生成图形最多需要 5 分钟,这似乎导致图形丢失长达 4 分钟。
时间范围与 postgres 活动完全匹配(这有时也发生在白天,虽然不是那么频繁)离子化到实时 prio(C1 N6 graph_cron vs C2 N3 postgres),在 postgres 之上(-5 graph_cron vs 10 postgres)很好) 没有解决问题。
假设没有收集数据,额外的问题是 ionice/nice 不知何故仍然无法正常工作。
即使有 90% 的 IOwait 和 100 的负载,我仍然能够免费使用数据生成命令,而没有超过 5 秒的延迟(至少在测试中)。
遗憾的是,我无法在测试中完全重现这一点(只有一个虚拟化的开发系统)
版本:
内核2.6.32-5-686-bigmem
Debian Squeeze rrdtool1.4.3
硬件:SAS 15K RPM HDD,硬件 RAID1
挂载选项中的LVM :ext3 with rw,errors=remount-ro
调度程序:CFQ …
配置是:一个linux服务器和一个作为nfs服务器的nas box(netgear)。
通过简单地将文件从 nfs 共享复制到 nfs 共享,Linux 服务器上的单个进程很容易使用所有 I/O 带宽。i/o 通道被阻塞,服务器上的所有其他进程将几乎停止等待 i/o。负载增长到 10-20(四核),越来越多的 pdflush 进程出现......直到有人停止文件复制。
如何限制 cp 进程使用的 i/o 带宽?nice
当然不会有帮助,但也ionice -c3
没有效果。ionice 是否会影响 nfs 挂载?有类似nfsnice 的东西吗?
我的 tar 命令
tar --remove-files -cvif 2011-08-02_14-05-09.tar 2011-08-02_14-05-09
Run Code Online (Sandbox Code Playgroud)
写入 80MB/s。这超出了我们可以节省的容量,因为 MySQL 开始排队写入,最终我们会收到监控警报,因为系统不会永远等待 MySQL 并超时。
问:我可以节流tar
到 20MB/s 吗?
在联机帮助页中没有找到任何内容,我们已经尝试使用最低ionice
级别:/usr/bin/ionice -c3 tar <...>
但这不会影响写入的 MB/s 并且 MySQL 仍然冻结。
也许ionice
因为我们在/dev/md0
软件 RAID 设备上而被忽略?
我有一个带有大型硬件 RAID6 阵列的服务器,该阵列配置了两个卷,由 Linux 呈现为sda
和sdb
(是的,我知道,但这是一个以这种方式配置的租来的 colo,遗憾的是我不得不忍受它)。
我有一个使用sdb
. 我已经运行了ionice -c3
,因为我希望它的优先级低于其他任何东西。不幸的是,ionice
不知道这两个设备实际上共享同一个阵列的带宽。当该进程繁忙时,内核会看到它sdb
是安静的,并为其提供所需的所有带宽。但是,这可能会变得sda
非常慢,因为(据我所知)ionice
是基于每个设备的。
有没有办法让内核在所有设备上平衡磁盘 I/O ?
我有一个脚本,它启动大、CPU 和内存消耗进程树。那里有 Python 和可执行文件,但一切都始于单个 bash 脚本和 Python 子进程。
在执行期间,系统的其余部分被完全阻塞。我试图通过 来缓解
$ nice -n10 ionice -c2 ./Script.sh
,但这还不够 - 使用计算机非常滞后(实际上这是开发桌面,但指定服务器上的问题将类似)。
我怀疑,问题在于进程使用了太多内存 - 一切最终都被换出并变得缓慢。
有没有办法降低访问物理记忆的进程(及其递归子进程)的优先级?我更喜欢它在后台执行得更慢,对其他任务的影响有限。
ionice 在软件 RAID 环境中工作吗?我无法为 md 设备设置 CFQ 调度程序,因为没有文件 /sys/block/md0/queue/scheduler 。似乎底层磁盘的调度程序设置没有传播到 RAID 设备。
想法?
该ionice
男子说:页
以空闲 io 优先级运行的程序只会在没有其他程序在定义的宽限期内请求磁盘 io 时获得磁盘时间。
这个“宽限期”在哪里定义?它是否可见/可调(可能通过 /sys)?