5

Я пытаюсь выяснить, почему вращается «Затмение», поэтому я решил запустить «Стрейс».

Я нашел процесс затмения, используя:

$ ps ax | grep java
 5546 ?        Sl    19:04 /usr/bin/java ... [arguments omitted]

strace для этого процесса, я вижу, что он ожидает другого процесса:

$ sudo strace -p 5546
Process 5546 attached - interrupt to quit
futex(0x7f6c416679d0, FUTEX_WAIT, 5547, NULL^C <unfinished ...>
Process 5546 detached

Интересно, что процесс 5547 не отображается в ps (кто-нибудь может сказать мне, почему?), Но я могу это strace . Он многократно выплевывает множество ошибок EAGAIN (со случайным успехом)

read(16, 0x7f6c41664d10, 16)            = -1 EAGAIN (Resource temporarily unavailable)
recvfrom(15, 0x7f6c3815f2e4, 4096, 0, 0, 0) = -1 EAGAIN (Resource temporarily unavailable)
clock_gettime(CLOCK_MONOTONIC, {67410, 357843264}) = 0
poll([{fd=16, events=POLLIN}, {fd=15, events=POLLIN}, {fd=68, events=POLLIN}, {fd=128, events=POLLIN}, {fd=69, events=POLLIN}], 5, 0) = 0 (Timeout)
read(16, 0x7f6c41664cb0, 16)            = -1 EAGAIN (Resource temporarily unavailable)
recvfrom(15, 0x7f6c3815f2e4, 4096, 0, 0, 0) = -1 EAGAIN (Resource temporarily unavailable)
...

Судя по выводу, похоже, что он опрашивает файловые дескрипторы 16, 15, 68, 128 и 69. В частности, ошибки EAGAIN исходят от 15 и 6 fds, как видно из вызовов read(2) и recvfrom(2) .

Как я могу найти больше информации об этих FDS? Я попытался lsof -p 5547 но вывод не выводится. Я подозреваю, что это сокеты, которые открыты для какого-то веб-сайта, но почему он вращается в тесной петле с EAGAIN озадачивает ...

2 ответа2

2

Некоторые PID не указаны в списке, потому что они принадлежат потокам. htop может показать их, если вы нажмете Shift+H (и, необязательно, T для просмотра в виде дерева), но lsof хочет PID основного процесса. (Все равно pthreads в процессе совместно используют файловые дескрипторы.) Вы также можете посмотреть в /proc/5546/fd/ и /proc/5546/task/ .

EAGAIN является нормальным для неблокирующего ввода / вывода; например, он возвращается read() когда нет данных для чтения. Смотрите "ОШИБКИ" в read(2), write(2) и так далее. Некоторые из этих fd, скорее всего, являются соединениями с сервером X11 - неблокирующие операции ввода-вывода используются клиентскими библиотеками X11.

2

Третий параметр futex(2) не обязательно является идентификатором процесса, в руководстве говорится, что это futex(uaddr, op, val, timeout, ...) , и что если op равен FUTEX_WAIT , он «атомно проверяет, что адрес futex uaddr по-прежнему содержит значение val и ожидает FUTEX_WAKE по этому адресу фьютекса. [Когда] время ожидания равно NULL, вызов блокируется на неопределенный срок. "

В вашем случае это звучит так, как будто процесс 5546 сидел там в ожидании чего-то - предположительно, его потока 5547 или чего-то связанного, но мы не можем точно знать, что точно, основываясь только на этом - записать это число в указанную память адрес.

Также обратите внимание, что вы можете видеть потоки, используя ps -eLf или подобное.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .