目前我的应用程序定期在IO阻塞,并且输出非常低。我使用一些命令来追踪这个过程。
通过使用jstack,我发现该应用程序在FileOutputStream.writeBytes处挂起。
通过使用strace -f -c -p pid收集系统调用信息,我发现,在正常情况下,它具有Futex和Write系统调用。但是当它出现异常时,只有Futex系统调用。该应用程序不断调用Futex,但所有调用都失败并抛出ETIMEDOUT,就像这样:
<futex resumed> =-1 ETIMEDOUT (Connecton timed out)
futex(Ox7f823, FUTEX_WAKE_PRIVATE,1)=0
futex(Ox7f824, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME) =-1<unfinished>
<futex resumed> =-1 ETIMEDOUT (Connecton timed out)
futex(Ox7f823, FUTEX_WAKE_PRIVATE,1)=0
futex(Ox7f824, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME) =-1<unfinished>
这个问题周期性地发生,持续数分钟或数小时,然后恢复正常。
特别是在IO被阻塞时,echo 3 > /proc/sys/vm/drop_caches总会使其暂时恢复正常。我搜索了一下,发现一些类似的问题,如下所示:
- 闰秒。不行,我们系统的ntpd已经停止了。
- 透明大页面bug。https://bugzilla.redhat.com/show_bug.cgi?id=879801 这个问题与我的非常相似,但我的khugepaged进程正常,并且负载始终接近于零。尤其是drop_caches对我的应用程序也有效。而且我的系统也是多核和大内存。但对我来说它不起作用。所以有没有人遇到过相同的问题或熟悉这个问题?
关于我的系统的一些信息。
操作系统:Redhat 6.1,内核版本2.6.31
JDK:1.7.0_05
CPU:X5650,24个核心
内存:24GB和48GB
date -s "\
date`"`。 - kucing_terbang