我有一个Java应用程序执行大量(数百MB)的连续输出(stream式纯文本)到大约十几个文件的ext3 SAN文件系统。 偶尔,这个应用程序暂时停顿几秒钟。 我怀疑与ext3 vsfs(Veritas文件系统)function(和/或它如何与操作系统交互)有关的东西是罪魁祸首。
我可以采取哪些步骤来确认或反驳这个理论? 我知道iostat
和/proc/diskstats
作为出发点。
修订后的标题不再强调日记,强调“摊位”
我做了一些Googlesearch,发现至less有一篇文章似乎描述了我正在观察的行为: 解决ext3延迟问题
附加信息
2.6.18-194.32.1.el5
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个项目。然而,这是另一个系统存储问题的趋势,没有包含足够的相关信息。
我为什么要求这些信息?
您的硬件设置和RAID级别可能会对观察到的性能产生巨大影响。 在硬件上读写caching可以调整RAID控制器,以适应您的工作负载和I / O模式。 操作系统很重要,因为它影响了对您有帮助的工具build议和调整技术。 不同的分配和内核具有不同的默认设置,因此性能特点各不相同。
所以在这种情况下,有一些可能性:
但是,现在我们还没有足够的信息继续下去。
我有这个问题在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下的巨大负载循环计数统计