目前我的应用程序周期性地阻塞在 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 已停止。
- 透明大页错误。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