Отладка тайм-аутов соединения с использованием strace?
Я пытаюсь выяснить, почему вращается "Затмение", поэтому я решил запустить "Стрейс".
Я нашел процесс затмения, используя:
$ 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 ответа
Некоторые PID не указаны в списке, потому что они принадлежат потокам. htop
может показать их, если вы нажмете Shift + H (и необязательно T для просмотра в виде дерева), но lsof
хочет PID основного процесса. (Во всяком случае, все pthreads в процессе совместно используют файловые дескрипторы.) Вы также можете посмотреть в /proc/5546/fd/
а также /proc/5546/task/
,
EAGAIN является нормальным для неблокирующего ввода / вывода; например, он возвращается read()
когда нет данных для чтения. Смотрите "ОШИБКИ" в read (2), write (2) и так далее. Некоторые из этих fd, скорее всего, являются соединениями с сервером X11 - неблокирующие операции ввода-вывода используются клиентскими библиотеками X11.
Третий параметр futex(2)
не обязательно идентификатор процесса, руководство говорит, что это futex(uaddr, op, val, timeout, ...)
и что если оп FUTEX_WAIT
, он "атомарно проверяет, что адрес futex uaddr по- прежнему содержит значение val, и спит в ожидании FUTEX_WAKE для этого адреса futex. [Когда] время ожидания равно NULL, вызов блокируется на неопределенный срок".
В вашем случае это звучит так, как будто процесс 5546 сидел там в ожидании чего-то - предположительно его потока 5547 или чего-то связанного, но мы не можем точно знать, что точно, основываясь только на этом - записать это число в указанную память адрес.
Обратите внимание, что вы можете видеть темы, используя ps -eLf
или похожие.