如何判断Linux磁盘IO是否导致过度(> 1秒)应用程序停顿

我有一个Java应用程序执行大量(数百MB)的连续输出(stream式纯文本)到大约十几个文件的ext3 SAN文件系统。 偶尔,这个应用程序暂时停顿几秒钟。 我怀疑与ext3 vsfs(Veritas文件系统)function(和/或它如何与操作系统交互)有关的东西是罪魁祸首。

我可以采取哪些步骤来确认或反驳这个理论? 我知道iostat/proc/diskstats作为出发点。

修订后的标题不再强调日记,强调“摊位”

我做了一些Googlesearch,发现至less有一篇文章似乎描述了我正在观察的行为: 解决ext3延迟问题

附加信息

  • 红帽企业Linux服务器版本5.3(Tikanga)
  • 内核: 2.6.18-194.32.1.el5
  • 主应用程序磁盘是光纤通道SAN: lspci | grep -i fibre lspci | grep -i fibre >> 14:00.0 Fibre Channel: Emulex Corporation Saturn-X: LightPulse Fibre Channel Host Adapter (rev 03)
  • 装载信息: type vxfs (rw,tmplog,largefiles,mincache=tmpcache,ioerror=mwdisable) 0 0
  • cat /sys/block/VxVM123456/queue/scheduler >> noop anticipatory [deadline] cfq cat /sys/block/VxVM123456/queue/scheduler noop anticipatory [deadline] cfq

我的猜测是有一些其他的进程占用磁盘I / O容量一段时间。 如果你有足够的内核, iotop可以帮助你find它。

如果是这样的话,那不是关于文件系统,更不是关于日志。 这是负责在冲突的应用程序之间进行仲裁的I / O调度程序。 一个简单的testing:检查当前的调度程序,并尝试一个不同的。 它可以在飞行中完成,无需重新启动。 例如,在我的桌面上检查第一个磁盘( /dev/sda ):

 cat /sys/block/sda/queue/scheduler => noop deadline [cfq] 

表明它正在使用CFQ,这对桌面系统来说是一个不错的select,但对于服务器来说却不是那么重要。 更好地设定“截止date”:

 echo 'deadline' > /sys/block/sda/queue/scheduler cat /sys/block/sda/queue/scheduler => noop [deadline] cfq 

并等待几个小时,看看是否改善。 如果是这样,请将其永久设置在启动脚本中(取决于分发)

那么一个简单的testing就是将ext3fs挂载为ext2,然后对应用程序的性能进行configuration。

答案是“是”( 日记总是增加延迟:-)

这个问题的重要性只能通过直接testing来解决,但是通常假设对于每个(日志式)操作,其启动时间大约是不启用日志function的两倍。

既然你在你的评论中提到另一个答案 ,你不能在你的生产环境中进行直接testing(可能没有你可以使用的开发/testing环境),你还有另一个select:看看你的磁盘统计并看看你花了多less时间来写日记设备。
不幸的是,如果您的日记设备是分立的,并且可以与“主”磁盘分开安装,那么这样做确实很有帮助。


第二次,我今天插入了一个McKusickvideo,但是如果你通过这个video来了解一下日记文件系统必须做的一些工作(以及涉及的性能影响)的讨论。
对您和您的特定问题没有直接的用处/相关性,而是关于文件系统和日志的一般背景。

是的,日记会导致延迟。 但这是等式的一小部分。 我认为这是第5或第6个项目。然而,这是另一个系统存储问题的趋势,没有包含足够的相关信息。

  • 你使用什么types的服务器硬件? (品牌和型号)
  • 请描述存储设置(RAID控制器,cachingconfiguration,磁盘数量和排列)
  • 您使用什么操作系统? 发行版和内核版本将会有所帮助。

我为什么要求这些信息?

您的硬件设置和RAID级别可能会对观察到的性能产生巨大影响。 在硬件上读写caching可以调整RAID控制器,以适应您的工作负载和I / O模式。 操作系统很重要,因为它影响了对您有帮助的工具build议和调整技术。 不同的分配和内核具有不同的默认设置,因此性能特点各不相同。

所以在这种情况下,有一些可能性:

  • 您的RAIDarrays可能无法跟上工作量(没有足够的主轴)。
  • 或者你可以从写入caching中受益。
  • 你可能有碎片问题(文件系统有多满?)。
  • 您可能会遇到不适合所需性能特点的不合适的RAID级别 。
  • 您的RAID控制器可能需要调整。
  • 您可能需要更改系统的I / O调度程序并运行某些块设备调优 。
  • 你可以考虑更像性能优化的文件系统,如XFS 。
  • 你可以删除日志并重新挂载文件系统为ext2。 这可以在飞行中完成。
  • 您可能有便宜的SATA磁盘可能遇到总线超时。

但是,现在我们还没有足够的信息继续下去。

我有这个问题在Redhat 4与ext3文件系统:许多写在一个ext3文件系统=>等待在anoter ext3 FS写

随着访问时间的更新,读访问也可以暂停=>解决方法:mount -o noatime

问候,杰罗姆D.

您可以尝试从/proc/diskstats/proc/meminfo :也许您的回写缓冲区增长,它需要刷新。 当写回(“脏”)缓冲区被重新填充的速度比写入速度快时,我们遇到了这种情况。 然后Linux开始更多的线程,使事情变得更糟。 在进程暂停之前限制脏缓冲区所允许的比例有助于解决问题。 我有的另一个提示是关联性:捕获I / O较慢的时间,然后比较同时发生的事情。 你可以试试这个例子:

 while sleep 2 do (date; cat /proc/meminfo) >> /tmp/your_logfile done 

比较一下你的应用程序似乎很慢的时候。

虽然这不可能是大多数人的解决scheme,但我想我会提到我以前经历过的这个特殊问题。

在Linux软件RAID中使用WD Green驱动器之前,我遇到了严重的I / O问题。 强烈build议使用WD Red驱动器,如果这是您的问题。 如果你使用Greens,随着你的硬盘年龄的增长,你的arrays很可能变得难以忍受,因为这些硬盘不断尝试自己closures和开启以节省能源,导致巨大的I / O滞后尖峰。 你最终会穿这些驱动器,因为他们将开始在SMART下的巨大负载循环计数统计