У нас есть медленно работающая программа JAVA в зоне Solaris 10. Я запустил truss
на pid и заметил, что следующие сообщения генерируются, даже когда программа ничего не делает:
pollsys(0x00000000, 0, 0xFFFFFFFE14DFEEC0, 0x00000000) = 0^M
/51: timeout: 0.010000000 sec^M
/51: pollsys(0x00000000, 0, 0xFFFFFFFE14DFEEC0, 0x00000000) = 0^M
/51: timeout: 0.010000000 sec^M
/29: pollsys(0x00000000, 0, 0xFFFFFFFE242FF970, 0x00000000) = 0^M
/29: timeout: 0.050000000 sec^M
/51: pollsys(0x00000000, 0, 0xFFFFFFFE14DFEEC0, 0x00000000) = 0^M
/51: timeout: 0.010000000 sec^M
/51: pollsys(0x00000000, 0, 0xFFFFFFFE14DFEEC0, 0x00000000) = 0^M
/51: timeout: 0.010000000 sec^M
/51: pollsys(0x00000000, 0, 0xFFFFFFFE14DFEEC0, 0x00000000) = 0^M
/51: timeout: 0.010000000 sec^M
/29: pollsys(0x00000000, 0, 0xFFFFFFFE242FF970, 0x00000000) = 0^M
/29: timeout: 0.050000000 sec^M
/22: lwp_cond_wait(0x101585840, 0x101585828, 0xFFFFFFFE250FE960, 0) Err#62 ETIME^M
/63: pollsys(0xFFFFFFFE135FE458, 1, 0xFFFFFFFE135FE380, 0x00000000) = 0^M
/63: fd=46 ev=POLLIN rev=0^M
/63: timeout: 0.100000000 sec^M
Ему также предшествует / следует:
lwp_mutex_timedlock(0xFFFFFFFF7EAF2AE0, 0x00000000) = 0^M
/62: pollsys(0xFFFFFFFE137FE4D8, 1, 0xFFFFFFFE137FE400, 0x00000000) = 0^M
/62: fd=32 ev=POLLIN rev=0^M
/62: timeout: 0.100000000 sec^M
/63: lwp_mutex_wakeup(0xFFFFFFFF7EAF2AE0, 0) = 0^M
/51: pollsys(0x00000000, 0, 0xFFFFFFFE14DFEEC0, 0x00000000) = 0^M
/51: timeout: 0.010000000 sec^M
/37: lwp_mutex_timedlock(0xFFFFFFFF7EAF2AE0, 0x00000000) = 0^M
/37: lwp_mutex_wakeup(0xFFFFFFFF7EAF2AE0, 0) = 0^M
/61: lwp_mutex_timedlock(0xFFFFFFFF7EAF2AE0, 0x00000000) = 0^M
Знаем ли мы, что это может значить? В любом случае, чтобы узнать об этом подробнее? Я читал мы можем бежать dtrace
, но есть ли еще какая-нибудь утилита, которую мы можем запустить, чтобы понять, где происходит медлительность. Приложению требуется много времени для выполнения базовых запросов, что намного удобнее на сервере Windows.
Вы смотрите на JVM, управляющую мьютексами (блокировками). Ожидание блокировки может заставить поток сидеть без дела, не используя много процессорного времени, но не делая никакого прогресса (!)
--дэйв
Лучше всего использовать отладчик Java и посмотреть, что делают потоки JVM. По трассировке системных вызовов действительно сложно сказать, что происходит.