dr_ Asked: 2015-11-17 07:13:10 +0800 CST2015-11-17 07:13:10 +0800 CST 2015-11-17 07:13:10 +0800 CST 设置高 I/O 超时的缺点? 772 我正在研究几个 Linux VM,其分区安装在 NetApp NAS 上。此 NAS 会定期遇到非常高的 iowait,这会导致 VM 磁盘切换到只读模式、崩溃或损坏。 在VMware KB上,建议增加超时值作为姑息治疗: echo 180 > /sys/block/sda/device/timeout 设置非常高的超时时间(1800 或更多)可能会产生什么负面影响?在我看来,风险在于延迟写入会累积并填满 I/O 写入缓冲区,从而导致系统崩溃。因此,此解决方案可能比问题更糟糕。 linux 2 个回答 Voted Best Answer shodanshok 2015-11-18T01:46:02+08:002015-11-18T01:46:02+08:00 大多数缓存在 OS 脏页缓存中的写入已经异步完成。换句话说,它们通常与设备超时无关。 但是,读取和同步写入需要底层块设备立即关注,这正是您的文件系统切换到只读模式的原因(它不能将其日志写入磁盘)。 增加 I/O 等待时间应该没有坏影响,但它不是灵丹妙药。例如,即使底层文件系统保持读写模式,数据库也可以进入只读模式。 sourcejedi 2019-05-18T14:58:07+08:002019-05-18T14:58:07+08:00 请注意,默认的 SCSI 超时已经是 30 秒。用计算机术语来说,这已经是相当长的时间了:-P。 IO 请求(例如异步写入)由/sys/class/block/$DEV/nr_requests和限制/sys/class/block/$DEV/max_sectors_kb。在旧的单队列块层中,总内存使用量被称为2*nr_requests*max_sectors_kb. 因子 2 是因为读取和写入是分开计算的。尽管您还需要考虑硬件队列中的请求,但请参见例如cat /sys/class/block/sda/device/queue_depth。您通常需要确保最大硬件队列深度不大于nr_requests. 1) 写的是如果你的 IO 请求需要太多空间,就会出现内存不足的错误。 因此,您可以查看特定系统上的上述值。通常它们不是问题。 nr_requests默认为 128。默认值max_sectors_kb取决于您的内核版本。 如果使用新的多队列块层(blk-mq),读取和写入不单独计算。所以等式的“乘以二”部分消失了,nr-requests而是默认为 256。我不确定如何处理硬件队列(或队列)blk-mq。 当请求队列已满时,异步写入可以在页面缓存中建立,直到它们达到“脏限制”。从历史上看,默认的脏限制被描述为 RAM 的 20%,尽管现在确切的确定稍微复杂一些。 当你达到脏限制时,你只需要等待。 内核没有超出 SCSI 超时的另一个硬超时。 从这个意义上说,关于这个主题的常见文档,包括 VMware KB,已经足够了。尽管您应该搜索适用于您的 NAS 的特定文档:-P。不同年份的 NAS 被设计为提供不同的最坏情况时序。 2) 也就是说,如果进程等待磁盘 IO 超过 120 秒,内核将打印“挂起任务”警告。(可能。这是通常的默认值。除了在我的 Fedora Linux 版本上,内核似乎是在没有 CONFIG_DETECT_HUNG_TEST 的情况下构建的。Fedora 在这里似乎是一个奇怪的异常值)。 挂起的任务消息不是崩溃,它没有设置内核“污染”标志。 在 10 个挂起的任务警告(或您设置sys.kernel.hung_task_warnings的任何内容)之后,内核停止打印它们。考虑到这一点,我认为您还应该增加sysctl sys.kernel.hung_task_timeout_secsSCSI 超时,例如 480 秒。 3) 个别应用程序可能有自己的超时时间。您可能更喜欢看到应用程序超时,而不是让内核返回 IO 错误!文件系统 IO 错误通常被认为是致命的。文件系统本身可能会在 IO 错误后以只读方式重新挂载,具体取决于配置。交换设备或内存映射文件中的 IO 错误会将 SIGBUS 信号发送到受影响的进程,这通常会终止该进程。 4) 如果使用systemd,配置了看门狗定时器的服务会被强制重启。在当前版本中systemd,如果您运行,您可以看到例如 3 分钟的超时systemctl show -p WatchdogUSec systemd-udevd。这是四年前出于不同的原因而增加的;这似乎只是一个巧合,这与 VMware 建议的 SCSI 超时相匹配 :-)。这些重新启动可能会产生令人震惊的日志噪音。 systemd使用 SIGABRT 终止进程,其想法是获取核心转储以显示进程卡住的位置。然而,像 udev 甚至 journald 这样的东西现在应该很高兴重新启动。 主要问题是确保您没有配置过短的用户空间重启看门狗,例如RuntimeWatchdogSec=在/etc/systemd-system.conf. 即使您不使用交换,也有可能systemd被磁盘 IO 阻塞,通过进入内核“直接回收”的内存分配。
大多数缓存在 OS 脏页缓存中的写入已经异步完成。换句话说,它们通常与设备超时无关。
但是,读取和同步写入需要底层块设备立即关注,这正是您的文件系统切换到只读模式的原因(它不能将其日志写入磁盘)。
增加 I/O 等待时间应该没有坏影响,但它不是灵丹妙药。例如,即使底层文件系统保持读写模式,数据库也可以进入只读模式。
请注意,默认的 SCSI 超时已经是 30 秒。用计算机术语来说,这已经是相当长的时间了:-P。
IO 请求(例如异步写入)由
/sys/class/block/$DEV/nr_requests
和限制/sys/class/block/$DEV/max_sectors_kb
。在旧的单队列块层中,总内存使用量被称为2*nr_requests*max_sectors_kb
. 因子 2 是因为读取和写入是分开计算的。尽管您还需要考虑硬件队列中的请求,但请参见例如cat /sys/class/block/sda/device/queue_depth
。您通常需要确保最大硬件队列深度不大于nr_requests
.1) 写的是如果你的 IO 请求需要太多空间,就会出现内存不足的错误。 因此,您可以查看特定系统上的上述值。通常它们不是问题。
nr_requests
默认为 128。默认值max_sectors_kb
取决于您的内核版本。如果使用新的多队列块层(blk-mq),读取和写入不单独计算。所以等式的“乘以二”部分消失了,
nr-requests
而是默认为 256。我不确定如何处理硬件队列(或队列)blk-mq
。当请求队列已满时,异步写入可以在页面缓存中建立,直到它们达到“脏限制”。从历史上看,默认的脏限制被描述为 RAM 的 20%,尽管现在确切的确定稍微复杂一些。
当你达到脏限制时,你只需要等待。 内核没有超出 SCSI 超时的另一个硬超时。 从这个意义上说,关于这个主题的常见文档,包括 VMware KB,已经足够了。尽管您应该搜索适用于您的 NAS 的特定文档:-P。不同年份的 NAS 被设计为提供不同的最坏情况时序。
2) 也就是说,如果进程等待磁盘 IO 超过 120 秒,内核将打印“挂起任务”警告。(可能。这是通常的默认值。除了在我的 Fedora Linux 版本上,内核似乎是在没有 CONFIG_DETECT_HUNG_TEST 的情况下构建的。Fedora 在这里似乎是一个奇怪的异常值)。
挂起的任务消息不是崩溃,它没有设置内核“污染”标志。
在 10 个挂起的任务警告(或您设置
sys.kernel.hung_task_warnings
的任何内容)之后,内核停止打印它们。考虑到这一点,我认为您还应该增加sysctl
sys.kernel.hung_task_timeout_secs
SCSI 超时,例如 480 秒。3) 个别应用程序可能有自己的超时时间。您可能更喜欢看到应用程序超时,而不是让内核返回 IO 错误!文件系统 IO 错误通常被认为是致命的。文件系统本身可能会在 IO 错误后以只读方式重新挂载,具体取决于配置。交换设备或内存映射文件中的 IO 错误会将 SIGBUS 信号发送到受影响的进程,这通常会终止该进程。
4) 如果使用
systemd
,配置了看门狗定时器的服务会被强制重启。在当前版本中systemd
,如果您运行,您可以看到例如 3 分钟的超时systemctl show -p WatchdogUSec systemd-udevd
。这是四年前出于不同的原因而增加的;这似乎只是一个巧合,这与 VMware 建议的 SCSI 超时相匹配 :-)。这些重新启动可能会产生令人震惊的日志噪音。systemd
使用 SIGABRT 终止进程,其想法是获取核心转储以显示进程卡住的位置。然而,像 udev 甚至 journald 这样的东西现在应该很高兴重新启动。主要问题是确保您没有配置过短的用户空间重启看门狗,例如
RuntimeWatchdogSec=
在/etc/systemd-system.conf
. 即使您不使用交换,也有可能systemd
被磁盘 IO 阻塞,通过进入内核“直接回收”的内存分配。