16

目前我的应用程序周期性地阻塞在 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总是让它​​暂时正常。我用谷歌搜索并找到了一些类似的问题,如下所列。

  1. 闰秒。不起作用,我们系统的 ntpd 已停止。
  2. 透明大页错误。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

4

2 回答 2

3

也许是 futex_wait() 中的内核错误?

你可以在这里阅读: https ://groups.google.com/forum/#!topic/mechanical-sympathy/QbmpZxp6C64

于 2016-08-12T20:51:05.403 回答
1

除了时钟跳跃和前面提到的(相当老的)THP 内核错误之外,java 意外阻塞 IO 的另一个常见原因是读取速度非常慢并且阻塞 /dev/random,一些库更喜欢使用更常用且性能更好的 /dev/随机。

判断这是否是罪魁祸首的简单方法:

sudo mv /dev/random /dev/random.real
sudo ln -s /dev/urandom /dev/random

...然后重新启动应用程序,看看它是否停止 IO 阻塞。完成测试后,您可能想要恢复 /dev/random:

sudo mv /dev/random.real /dev/random

...并打开应用程序供应商的错误,要求在适当的情况下使用 /dev/urandom。

于 2019-05-07T12:18:31.960 回答