В настоящее время мое приложение периодически блокируется в IO, и вывод очень низкий. Я использую некоторую команду для отслеживания процесса.
Используя jstack, я обнаружил, что приложение зависает в FileOutputStream.writeBytes.
Я обнаружил это, используя strace -f -c -p pid для сбора информации о системных вызовах. В обычной ситуации он имеет как фьютекс, так и системные вызовы записи. Но когда все пошло не так, остались только системные вызовы фьютексов. Приложение продолжает вызывать фьютекс, но все терпит неудачу и выдает 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
Процессор: X5650, 24 ядра
Память: 24 ГБ и 48 ГБ
date -s "`date`"
? - person kucing_terbang   schedule 01.09.2015