Java周期性地在fuex和非常低的IO输出下挂起

2022-09-02 22:38:34

目前我的应用程序周期性地在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,在下面列出。

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


答案 1

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

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


答案 2

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

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

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。


推荐