目前我的应用程序周期性地阻塞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 https://bugzilla.redhat.com/show_bug.cgi?id=879801这与我的问题非常相似,但我的 khugepaged 进程正常,并且负载始终接近于零。埃斯皮利删除缓存也适用于我的应用程序。而且我的系统也是多核大内存的。这对我不起作用。
那么有人遇到过同样的问题或熟悉这个问题吗?
有关我的系统的一些信息。
操作系统:Redhat 6.1,内核版本2.6.31
JDK:1.7.0_05
CPU:X5650,24核
内存:24GB 和 48GB
也许是 futex_wait() 中的内核错误?
你可以在这里读到它:https://groups.google.com/forum/#!topic/mechanical-sympathy/QbmpZxp6C64 https://groups.google.com/forum/#!topic/mechanical-sympathy/QbmpZxp6C64
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)