Java周期性地在fuex和非常低的IO输出下挂起
目前我的应用程序周期性地在IO中被阻止,并且输出非常低。我使用一些命令来跟踪该过程。
通过使用jstack,我发现该应用程序在FileOutputStream.writeBytes上挂起。
通过使用 strace -f -c -p pid 来收集系统调用信息,我发现了这一点。对于正常情况,它既有 futex 也有 write syscalls。但是当它变得不正常时,只有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>
此问题定期发生,并持续数分钟或数小时,然后再次恢复正常。
Escipiply,当在 IO 中被阻止时,echo 3 > /proc/sys/vm/drop_caches 总是使它暂时恢复正常。我用谷歌搜索了它,并找到了一些类似的proleam,在下面列出。
- 闰秒。不起作用,我们系统的 ntpd 已停止。
- 透明的大页面错误。https://bugzilla.redhat.com/show_bug.cgi?id=879801这与我的probleam非常相似,但我的khugepaged过程是正常的,并且负载始终接近于零。Escipally drop_caches也适用于我的应用程序。我的系统也是多核和大内存。它不适合我。那么有没有人遇到过同样的问题或熟悉这个问题?
有关我的系统的一些信息。操作系统:Redhat 6.1,内核版本 2.6.31
JDK:1.7.0_05
处理器:X5650, 24芯
内存:24GB 和 48GB